C-String wird in der Schleife nicht korrekt iteriert

8

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.

    
Uint32 18.11.2016, 15:44
quelle

1 Antwort

7

Ä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:

%Vor%

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:

%Vor%

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:

%Vor%

Die Zeichenfolge Hello ist bei 0x22c sichtbar. Beim Laden von 0x80000000 scheint die Adresse, an der die Zeichenfolge kopiert wird, korrekt zu sein.

    
esorton 30.11.2016, 04:37
quelle