Forum: Compiler & IDEs Beispiel IO_Toggle von ST für STM32F4Discovery compilieren


von M. K. (avr-frickler) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi,
ich bin dabei ein Beispiel-Projekt für den Artikel STM32F4-Discovery 
zu kompilieren.

Als Beispiel verwende ich das Beispiel IO_Toggle aus der 
StdPeriph-Bibliothek von ST. Die Toolchain ist so installiert wie im 
Artikel beschrieben.

Das Project in Eclipse ist ähnlich angelegt wie auf 
https://sites.google.com/site/stm32discovery/open-source-development-with-the-stm32-discovery/setting-up-eclipse-for-stm32-discovery-development 
beschrieben ist, mit dem Unterschied das sich die Verzeichnisse für die 
StdPeriph der STM32F4-Reihe geändert haben.

Ich habe das ganze nun soweit hinbekommen das ich nur noch 4 
Linker-Fehler bekomme.
1
undefined reference to `_init'  IO_Toggle
2
undefined reference to `Codec_TIMEOUT_UserCallback'
3
undefined reference to `EVAL_AUDIO_TransferComplete_CallBack'
4
undefined reference to `sEE_TIMEOUT_UserCallback'

Als Linkerscript verwende ich:
1
STM32F4xx StdPeriphLib V1.0.0/Project/STM32F4xx_StdPeriph_Templates/TrueSTUDIO/STM324xG_EVAL/stm32_flash.ld

Der Startup-Code ist zu finden unter:
1
STM32F4xx StdPeriphLib V1.0.0/Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/TrueSTUDIO/startup_stm32f4xx.s (umbenannt nach startup_stm32f4xx.S)

Aufruf des Compilers zum linken des Projekts:
1
arm-none-eabi-gcc -T"/home/user/eclipse/STM32/workspace/IO_Toggle/startup_src/stm32_flash.ld" -nostartfiles -Wl,-Map,IO_Toggle.map -mcpu=cortex-m3 -mthumb -g3 -gdwarf-2 -o "IO_Toggle.elf"  ./startup_src/startup_stm32f4xx.o  ./src/main.o ./src/stm32f4xx_it.o ./src/system_stm32f4xx.o  ./StdPeriph/misc.o ./StdPeriph/stm32f4xx_adc.o ./StdPeriph/stm32f4xx_can.o ./StdPeriph/stm32f4xx_crc.o ./StdPeriph/stm32f4xx_cryp.o ./StdPeriph/stm32f4xx_cryp_aes.o ./StdPeriph/stm32f4xx_cryp_des.o ./StdPeriph/stm32f4xx_cryp_tdes.o ./StdPeriph/stm32f4xx_dac.o ./StdPeriph/stm32f4xx_dbgmcu.o ./StdPeriph/stm32f4xx_dcmi.o ./StdPeriph/stm32f4xx_dma.o ./StdPeriph/stm32f4xx_exti.o ./StdPeriph/stm32f4xx_flash.o ./StdPeriph/stm32f4xx_fsmc.o ./StdPeriph/stm32f4xx_gpio.o ./StdPeriph/stm32f4xx_hash.o ./StdPeriph/stm32f4xx_hash_md5.o ./StdPeriph/stm32f4xx_hash_sha1.o ./StdPeriph/stm32f4xx_i2c.o ./StdPeriph/stm32f4xx_iwdg.o ./StdPeriph/stm32f4xx_pwr.o ./StdPeriph/stm32f4xx_rcc.o ./StdPeriph/stm32f4xx_rng.o ./StdPeriph/stm32f4xx_rtc.o ./StdPeriph/stm32f4xx_sdio.o ./StdPeriph/stm32f4xx_spi.o ./StdPeriph/stm32f4xx_syscfg.o ./StdPeriph/stm32f4xx_tim.o ./StdPeriph/stm32f4xx_usart.o ./StdPeriph/stm32f4xx_wwdg.o  ./STM32_EVAL/stm324xg_eval.o ./STM32_EVAL/stm324xg_eval_audio_codec.o ./STM32_EVAL/stm324xg_eval_fsmc_sram.o ./STM32_EVAL/stm324xg_eval_i2c_ee.o ./STM32_EVAL/stm324xg_eval_ioe.o ./STM32_EVAL/stm324xg_eval_lcd.o ./STM32_EVAL/stm324xg_eval_sdio_sd.o

