Forum: Mikrocontroller und Digitale Elektronik STM32L1 + Makefile. Linkerproblem?


von Andreas B. (bitverdreher)


Angehängte Dateien:

Lesenswert?

Hallo,
ich versuche gerade ein Beispielprogramm (Temperatursensor) von STM auf 
dem STM32L-Discovery zum Laufen zu bringen.
Das Ganze läuft unter Linux Mint14. Die Toolchain habe ich mir wie hier:
http://www.wolinlabs.com/blog/linux.stm32.discovery.gcc.html
installiert. (einfacherheithalber erst einmal in das home)
Das Blinky Beispiel für den STM32F4 läßt so sich auch übersetzen. Nur 
habe ich halt einen STM32L1.
Die Librarys für den STM32L1 neben den Beipielen habe ich mir dann von 
der ST Seite heruntergeladen und das Makefile von wolinlabs darauf 
angepaßt.
Einige includes mußte ich in die Sourcen noch hinzufügen. Die angefügten 
Dateien sind alle im gleichen Verzeichnis.

Version arm-none-eabi-gcc: 4.7.4 20130913
Version arm-none-eabi-objcopy: 2.22.0.20130913

Wenn ich das Ganze via Makefile jetzt übersetze, scheint der Linker ein 
Problem zu haben. Die Ausgabe vom make sieht so aus:

arm-none-eabi-gcc -g -O2 -Wall -Tstm32_flash.ld -mlittle-endian -mthumb 
-mcpu=cortex-m3 -mthumb-interwork -mfloat-abi=soft -I. 
-I../../Utilities/STM32L-DISCOVERY -I../../Libraries/CMSIS/Include 
-I../../Libraries/CMSIS/Device/ST/STM32L1xx/Include 
-I../../Libraries/STM32L1xx_StdPeriph_Driver/inc main.c 
system_stm32l1xx.c stm32l1xx_it.c 
../../Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/st 
artup_stm32l1xx_md.s  -o tempsensor.elf
main.c: In function 'main':
main.c:162:3: warning: pointer targets in passing argument 1 of 
'LCD_GLASS_ScrollSentence' differ in signedness [-Wpointer-sign]
In file included from main.h:29:0,
                 from main.c:22:
../../Utilities/STM32L-DISCOVERY/stm32l_discovery_lcd.h:121:6: note: 
expected 'uint8_t *' but argument is of type 'char *'
/tmp/ccKSy8F2.o: In function `getFactoryTSCalibData':
/home/andy/stm32_discovery_arm_gcc/STM32L1_Discovery_Firmware_Pack_V1.0. 
3/Projects/AN3964-Temperature_sensor/main.c:248:  undefined reference to 
`DBGMCU_GetDEVID'
/tmp/ccKSy8F2.o: In function `writeCalibData':
/home/andy/stm32_discovery_arm_gcc/STM32L1_Discovery_Firmware_Pack_V1.0. 
3/Projects/AN3964-Temperature_sensor/main.c:290:  undefined reference to 
`DATA_EEPROM_Unlock'
/home/andy/stm32_discovery_arm_gcc/STM32L1_Discovery_Firmware_Pack_V1.0. 
3/Projects/AN3964-Temperature_sensor/main.c:293:  undefined reference to 
`FLASH_ClearFlag'

usw. usw.
bis:
/home/andy/stm32_discovery_arm_gcc/STM32L1_Discovery_Firmware_Pack_V1.0. 
3/Projects/AN3964-Temperature_sensor/stm32l1xx_it.c:189:  undefined 
reference to `EXTI_ClearITPendingBit'
/home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 
.4/../../../../arm-none-eabi/lib/armv7-m/libg.a(lib_a-exit.o):  In 
function `exit':
exit.c:(.text.exit+0x16): undefined reference to `_exit'
/home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 
.4/../../../../arm-none-eabi/lib/armv7-m/libg.a(lib_a-sbrkr.o):  In 
function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
collect2: error: ld returned 1 exit status
make: *** [tempsensor.elf] Fehler 1

Was läuft da schief?

Gruß
Andreas

von hp-freund (Gast)


Lesenswert?

Moin,

