Ich versuche, Zeichenfolge durch einen UART0 von Beaglebone Black zu drucken. Der Bootloader initialisiert UART0 und ich muss nur Zeichen schreiben. Ich habe eine einfache Funktion gemacht
%Vor%Aus dem Startup-Code wird die folgende Funktion aufgerufen Ich drucke einfach Zeichen in dieser Funktion.
%Vor%Die Funktion funktioniert einwandfrei, da das Array von Zeichen und Ganzzahlen korrekt gedruckt wird, die Zeichenfolge jedoch nicht so gedruckt wird, wie es sein sollte.
Ändern Sie im Linkerscript:
%Vor%zu:
%Vor% In der Speicherzuordnung für den ARM-Prozessor AM335X ist 0x402F0400
der Kern-SRAM, während 0x8000000
ist der DDR2-Speicher. Nach dem Screenshot der TFTP-Boot-Ausgabe laden Sie Ihre Anwendung unter 0x80000000
, aber Ihr Linker-Skript ist so konfiguriert, dass es auf den Speicher bei 0x402F04000
verweist.
Das Zerlegen der rohen Binärdatei download.bin
, die mit dem ursprünglichen Linker-Skript erstellt wurde, ergibt:
Die Zeichenfolge wird aus dem Speicher in die lokale Variable kopiert. Beachten Sie, dass die Adresse für die Kopie der Zeichenfolge 0x402f062c
ist (die Befehle movw
und movt
laden die Adresse in das Register). Ein schneller Scan des ausgelassenen Codes zeigt keine weiteren Versuche auf Speicher zuzugreifen.
Ich habe keinen Zugang zu einem Beaglebone Black, also kann ich das nicht testen. Es erklärt das beobachtete Verhalten. Da das Programm die Zeichenfolge aus nicht initialisiertem SRAM kopiert, gibt es keine Garantie dafür, was angezeigt wird. Da es keinen anderen Versuch gibt, auf Speicher innerhalb des Programms zuzugreifen, ist dies das einzige Problem.
Das Ändern des Linker-Skripts und des Neugenerierens führt zu einem etwas anderen download.bin
. Ein Unterschied zwischen dem disassemblierten download.bin
, das vom ursprünglichen Linker-Skript erzeugt wurde, und meiner vorgeschlagenen Änderung ist:
Sie können die neue Adressreferenz zum Kopieren der Zeichenfolge deutlich sehen. Leider bin ich nicht sicher, was die andere Änderung ist und ob diese Änderung irgendwelche Probleme verursachen wird.
Nur um zu überprüfen, ob die Zeichenfolge 0x8000022c ist, können wir xxd verwenden, um download.bin
abzulegen. Die Ausgabe ist:
Die Zeichenfolge Hello
ist bei 0x22c
sichtbar. Beim Laden von 0x80000000
scheint die Adresse, an der die Zeichenfolge kopiert wird, korrekt zu sein.
Tags und Links c arrays embedded arm beagleboneblack