Hallo zusammen
ich weiss der Thread ist schon einige Monate alt, aber da er genau das
Thema behandelt, das mich beschäftigt, wollte ich nicht extra einen
neuen aufmachen.
Also ich will ebenfalls beim Compilieren ganz am Ende des Codes einen
CRC16 einfügen. Ich benutze die GNU ARM Toolchain von Yagarto.
Ich führe zuerst arm-elf-gcc aus und lasse alles kompilieren und linken.
Ein kleines Tool, das den CRC berechnet habe ich bereits geschrieben und
wollte dann im Makefile mit --defsym (wie oben empfohlen) den
berechneten CRC-Wert des vorher generierten BIN-Files nochmals an den
Linker übergeben. Doch irgendwie wird der CRC-Wert von meinem
Linker-Script nicht angenommen bzw nicht richtig
interpretiert/verwendet. Irgendwie habe ich das Gefühl, dass ich die
--defsym Option falsch verstanden habe.
Die ensprechende Zeile in meinem Makefile sieht folgendermassen aus:
1 | arm-elf-gcc $(LDFLAGS) -Xlinker --defsym -Xlinker CRC16=0x$(shell crc16 $(OUTFILE).bin) -n -o $(OUTFILE).elf $(OBJECTS)
|
2 | arm-elf-objcopy --strip-debug --strip-unneeded $(OUTFILE).elf -O binary $(OUTFILE).bin
|
(Zwischenfrage: Wird bei solch einem Aufruf nochmals alles neu
kompiliert oder direkt der Linker aufgerufen?)
Im Linker-Script sieht es folgendermassen aus (nur der relevante Teil):
1 | ...
|
2 | __CRC_START__ = 0x03FFFE; /* 2 Bytes for Flash-Ende */
|
3 | PROVIDE(CRC16 = 0x0000)
|
4 |
|
5 | SECTIONS
|
6 | {
|
7 | ...
|
8 |
|
9 | crc : AT( __CRC_START__)
|
10 | {
|
11 | SHORT(CRC16);
|
12 | } = 0xFFFFFFFF
|
13 |
|
14 | ...
|
15 | }
|
Komischerweise steht im MAP File dann folgendes:
1 | crc 0x0020adfc 0x2 load address 0x0003fffe
|
2 | 0x0020adfc 0x2 SHORT 0x0 CRC16
|
3 | 0x0020adfe PROVIDE (end, .)
|
4 | 0x0000d8ca CRC16 = 0xd8ca
|
Also irgendwie kriegt er den Wert zwar, aber er interpretiert ihn direkt
als Adresse und nicht irgendwie als Variable.
Ich wäre sehr froh, wenn mich jemand aufklären könnte, ob ich das
Konzept mit --defsym komplett falsch verstanden habe oder ob ich einfach
sonst einen Newbie-Fehler gemacht habe.
Danke!
Mit freundlichen Grüssen
Siddhartha