einfach die .h der StdPeriph_Driver einbinden reicht nicht.
Du musst die nötigen .c Dateien auch übersetzen und einbinden.

z.B. stm32l1xx_exti.c nicht compiliert/gelinkt -> EXTI Fehler usw.

von Andreas B. (bitverdreher)


Angehängte Dateien:

Lesenswert?

Hallo,
Danke, das war das Problem. Vom AVR bin es anders gewohnt. ;-)
Jetzt bekomme ich immer noch Fehler, mit denen ich aber nichts anfangen 
kann. Hier scheint der Assembler Probleme zu haben.

arm-none-eabi-gcc -g -O2 -Wall -Tstm32_flash.ld -mlittle-endian -mthumb 
-mcpu=cortex-m3 -mthumb-interwork -DUSE_STDPERIPH_DRIVER 
-mfloat-abi=soft -I. -I../../Utilities/STM32L-DISCOVERY 
-I../../Libraries/CMSIS/Include 
-I../../Libraries/CMSIS/Device/ST/STM32L1xx/Include 
-I../../Libraries/STM32L1xx_StdPeriph_Driver/inc main.c 
system_stm32l1xx.c stm32l1xx_it.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/misc.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_adc.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_aes.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_aes_util.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_comp.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_crc.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dac.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dbgmcu.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_dma.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_exti.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_flash.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_flash_ramfunc.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_fsmc.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_gpio.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_i2c.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_iwdg.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_lcd.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_opamp.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_pwr.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_rcc.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_rtc.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_sdio.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_spi.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_syscfg.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_tim.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_usart.c 
../../Libraries/STM32L1xx_StdPeriph_Driver/src/stm32l1xx_wwdg.c 
../../Utilities/STM32L-DISCOVERY/stm32l_discovery_lcd.c 
../../Libraries/CMSIS/Device/ST/STM32L1xx/Source/Templates/TrueSTUDIO/st 
artup_stm32l1xx_md.s  -o tempsensor.elf
main.c: In function 'main':
main.c:162:3: warning: pointer targets in passing argument 1 of 
'LCD_GLASS_ScrollSentence' differ in signedness [-Wpointer-sign]
In file included from main.h:29:0,
                 from main.c:22:
../../Utilities/STM32L-DISCOVERY/stm32l_discovery_lcd.h:121:6: note: 
expected 'uint8_t *' but argument is of type 'char *'
/tmp/cctiL2qQ.s: Assembler messages:
/tmp/cctiL2qQ.s:18: Warning: ignoring changed section attributes for 
.data
/home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 
.4/../../../../arm-none-eabi/lib/armv7-m/libg.a(lib_a-exit.o):  In 
function `exit':
exit.c:(.text.exit+0x16): undefined reference to `_exit'
/home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 
.4/../../../../arm-none-eabi/lib/armv7-m/libg.a(lib_a-sbrkr.o):  In 
function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
collect2: error: ld returned 1 exit status
make: *** [tempsensor.elf] Fehler 1

Gruß
Andreas

von hp-freund (Gast)


Lesenswert?

Bei mir klappts.
Hast Du die newlib richtg installiert?

Häng mal noch ein -lc als letztes an die CFLAGS.

von Andreas B. (bitverdreher)


Lesenswert?

Hallo,
als newlib habe ich nur libnewlib-dev im repo gefunden und installiert.
-lc habe ich jetzt auch an die Optionen angehängt.
Das gibt leider keinen Unterschied in der Ausgabe von make.

Gruß
Andreas

von hp-freund (Gast)


Lesenswert?


von Andreas B. (bitverdreher)


Lesenswert?

Hallo,
Danke!
Das hat schon einmal geklappt.
Jetzt bleibt nur noch:
/home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 
.4/../../../../arm-none-eabi/lib/armv6-m/libc.a(lib_a-exit.o):  In 
function `exit':
exit.c:(.text.exit+0x18): undefined reference to `_exit'
collect2: error: ld returned 1 exit status
make: *** [tempsensor.elf] Fehler 1
Bis jetzt habe ich noch keine Lösung dafür gefunden. Bin aber noch am 
Suchen....

Gruß
Andreas

von hp-freund (Gast)


Lesenswert?