Hier komme ich im Moment einfach nicht weiter, ich hoffe einer von euch 
kann mir weiter helfen.
Im Anhang findet ihr das Eclipse-Projekt, Makefile und die komplette 
Fehlerausgabe.

Gruß
Marco

PS.: Mir ist klar dass das erzeugt Kompilat nicht unbedingt für das 
STM32F4-Descovery geeignet ist.

von Noname (Gast)


Lesenswert?

Hm. Ich verwende IAR Workbench und kann Dir also bei den Link-Files und 
Project-Files nicht im Detail weiterhelfen.

Ich weiss nicht ob ich Dich da richtig verstehe. Aber wenn ich das hier:

>mit dem Unterschied das sich die Verzeichnisse für die StdPeriph der 
>STM32F4-Reihe geändert haben.

wortwörtlich nehme, sich Deine Anpassungen ggü. der Beschreibung in dem 
Link auf eben den neuen Pfad beschränken, dann hast Du ein Template 
Projekt für das Discovery kopiert und angepasst.
Falls das so ist würde ich Dir empfehlen, den selben Ablauf aber eben 
mit einem Template-Projekt für den STM32F4, den das Discovery hat den 
STM32F1 drauf. Das würde zumindest ansatzweise die fehlenden Funktionen 
erklären.


Die undefined references deuten letztlich darauf hin, dass Du in Deinem 
Project irgendwo noch diese Funktionen aufrufst, wobei sie nicht 
definiert sind.
Alternativ wäre der erste Schritt also, diese Namen in Deinem Project zu 
suchen und entweder den Aufruf oder sogar die gesamte Datei aus dem 
Projekt zu entfernen.

Dem Namen nach wirst Du zumindest _init noch brauchen. Aber das sehen 
wir dann, würde ich vorschlagen.

von Noname (Gast)


Lesenswert?

>denn das Discovery hat den STM32F1 drauf

Hm. Da hab ich mich falsch ausgedrückt. Es gibt natürlich auch ein F4 
Discovery. Aber in der von Dir verlinkten Anleitung wird das F1 
Discovery bzw. desssen Template Projekt verwiesen. Vermutlich hast Du 
das dann eben schon mit dem F4 Template Projekt gemacht.

Aber das kann ich ja nicht wirklich wissen, wenn Du es nicht 
ausdrücklich sagst. Und ich weiss auch nicht wieviel Erfahrung Du hast, 
ob sie insbesondere ausreicht zumindest auf den Gedanken zu kommen.

Also, nichts für ungut, falls ich da offene Türen eingerannt habe.

:-)

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Noname schrieb:
> Ich verwende IAR Workbench...

Schöne heile Windows-Welt :P

Noname schrieb:
> Hm. Da hab ich mich falsch ausgedrückt. Es gibt natürlich auch ein F4
> Discovery. Aber in der von Dir verlinkten Anleitung wird das F1
> Discovery bzw. desssen Template Projekt verwiesen. Vermutlich hast Du
> das dann eben schon mit dem F4 Template Projekt gemacht.

Das meinte ich mit anpassen der Verzeichnisse fürs STM32F4, weil die 
verlinkte Seite halt ein STM32F1 verwendet. Hätte ich deutlicher 
schreiben sollen.

von Noname (Gast)


Lesenswert?

>Schöne heile Windows-Welt :P

Naja. Was tut man nicht alles fürs tägliche Brot. :-) Wenn es denn die 
AG so haben wollen. Hab mich so ans Essen gewöhnt... ;-)
Bin auch eher ein Linux Fan. Aber das nur nebenbei.


