Gast
#1035864
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
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.