Andreas B. schrieb:
> Bis jetzt habe ich noch keine Lösung dafür gefunden. Bin aber noch am
> Suchen....

Gut. Wenn Du bei den µC bleiben willst musst Du das lernen ;-)

Aus:
http://forums.leaflabs.com/topic.php?id=11574&page=2
1
Add -nostartfiles to the LDFLAGSSTM32 definintion in the makefile to get rid of the __bss_start__, __bss_end__ and _exit errors.
2
You will get and linker error complaining about _init, define this somewhere:
3
void __attribute ((weak))_init(void){};

Musst Du nur anpassen.


Wäre aber vielleicht doch nicht verkehrt eine komplette und 
funktionierende Entwicklungsumgebung zu schaffen...

von Andreas B. (bitverdreher)


Lesenswert?

Hallo,
was -nostartfiles betrifft: Der Fehler ist weg, dafür bekomme ich dann:
/home/andy/gcc-arm-none-eabi-4_7-2013q3/bin/../lib/gcc/arm-none-eabi/4.7 
.4/../../../../arm-none-eabi/lib/armv7-m/libg.a(lib_a-init.o):  In 
function `__libc_init_array':
init.c:(.text.__libc_init_array+0x40): undefined reference to `_init'
collect2: error: ld returned 1 exit status
make: *** [tempsensor.elf] Fehler 1

Edit: Sorry, den void __attribute ((weak))_init(void){}; habe ich 
überlesen. Jetzt geht es.
Danke Dir!

hp-freund schrieb:
> Wäre aber vielleicht doch nicht verkehrt eine komplette und
> funktionierende Entwicklungsumgebung zu schaffen...

Das versuche ich ja gerade. ;-)
Wenn Du eine Tip hast, wie ich das bewerkstelligen soll: Nur her damit.
Das war bis jetzt der Versuch, der mir noch am aussichsreichsten 
erschien. Immerhin ging Blinky zu übersetzen. Soweit habe ich es bis 
jetzt noch nicht gebracht.

Gruss
Andreas

(Unter Mint 15 Cinnamon übrigens das Gleiche Ergebnis)

: Bearbeitet durch User
von hp-freund (Gast)


Angehängte Dateien:

Lesenswert?

Andreas B. schrieb:
> Wenn Du eine Tip hast, wie ich das bewerkstelligen soll: Nur her damit.

Kommt darauf an ob Du eine funktionierende Linux gcc Umgebung hast.
Ich habe das build-script auf die neuesten Versionen angepasst.
Erste Tests hat der Cross-Compiler bestanden. Auch dein Projekt ;)

Musst nur dein home anpassen (2 Zeilen am Anfang).
Die Verzeichnisse müssen alle vorher angelegt und das $PREFIX/bin an den 
PATH angehängt werden.

Das Ganze braucht keine root Rechte.

Etwas Zeit und einige GB auf der Platte solltest Du aber mitbringen.
Sonst geht Alles von allein...

Viel Erfolg!

von Andreas B. (bitverdreher)


Lesenswert?

Hallo,
die Linux gcc Umgebung läuft bei mir schon ewig. Mit den AVRs arbeite 
ich ja schon ein Weilchen problemlos.
Ich probierere Dein Installationsscript mal aus. Danke Dir!

Gruß
Andreas

von hp-freund (Gast)


Lesenswert?

Hallo bitverdreher,

mich würde schon noch interessieren ob Du mit dem script Erfolg hattest.

von Andreas B. (bitverdreher)


Lesenswert?

Hallo Hp-Freund,
sorry (Ich war am WE unterwegs), Danke! Es hat gut geklappt.
Ich mußte nur die Verzeichnisse manuell anlegen und den Kram vor den 
kompilieren hinkopieren.
Ich wollte noch schauen, warum das Script das nicht macht.
Ansonsten ist es ein Sript for Dummys. ;-) Das -nostartfiles im Make 
mußte ich hier aber auch drinlassen.
Jetzt muß ich nur noch schauen, warum sich am Controller nichts tut. Das 
gibt vermutlich einen neuen Thread...

Gruß
Andreas

von Andreas B. (bitverdreher)


Lesenswert?