Also Du hast schon das STM32F4 Template benutzt.
Dann musst Du halt doch mal schauen wo genau und in welchem Kontext die 
fehlenden Funktionen aufgerufen werden.

Benutzt Du eigentlich ein eigenes Board oder das STM32F4 Discovery?

Es wird vermutlich auf irgendwelche fehlenden oder falschen Defines in 
den Template-Dateien hinauslaufen. Ich würde erstmal darauf schauen, von 
welchen defines der Aufruf der Funktionen abhängig ist.
Die Periphery Library und die Templates sind voll von defines die 
eigentlich spezifisch für das Evaluation Board sind und nicht 
verallgemeinerbar.

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Noname schrieb:
> Benutzt Du eigentlich ein eigenes Board oder das STM32F4 Discovery?
Ja ich habe hier ein STM32F4-Discovery hier.

Noname schrieb:
> Die Periphery Library und die Templates sind voll von defines die
> eigentlich spezifisch für das Evaluation Board sind und nicht
> verallgemeinerbar.
Ziemlich ungeschickt für eine allgemeine Bibliothek. :/

Noname schrieb:
> Es wird vermutlich auf irgendwelche fehlenden oder falschen Defines in
> den Template-Dateien hinauslaufen. Ich würde erstmal darauf schauen, von
> welchen defines der Aufruf der Funktionen abhängig ist.
Die Fehler sind alle in den Quelltext-Dateien aus dem Ordner _STM32F4xx 
StdPeriphLib V1.0.0/Utilities/STM32_EVAL/STM3240_41_G_EVAL_.
Die c-Dateien habe ich mal rausgeschmissen, die Header-Datein aber 
drinnen gelassen. Denn in der main.c von IO_Toggle wird die Datei 
stm324xg_eval.h eingebunden die in diesem Ordner drinnen ist.

