Wenn ich arm-none-eabi-objcopy -O binary add.elf add.bin
renne, scheint alles in Ordnung zu sein. Aber später, wenn ich es ausführe, ist ls -lh add.bin add.elf
dies 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.bin
die 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.o
die 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).
quelle
arm-none-eabi-size.exe -A -t -x <file>
.du -bh add.bin
?Antworten:
Ich nehme an, das
add.bin
ist eine spärliche Datei.Die meisten Unix-Dateisysteme unterstützen spärliche Dateien (mit nahezu beliebiger Größe). Grundsätzlich können Sie vor dem Schreiben einen beliebigen Versatz anstreben, und die Blöcke, die Sie überspringen, werden nicht tatsächlich der Festplatte zugeordnet. Wenn Sie versuchen, sie zu lesen, sind sie voller Nullen. Wenn Sie ihnen schreiben, entstehen sie auf magische Weise (aber nur die, an die Sie schreiben).
Hier ist ein Beispiel:
Die von mir erstellte Datei enthält einen 4-Kilobyte-Block auf der Festplatte, von dem nur die ersten vier Zeichen verwendet werden. Wenn Sie die Datei jedoch auf normale Weise (von Anfang an nacheinander) lesen, müssen Sie ein Gigabyte Nullen durchlesen, bevor Sie auf die stoßen
foo
.Unter Linux kann
du
normalerweise die tatsächliche Festplattennutzung einer Datei mit geringer Dichte gemeldet werden. Sie können festlegen, dass die "scheinbare Größe" (die denls -l
Berichten ähnlicher ist ) angegeben wird, indem Sie die-b
Option übergeben. Das ist eine Gnu-Erweiterung. Posix mussdu
bei der Berichterstattung über spärliche Dateigrößen nicht genau sein. ("Es liegt an der Implementierung, genau zu definieren, wie genau die Methoden sind.")Vermutlich
arm-none-eabi-objcopy
macht es etwas Ähnliches wie dasdd
obige Beispiel, indem es das ELF-formatierteexe
in ein RAM-Image erweitert und das Bild durch Suchen füllt, anstatt die Datei mit Nullen zu füllen. Dies ist in der Tat der klassische Anwendungsfall für Dateien mit geringer Dichte, die speicherabgebildet werden können (mmap
), ohne dass Kosten für nicht verwendete Blöcke anfallen.quelle