Hallo,
jetzt schreibe ich doch mal in den bestehenden Thread, weil ich nicht 
weiß, ob das .bin nicht i.O. ist oder ein generelles flash Problem 
vorliegt.
Das o.a. Programm habe ich jetzt in das discovery geflasht, aber es 
passiert nichts. Wenn ich die Pins berühre, dann tut sich am LCD etwas. 
Ich gehe also davon aus, daß die Ein- und Ausgänge noch floaten, also 
noch nicht einmal eine Initialisierung durchgeführt wird.
Die Ausgabe von stlink:

~/stlink/st-flash write tempsensor.bin 0x8000000
2013-11-21T20:07:12 INFO src/stlink-usb.c: -- exit_dfu_mode
2013-11-21T20:07:12 INFO src/stlink-common.c: Loading device 
parameters....
2013-11-21T20:07:12 INFO src/stlink-common.c: Device connected is: L1 
Med-density device, id 0x10186416
2013-11-21T20:07:12 INFO src/stlink-common.c: SRAM size: 0x4000 bytes 
(16 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 256 bytes
2013-11-21T20:07:12 INFO src/stlink-common.c: Ignoring 1 bytes of Zeros 
at end of file
2013-11-21T20:07:12 INFO src/stlink-common.c: Attempting to write 65699 
(0x100a3) bytes to stm32 address: 134217728 (0x8000000)
2013-11-21T20:07:12 WARN src/stlink-common.c: unaligned len 0x100a3 -- 
padding with zero
Flash page at addr: 0x08010000 erased
2013-11-21T20:07:13 INFO src/stlink-common.c: Finished erasing 257 pages 
of 256 (0x100) bytes
2013-11-21T20:07:13 INFO src/stlink-common.c: Starting Half page flash 
write for STM32L core id
2013-11-21T20:07:13 INFO src/stlink-common.c: Successfully loaded flash 
loader in sram
513/513 halfpages written
2013-11-21T20:07:18 INFO src/stlink-common.c: Starting verification of 
write complete
2013-11-21T20:07:19 INFO src/stlink-common.c: Flash written and 
verified! jolly good!

sieht eigentlich gut aus, abgesehen von einem Byte zuwenig.
Irgendwie komme ich hier nicht weiter.

Gruß
Andreas

von Andreas B. (bitverdreher)


Lesenswert?

Hallo,
ich bin immer noch nicht weiter gekommen.
Wenn ich ein Binary aus dem Flash auslese und mit dem erzeugten Binary 
vergleiche, stimmen sie bis auf eine Ausnahme überein: Das erzeugte bin 
ist um 1 länger als das ausgelesene und enthält am Ende eine zusätzliche 
0. Laut Ausgabe von stlink wird das ja ignoriert, sollte also nicht 
stören.

Hat jemand mal ein lauffähiges .bin, was ich mal auf das Discovery laden 
könnte?

Gruß
Andreas

von Andreas B. (bitverdreher)


Angehängte Dateien:

Lesenswert?

Hallo,
Mal ein kurzer Statusbericht:
Jetzt tut sich etwas, nachdem ich nicht mehr die startup_stm32l1xx_md.s 
aus dem TrueStudio Verzeichnis verwende, sondern aus gcc_ride7. (siehe 
makefile).
Der Unterschied ist nur dass die gcc_ride7Version nach dem Systeminit 
noch ein
/* Call static constructors */
    bl __libc_init_array
aufruft.

Die Laufschrift " ** TEMPERATURE SENSOR EXAMPLE ** " geht jetzt einmal 
durch das Display. Dann erscheinen die beiden Sternchen der ersten 
Wiederholung und  das war es dann. Hier schläft er und wacht scheinbar 
nicht mehr auf.

Das .bin ist somit ok und das Problem scheint wohl eine fehlende 
Initialisierung (Takt, IRQ?) zu sein.

Hat jemand eine Idee dazu, was noch fehlt?

Gruß
Andreas

von hp-freund (Gast)


Lesenswert?

Wirf mal den debugger an. Besonders in der Nähe von:

sprintf()

von Andreas B. (bitverdreher)


Lesenswert?

Hallo,
ich habe jetzt erst einmal etwas gebraucht, um mich mit dem gdb 
zurechtzufinden. Er läuft jetzt prima. Mit dem AVR hatte ich nie einen 
Debugger gebraucht.

Dein Verdacht war richtig, es war der sprintf, wo er in eine exception 
hineinläuft.
Ich hatte das Original von:
> sprintf(strDisp, "%d °C", temperature_C );
zu:
> sprintf(strDisp, "%ld °C", temperature_C );
weil der compiler gemeckert hatte, daß das Argument %d einen int_8 
erwartet.

Scheinbar ist der sprintf bei gcc anders implementiert.
Hier muß ich mich erst einmal hineinfinden.

Fortsetzung folgt.....

Gruß
Andreas

von Andreas B. (bitverdreher)


Lesenswert?

Hi,
jetzt habe ich mal etwas herumgespielt. Das sprintf bekomme ich nicht 
zum laufen. Deshalb habe ich das mal mit Ltoa versucht. Da diese 
Funktion aber scheinbar nicht implementiert ist, habe ich sie aus einem 
Artikel hier kopiert und an die 32bit int angepasst.
Das funkioniert soweit ganz gut.
Wenn ich aber einen strcat versuche (hier wieder auskommentiert), fliege 
ich wieder auf die Nase.
1
    if (CurrentlyDisplayed == Display_TemperatureDegC) {
2
      /* print average temperature value in °C  */
3
      ItoA(temperature_C, strDisp);
4
//      strcat(strDisp, " °C");
5
6
      //      sprintf(strDisp, "%ld °C", temperature_C );
7
    } else {
8
      /* print result of ADC conversion  */
9
      ItoA(tempAVG, strDisp);
10
//      strcat(strDisp, " counts");
11
12
      //      sprintf(strDisp, "> %ld", tempAVG );
13
    }
Scheinbar gibt es hier grundsätzliche Probleme mit Stringfunktionen. 
Oder sitzt das Problem wieder mal zwischen meinen beiden Ohren?

Gruß
Andreas

von hp-freund (Gast)


Lesenswert?

Hallo,

ich habe gestern das Ganze mit meinem STM32L-Discovery ausprobiert.

Vermutlich liegt das Problem bei dem Toolchain-Script von oben.
Es compiliert den Code zwar fehlerfrei, aber durch die multilib Option 
im script erzeugt es in der newlib arm und keinen thumb code. Vermutlich 
auch noch andere Probleme.
Benuzt Du das?

Wenn ja, versuch bitte eine andere toolchain.

War ja auch erst mal nur zum testen gedacht ;-)

