Forum: Compiler & IDEs warum mecket der gcc nicht wenn der Flash überfüllt wird?


von Johannes S. (Gast)


Angehängte Dateien:

Lesenswert?

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")*/

von Markus F. (mfro)


Lesenswert?

Johannes S. schrieb:
> /* Check if text + data exceeds Flash limit */
>     /*ASSERT((SIZEOF(.text) + SIZEOF(.data)) <= LENGTH(FLASH), "region
> text overflowed")*/

wenn Du das - wie gezeigt - in Kommentarzeichen hast, ist es nutzlos.

von Ivo -. (Gast)


Lesenswert?

Hallo,
zu deinem Fall kann ich zwar nichts sagen, mir ist es aber auch schon 
aufgefallen, letztens hatte ich ausversehen eine endlose Rekursion, auch 
mit allen Warnflags hat mir der Compiler keine Warnung ausgegeben, ich 
hatte sogar einen Thread gestartet, da ich mit der Fehlermeldung nichts 
anfangen konnte, das Suchen des Fehlers, also wo er genau liegt, hat 
mich eine geschlagene halbe Stunde Debugging gekostet, Compiler sind 
inzwischen doch so leistungsfähig, warum zeigen sie sowas nicht an, das 
ist schon eine berechtigte Frage.

Gruß Ivo

von Johannes S. (Gast)


Lesenswert?

Markus F. schrieb:
> Johannes S. schrieb:
>> /* Check if text + data exceeds Flash limit */
>>     /*ASSERT((SIZEOF(.text) + SIZEOF(.data)) <= LENGTH(FLASH), "region
>> text overflowed")*/
>
> wenn Du das - wie gezeigt - in Kommentarzeichen hast, ist es nutzlos.

klar, die waren jetzt vom Gegentest noch drin, mit ohne Kommentar siehts 
so aus:
1
Building target: RFM69-LPC812-Node.axf
2
Invoking: MCU C++ Linker
3
arm-none-eabi-c++ -L .... (entfernt) ...
4
5
Memory region         Used Size  Region Size  %age Used
6
           FLASH:       16004 B        16 KB     97.68%
7
c:/nxp/mcuxpressoide_10.1.0_589/ide/tools/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/bin/ld.exe: region text overflowed
8
collect2.exe: error: ld returned 1 exit status
9
             RAM:        1256 B       3904 B     32.17%
10
make: *** [RFM69-LPC812-Node.axf] Error 1

von Dr. Sommer (Gast)


Lesenswert?

Vermutlich wegen dem "AT":
1
  .data : AT (__etext)
2
    {
3
 ...
4
    } > RAM
Normalerweise™ macht man das so:
1
  .data : {
2
    ...
3
  } >SRAM AT> FLASH
Dann ist auch das ASSERT unnötig und der Linker berechnet und prüft das 
selbst. Man kann den Stack/Heap auch noch als eigene Sections definieren 
und sich das zweite Assert auch sparen. Ich finde es eleganter solche 
Prüfungen den Linker automatisch machen zu lassen.

von Johannes S. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Vermutlich wegen dem "AT":  .data : AT (__etext)
>     {
>  ...
>     } > RAMNormalerweise™ macht man das so:  .data : {

Top, das geht, so kannte ich die Ausgabe eigentlich:
1
Memory region         Used Size  Region Size  %age Used
2
           FLASH:       16436 B        16 KB    100.32%
3
c:/nxp/mcuxpressoide_10.1.0_589/ide/tools/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/bin/ld.exe: RFM69-LPC812-Node.axf section `.data' will not fit in region `FLASH'
4
             RAM:        1220 B       3904 B     31.25%
5
c:/nxp/mcuxpressoide_10.1.0_589/ide/tools/bin/../lib/gcc/arm-none-eabi/6.3.1/../../../../arm-none-eabi/bin/ld.exe: region `FLASH' overflowed by 52 bytes
6
collect2.exe: error: ld returned 1 exit status
7
make: *** [RFM69-LPC812-Node.axf] Error 1

Das Linkerscript liefert mbed, habe aber gerade nochmal nachgesehen, es 
entspricht dem template das der gcc in 
share\gcc-arm-none-eabi\samples\ldscripts\gcc.ld mitbringt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.