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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Johannes S. (jojos)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht 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")*/

: Bearbeitet durch User
von Markus F. (mfro)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (jojos)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.