Jetzt habe ich nur noch einen Fehler:
undefined reference to `_init'  IO_Toggle

Schaut man sich die Ausgabe des Compilers an stolpert man über fplgende 
Aufruf:
1
arm-none-eabi-gcc -DUSE_STDPERIPH_DRIVER -DUSE_STM32_DISCOVERY -I"/home/user/eclipse/STM32/STM32F4xx StdPeriphLib V1.0.0/Libraries/CMSIS/Include" -I"/home/user/eclipse/STM32/STM32F4xx StdPeriphLib V1.0.0/Libraries/CMSIS/Device/ST/STM32F4xx/Include" -I"/home/user/eclipse/STM32/STM32F4xx StdPeriphLib V1.0.0/Libraries/STM32F4xx_StdPeriph_Driver/inc" -I"/home/user/eclipse/STM32/workspace/IO_Toggle/src" -I"/home/user/eclipse/STM32/STM32F4xx StdPeriphLib V1.0.0/Utilities/STM32_EVAL/Common" -O0 -Wall -Wa,-adhlns="StdPeriph/stm32f4xx_cryp_tdes.o.lst" -c -fmessage-length=0 -MMD -MP -MF"StdPeriph/stm32f4xx_cryp_tdes.d" -MT"StdPeriph/stm32f4xx_cryp_tdes.d" -mcpu=cortex-m3 -mthumb -g3 -gdwarf-2 -o "StdPeriph/stm32f4xx_cryp_tdes.o" "/home/user/eclipse/STM32/STM32F4xx StdPeriphLib V1.0.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp_tdes.c"
2
/opt/CodeSourcery/arm-2011.09/bin/../lib/gcc/arm-none-eabi/4.6.1/../../../../arm-none-eabi/lib/thumb2/libc.a(lib_a-init.o): In function `__libc_init_array':
3
Finished building: /home/user/eclipse/STM32/STM32F4xx StdPeriphLib V1.0.0/Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp_tdes.c
4
init.c:(.text+0x38): undefined reference to `_init'

Verstehe ich das richtig das der Fehler hier in der Bibliothek libc ist?

von Noname (Gast)


Lesenswert?

>Verstehe ich das richtig das der Fehler hier in der Bibliothek libc ist?
Hm. Aber das taucht noch nach dem ende des linkens auf. Nach der Nennung 
von stm32f4xx_cryp_tdes.c

Warum wird da eigentlich mit stm32f4xx_cryp_tdes.c gelinkt?
Du willst doch nur nen Pin toggeln?
Evtl. erledigt sich das, wenn Du das cryp_tdes modul aus dem Projekt 
nimmst.

von hp-freund (Gast)


Lesenswert?


von Noname (Gast)


Lesenswert?

Ich habe mal in der Library und in den Codebeispielen gesucht.
Dort wird das _init weder referenziert noch definiert.
Kommt also vermutlich wirklich aus der libc.
Könnte sein, das Du den startup code noch um den für die libc 
notwendigen ergänzen musst.

Hast Du das Problem mit der Dateiendung von Assemblerdateien 
berücksichtigt und kontrolliert?

Ich sehe auch nicht das in der Anleitung ausdrücklich auf die libc 
eingegangen wird. Möglicherweise gibts da noch flaws/issues.

Eine andere Sache die mir noch einfällt, ist, das es da evtl. CMSIS 
Probleme geben könnte. Ich hatte mal das umgekehrte Problem, das IAR 
nicht mehr mit den in der in den STM Libs bereitgestellten CMSIS files 
klarkam. Das war im Oktober/November. Falls sich die Anleitungen und die 
Libs zeitlich stark unterscheiden könnte da was im argen liegen.

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Noname schrieb:
> Warum wird da eigentlich mit stm32f4xx_cryp_tdes.c gelinkt?
> Du willst doch nur nen Pin toggeln?
Ich habe die komplette Bibliothek mit in das Projekt geladen. Welche 
Teile der Bibliothek verwendet werden sollen wird ja in der 
stm32f4xx_conf.h festgelegt. Was aber anscheinend nicht so funktioniert, 
selbst wenn ich nur stm32f4xx_gpio.h aktiviere, nimmt er alles andere 
mit. Was irgendwo auch klar ist, da er ja versucht alle c-Dateien zu 
kompilieren.

Ich habe jetzt mal alles rausgeschmissen bis auf das GPIO-Modul und das 
RCC-Modul welches für IO_Toggle benötigt wird. Problem bleibt bestehen.

Der Fehlertext oben ist glaube ich irreführend, den habe ich aus Eclipse 
kopiert, Eclipse würfelt die Ausgaben aber anscheinend durcheinander.

Hier mal der Fehlertext wie er jetzt ist nur mit make direkt auf der 
Konsole ausgeführt.
1
arm-none-eabi-gcc -T"/home/user/eclipse/STM32/workspace/IO_Toggle/startup_src/stm32_flash.ld" -nostartfiles -Wl,-Map,IO_Toggle.map -mcpu=cortex-m3 -mthumb -g3 -gdwarf-2 -o "IO_Toggle.elf"  ./startup_src/startup_stm32f4xx.o  ./src/main.o ./src/system_stm32f4xx.o  ./StdPeriph/stm32f4xx_gpio.o ./StdPeriph/stm32f4xx_rcc.o   
2
/opt/CodeSourcery/arm-2011.09/bin/../lib/gcc/arm-none-eabi/4.6.1/../../../../arm-none-eabi/lib/thumb2/libc.a(lib_a-init.o): In function `__libc_init_array':
3
init.c:(.text+0x38): undefined reference to `_init'
4
collect2: ld returned 1 exit status

von Noname (Gast)


Lesenswert?

Hmm. Ist das so eine eabi vs. elf Geschichte?

Und guck mal hier: Beitrag "Re: arm-elf-ld Freuden (Linker-Probleme)"

von Noname (Gast)


Lesenswert?

An sich sollte das mit dem ..._conf nicht schaden, da der Linker nicht 
versuchen sollte was zu linken, was nicht aufgerufen wird, denke ich.
Ich selbst verwende allerdings das ..._conf nicht.

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

hp-freund schrieb:
> https://github.com/texane/stlink/tree/081eae3087ac...
>
> von:
>
> https://github.com/texane/stlink
>
> ist ein schöner leichter Startpunkt fur das Board.

Danke habe gerade mal kurz reingeschaut, auf dem ersten Blick schaut es 
genauso aus wie bei mir jetzt auch. Wird also wahrscheinlich auf den 
selben Fehler hinauslaufen.

Noname schrieb:
> Hast Du das Problem mit der Dateiendung von Assemblerdateien
> berücksichtigt und kontrolliert?
Ja habe ich berücksichtigt, wird auch kompiliert die Datei.

*OH MEIN GOTT. Noname du bist der Held des Tages!* vorerst ;-)

Nur um mal den Bug mit der Dateiendung zu verifizieren, habe ich aus dem 
grossen S ein kleines s gemacht. Plötzlich und unerwartet kompiliert der 
durch. Die Assembler-Datei mal gelöscht, kompiliert/linkt immer noch. 
Allerdings ohne startup-code -> Bug existiert also noch.

Nun weiß ich das der Fehler in der Assembler-Datei liegt, das Projekt 
welches hp-freund verlinkt hat, verwendet dieselbe Datei (mit 
.s-endung).

Nun also weiter. Den Startup-Code kann ich sicherlich nicht weglassen, 
zumal ich auch eine Warnung erhalte.
1
warning: cannot find entry symbol Reset_Handler; defaulting to 08000000

Irgendwelche Vorschläge?

von Noname (Gast)


Lesenswert?

>Nur um mal den Bug mit der Dateiendung zu verifizieren, habe ich aus dem
grossen S ein kleines s gemacht. Plötzlich und unerwartet kompiliert der
durch.

Hm. Bin nicht sicher ob ich Dich recht verstehe. Wenn es so geht, warum 
löschst Du dann die Assembler-Datei nur um dann bei

>Die Assembler-Datei mal gelöscht, kompiliert/linkt immer noch.
>Allerdings ohne startup-code -> Bug existiert also noch.

zu landen?

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Ich habe die Datei nur gelöscht um sehen ob das Ergebnis dasselbe ist 
als wenn ich die Endung mit kleinem s habe. Nicht das er die Datei doch 
nimmt.

Dank des Hinweise im Beitrag 
http://www.mikrocontroller.net/topic/goto_post/715100 konnte ich nun das 
Beispiel mit startupcode kompileren, in der Datei gibt es eine Zeile
1
bl __libc_init_array
die ich jetzt einfach mal auskommentiert habe.

Werde das ganze gleich in den Prozessor flashen um zu sehen ob alles 
klappt.

von Noname (Gast)


Lesenswert?

>Ich habe die Datei nur gelöscht um sehen ob das Ergebnis dasselbe ist
>als wenn ich die Endung mit kleinem s habe. Nicht das er die Datei doch
>nimmt.


Hmm. Vielleicht kommen wir ja klar ohne das zu klären.
Aber wenn es nicht funktioniert weil sie ein grosses S hat, dann 
funktioniert es, nach meinem Verständnis, auch nicht, wenn die Datei 
nicht existiert.

Daumen drück.

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Na endlich, es geht .. korrigiere es leuchtet :P

Kurz zur Aufklärung der Geschichte mit der Endung für Assembler-Dateien.

Assembler-Dateien für Eclipse müssen_ mit einem _grossem S enden, 
sonst wird die Datei einfach ignoriert. Also auch nicht dem Compiler 
übergeben.

Wenn die Datei also mit kleinem s endet hat dies denselben Effekt als 
währe sie überhaupt nicht da.

Der Linker-Fehler lag also in der Assembler-Datei mit dem StartUp-Code.

Danke für deine Hilfe Noname, jetzt kann ich in die nächsten Tage den 
Artikel  weiter führen und die gewonnen Erkenntnisse endlich mal 
dokumentieren ;)

von Noname (Gast)


Lesenswert?

>Danke für deine Hilfe Noname

Biddeschön. Gern geschehen.

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.