ich habe gestern lange an einem blöden Fehler gehangen: ich habe ein
funktionierendes Programm erweitert, Compiler hat alles ok gemeldet aber
ich habe das binary zum verrecken nicht geladen bekommen. Mit LPCLink2,
Black Magic Probe oder seriell mit FlashMagic - alle melden nur etwas
wie 'Load failed' oder andere kryptische Meldungen die mich vermuten
liessen das etwas mit dem Debugger nicht stimmt.
Dann fiel mir endlich auf das das binary zu gross war, BMP sagte etwas
von size 0x40DC und das ist >0x4000 Flash die ich im µC habe. Warum
melden die Tools das nicht im Klartext? Auch beim Linker mit der 97 %
Angabe hatte ich erst nicht an einen overflow gedacht, flash + data ist
> 100%, das müsste der Linker doch anmeckern?
Ich habe jetzt die letzte Zeile in das Linkescript eingebaut, damit
bekomme ich die gewünschte Fehlermeldung. Linkersprache ist nicht ganz
meine Welt, habe ich das richtig gemacht?
das hier war der Ouput vor der text+data size Überprüfung:
1 | Invoking: MCU C++ Linker |
2 | arm-none-eabi-c++ -L"C:\Users\sn\Documents\lpcxpresso_LPC800\RFM69-LPC812-Node\src\mbed\TARGET_LPC812\TOOLCHAIN_GCC_ARM" -Wl,--gc-sections --specs=nano.specs -specs=nosys.specs -Wl,--wrap,main -Xlinker -Map="RFM69-LPC812-Node.map" -Xlinker -zmuldefs -Xlinker --gc-sections -Xlinker -print-memory-usage -flto -Os -mcpu=cortex-m0plus -mthumb -T LPC812.ld -o "RFM69-LPC812-Node.axf" ./src/ACMP.o ./src/Json.o ./src/RCObject.o ./src/RFM69.o ./src/Relay.o ./src/WakeUp_LPC812.o ./src/fs20.o ./src/i2c.o ./src/jsmn.o ./src/main.o ./src/queue.o ./src/rfm12.o ./src/sht15.o C:/Users/sn/Documents/lpcxpresso_LPC800/RFM69-LPC812-Node/src/mbed/TARGET_LPC812/TOOLCHAIN_GCC_ARM/board.o C:/Users/sn/Documents/lpcxpresso_LPC800/RFM69-LPC812-Node/src/mbed/TARGET_LPC812/TOOLCHAIN_GCC_ARM/cmsis_nvic.o C:/Users/sn/Documents/lpcxpresso_LPC800/RFM69-LPC812-Node/src/mbed/TARGET_LPC812/TOOLCHAIN_GCC_ARM/retarget.o C:/Users/sn/Documents/lpcxpresso_LPC800/RFM69-LPC812-Node/src/mbed/TARGET_LPC812/TOOLCHAIN_GCC_ARM/startup_LPC81X.o C:/Users/sn/Documents/lpcxpresso_LPC800/RFM69-LPC812-Node/src/mbed/TARGET_LPC812/TOOLCHAIN_GCC_ARM/system_LPC8xx.o -lmbed |
3 | Memory region Used Size Region Size %age Used |
4 | FLASH: 16020 B 16 KB 97.78% |
5 | RAM: 1256 B 3904 B 32.17% |
6 | Finished building target: RFM69-LPC812-Node.axf |
7 | |
8 | make --no-print-directory post-build |
9 | Performing post-build steps |
10 | arm-none-eabi-size "RFM69-LPC812-Node.axf" ; arm-none-eabi-objcopy -v -O binary "RFM69-LPC812-Node.axf" "RFM69-LPC812-Node.bin" ; arm-none-eabi-objcopy -O ihex "RFM69-LPC812-Node.axf" "RFM69-LPC812-Node.hex." ; checksum -p LPC812 -d "RFM69-LPC812-Node.bin" |
11 | text data bss dec hex filename |
12 | 16020 560 696 17276 437c RFM69-LPC812-Node.axf |
13 | copy from `RFM69-LPC812-Node.axf' [elf32-littlearm] to `RFM69-LPC812-Node.bin' [binary] |
14 | Written checksum 0xefffc39b at offset 0x1c in file RFM69-LPC812-Node.bin |
15 | Previous value 0x00000000 at offset 0x1c in file RFM69-LPC812-Node.bin |
das habe ich dem Linkerscript anghängt:
1 | /* Check if text + data exceeds Flash limit */ |
2 | /*ASSERT((SIZEOF(.text) + SIZEOF(.data)) <= LENGTH(FLASH), "region text overflowed")*/ |