Sry

von Andreas B. (bitverdreher)


Lesenswert?

Hallo,
aua, ich dachte, Du arbeitest bereits erfolgreich mit dieser Toolchain. 
:-(
Das war die erste Toolchain, die ich erfolgreich zum laufen gebracht 
habe. Ich habe da schon diverse Versuche hinter mir. Da wird diese 
Odysee wohl weitergehen.....

Gruß
Andreas

von hp-freund (Gast)


Lesenswert?

Meine Toolchain - die funktioniert - ist schon 2 Jahre alt.
Ich hatte das script damals auch so angepasst mit den aktuellen 
Versionen.

Wenn Du nichts besseres findest kann ich den Originalzustand wieder 
herstellen.

Wenn ich mal aktualisiere würde ich vermutlich

http://thetoolchain.com/

oder

https://launchpad.net/gcc-arm-embedded

benutzen.

von Andreas B. (bitverdreher)


Lesenswert?

Danke!
Ich werde es mal versuchen.

Gruß
Andreas

von hp-freund (Gast)


Lesenswert?

Hier noch mal die Kurzversion mit fertigem gcc + Freunden. (DL 57MB)
Funktioniert sogar mit unserem Board :)
1
cd $install_dir
2
wget https://launchpad.net/gcc-arm-embedded/4.7/4.7-2013-q3-update/+download/gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2
3
tar xjf gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2
4
export PATH=$PATH:$install_dir/gcc-arm-none-eabi-4_7-2013q3/bin

von Andreas B. (bitverdreher)


Lesenswert?

Hallo,
super, diese Version funktioniert jetzt endlich.

Danke Dir!
Andreas

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.