Hallo zusammen
ich kämpfe gerade bissl mit dem arm-elf-ld rum und krieg das
Linker-Script einfach nicht so hin, wie ich gerne will.
Grundsätzlich geht es darum, dass ich meinen Code (für einen
AT91SAM7S256) so kompilieren/linken will, dass das daraus entstehende
Binary immer die gleiche Grösse hat, nämlich die Grösse vom internen
Flash (256 kB). Zudem sollen die letzten Bytes mit dem CRC16-Wert der
restlichen Bytes gefüllt werden. Die Berechnung des CRC16 wird dabei mit
einem kleinen Konsolen-Tool gemacht. Nun habe ich dabei aber mehrere
Probleme, die ich entweder nicht richtig verstehe oder mich einfach noch
zu wenig mit Linker-Scripts auskenne :-(
Also zuerst einmal wollte ich das mit dem CRC-Wert so machen:
- Alles kompilieren, linken und mit objcopy ein Binary erstellen
(dabei werden die Bytes, die für den CRC16 gebraucht werden, mit 0
gefüllt)
- CRC16-Tool laufen lassen und so den CRC Wert bestimmen
- Linker-Script nochmals anwerfen und über --defsym CRC16=0xXXXX den
berechneten Wert übergeben und vom Linker-Script ganz am Ende einfügen
lassen.
Der relevante Teil meines Linker-Scripts sieht deshalb folgendermassen
aus:
1 | __CRC_START__ = 0x03FFFE;
|
2 | PROVIDE(CRC16 = 0x0000);
|
3 |
|
4 | crc : AT ( __CRC_START__ )
|
5 | {
|
6 | SHORT(CRC16);
|
7 | }
|
Aber irgendwie wird immer 0x0000 eingefügt und nicht der berechnete
CRC16-Wert. Wenn ich mir im Map-File den "Speicher-Aufbau" anschaue,
erscheint ganz am schluss (nach der crc-section) ein Eintrag zur Adresse
mit dem Wert des berechneten CRC16-Werts mit dem entsprechenden Wert.
Was mache ich dabei falsch? Oder ist --defsym dafür gar nicht geeignet?
Mein zweites Problem ist, dass ich alles, was nicht mit Code oder
nutzbaren Daten gefüllt ist, mit 0xFFFFFFFF (was ja der Grundzustand
eines Flash-Speichers ist) füllen will, damit es da keine Probleme mit
der CRC-Überprüfung gibt. Dafür gibt es ja das FILL-Kommando oder die
=fillexp-Angabe bei Sections.
Komischerweise ist es jetzt jedoch so, dass im erstellten Binary zwar an
den entsprechenden Stellen der korrekte Füllwert steht (wobei .data und
.bss sections mit 0 und nicht mit 1 gefüllt werden wegen RAM). Wenn ich
das Binary dann aber über JTAG ins interne Flash des AT91SAM7S256 lade,
dann steht an den Adressen, wo die .data und .bss sections sind, überall
1 und nicht 0 und an den Stellen, die ich extra manuell mit 1 gefüllt
habe, steht teilweise irgendwelcher Code.
Habe ich in dem Vorgehen irgendeinen Denkfehler? Warum wird das Binary
nicht genau so ins interne Flash geschrieben, wie ich es erstellt habe?
Danke für eure Hilfe!
PS: Ich weiss dass es bissl viel auf einmal ist, sorry.