Wenn ich arm-none-eabi-objcopy -O binary add.elf add.binrenne, scheint alles in Ordnung zu sein. Aber später, wenn ich es ausführe, ist ls -lh add.bin add.elfdies die Ausgabe, die ich erhalten habe:
-rw-r - r-- 1 David David 2,6G 23. November 22:49 add.bin -rwxr-xr-x 1 david david 65K 23. November 22:40 add.elf
Dies ist eine riesige Datei. Aber wenn ich du -h add.bindie Ausgabe starte, ist:
8,0K add.bin
Was passiert hier?
Edit: Ausgabe von arm-none-eabi -A -t -x add.bin:
Warnung: 'add.bin' konnte nicht gefunden werden. Grund: Wert zu groß für definierten Datentyp
Ausgabe von arm-none-eabi -A -t -x add.elf:
Abschnittsgröße Adr .text 0x2c 0x0 .data 0xc 0xa0000000 .ARM.attributes 0x14 0x0 Insgesamt 0x4c
Ausgabe von du -bh add.bin:
2,6G add.bin
So habe ich es behoben:
Wenn ich das Programm mit dem Befehl verknüpfe, enthält arm-none-eabi-ld -Tld_script.lds -o add.elf add.odie ld-Skriptdatei zunächst Folgendes ld_script.lds:
ABSCHNITTE {
. = 0x00000000;
.text: {
* (.text);
}}
. = 0xA0000000; / * RAM-Startadresse * /
.Daten :{
* (.Daten);
}}
}}
Der obige Code wird von 0x00000000 bis 0xA0000000 mit 0s gefüllt. Dieser Fehler kann folgendermaßen behoben werden:
ABSCHNITTE {
. = 0x00000000;
.text: {
* (.text);
}}
flash_sdata = .; / * Startet die Daten in Flash direkt nach dem Text * /
. = 0xA0000000; / * RAM-Startadresse * /
ram_sdata = .;
/ * AT gibt die Lastadresse an. von .data Abschnitt * /
.data: AT (flash_sdata) {
* (.Daten);
}}
ram_edata = .; / * Adresse des Datenendes im RAM * /
data_size = ram_edata - ram_sdata;
}}
Und dann habe ich in der Quelle ein Stück hinzugefügt, um die Daten von Flash in den RAM zu kopieren. Etwas wie das:
@ Daten in RAM kopieren.
Start:
ldr r0, = flash_sdata
ldr r1, = ram_sdata
ldr r2, = data_size
Kopieren:
ldrb r4, [r0], # 1
strb r4, [r1], # 1
subs r2, r2, # 1
bne Kopie
Wenn mein Englisch nicht zu genau ist, ist dies der Link, der mir hilft, das Problem zu beheben. (Und eine gute Seite zum Erlernen der eingebetteten ARM-Programmierung).
arm-none-eabi-size.exe -A -t -x <file>.
du -bh add.bin?