Forum: Mikrocontroller und Digitale Elektronik Problem mit STM32F4 und Codesourcery


von Michael D. (Gast)


Lesenswert?

Hallo zusammen,

ich entwickle unter Linux, Eclipse, Codesourcery - gcc Version 4.6.1, 
gleichzeitig auch unter Atollic Lite gcc 4.5.1 (Windows).

Mit Codesourcery (welches ich bevorzugen würde) habe ich folgende 
Probleme:

* Der Code ist ca. um Faktor 2 größer als unter Atollic (ich vermute 
nicht verwendeter Code wird mitgelinkt)

* Ab einer bestimmten Codegröße / Speichergröße funktioniert dass 
Programm nicht mehr (macht in main Blödsinn oder wirft schon bei der 
Initialisierung einen Hardfault.

Da Startupfile, Linkerscript (habe ich 1:1 von Atollic für den F4xx) und 
Sourcecode unter Atollic und Sourcery exakt der selbe sind und unter 
Atollic alles problemlos läuft vermute ich den Fehler in den Compiler 
und Linkeroptions.

Diese sehen bei mir wie folgt aus:

Assembler:
arm-none-eabi-gcc -x assembler-with-cpp -DSTM32F4 -Wall 
-Wa,-adhlns="$@.lst" -c -fmessage-length=0 -mfpu=fpv4-sp-d16 
-mfloat-abi=softfp -mfix-cortex-m3-ldrd -mcpu=cortex-m4 -mthumb -g 
-gdwarf-2

C:
arm-none-eabi-gcc  -DSTM32F4 -O1 -Wall -Wa,-adhlns="$@.lst" -c 
-fmessage-length=0 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp 
-mfix-cortex-m3-ldrd -mcpu=cortex-m4 -mthumb -g -gdwarf-2

Linker:
arm-none-eabi-gcc -T"stm32_flash.ld" -Wl,-Map,Projekt.map 
-mfpu=fpv4-sp-d16 -mfloat-abi=softfp -mfix-cortex-m3-ldrd 
-mcpu=cortex-m4 -mthumb -g -gdwarf-2

Ich vermute den Fehler in diesen Flags.
Evtl. findet wer einen Fehler oder stellt mir seine (funktionierenden) 
und das Linkerscript zur Verfügung.

Vielen Dank im Voraus,
Michael

von Roland H. (batchman)


Lesenswert?

Keine Ahnung, ob -mfix-cortex-m3-ldrd bei einem Cortex-M4 etwas bringt 
oder eher Schaden anrichtet.

Probier doch mal ohne "-O1".

Wenn schon Cortex-M4, warum dann nicht -mfloat-abi=hard?

Was sagen die Register im Falle des "hard faults"?

Wie sehen die Optionen bei Atollic aus?

Das ist arges Gestochere. Das ganze Projekt mit Makefile, startup, 
linker script und Source in einem .zip wäre eine bessere Basis.

von Jim M. (turboj)


Lesenswert?

> * Der Code ist ca. um Faktor 2 größer als unter Atollic (ich vermute
> nicht verwendeter Code wird mitgelinkt)

Korrekt.
GCC kennt die Optionen:
"-ffuction-sections -fdata-sections"

und mit der Linkeroption "-Wl,--gc-sections" kann man die unbenutzten 
Funktionen (=Sections) rauswerfen. Erfordert etwas Linkerskript Magie, 
wenn scheinbar unbenutzte Sachen drin bleiben sollen (Vectortabelle, 
Deskriptoren, Firmware Marker o.ä).

Außerdem benutzt man "-Os" für minimale Codegröße.

> * Ab einer bestimmten Codegröße / Speichergröße funktioniert dass
> Programm nicht mehr (macht in main Blödsinn oder wirft schon bei der
> Initialisierung einen Hardfault.

Man gebe im Linkerskript die korrekte Größe des RAM an, und reserviere 
optional etwas für den Stack. Schau doch mal ins Map file.

> Keine Ahnung, ob -mfix-cortex-m3-ldrd bei einem Cortex-M4 etwas bringt
> oder eher Schaden anrichtet.

Schaden kann es keinen anrichten. Ich sehe aber nix in den Cortex M4 
Errata, was diese Option erfordern würde. Sie kann also weggelassen 
werden.

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.