Forum: Mikrocontroller und Digitale Elektronik STM32 : Float linken mit Coocox


von Pete K. (pete77)


Lesenswert?

Hallo,
ich versuche, float Zahlen mit einem stm32f107rc und der Cooide 1.7.0 
und winarm 4.6.q4 auszugeben.

Leider klappt das nicht, es kommt nur Müll raus. Welche Libs muss ich 
dazulinken und aus welchem Pfad?
Oder erkennt das die IDE automatisch? Bei Atmel war auch Handarbeit 
notwendig...

Hier der Compile-Aufruf:
-mcpu=cortex-m3; -mthumb; -Wall; -ffunction-sections; -g; -Os; 
-mfloat-abi=soft; -DSTM32F107RC; -DSTM32F10X_CL; -I.;

Und der Linker:
-mcpu=cortex-m3; -mthumb; -g; -nostartfiles; -Map=led_blink.map; -Os; 
--gc-sections; -Lc:\program files (x86)\gnu tools arm embedded\4.6 
2012q4\arm-none-eabi\lib\; -lm; -L${linkdir}; 
-T${linkdir}/arm-gcc-link.ld;

Toolchain Path liegt auf: C:\Program Files (x86)\GNU Tools ARM 
Embedded\4.6 2012q4\bin

Irgendwas ist da faul.

von holger (Gast)


Lesenswert?

>Leider klappt das nicht, es kommt nur Müll raus.

Wobei kommt Müll raus? Wie sieht der aus?

von Moritz M. (moritz_m72)


Lesenswert?

Hallo,

vllt. könnte die das weiterhelfen:
http://www.coocox.org/forum/topic.php?id=1821

Moritz M.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?


von Pete K. (pete77)


Lesenswert?

Coocox sagt folgendes:

"In project -> configuration click on the “Add” of the “linked 
libraries” box and put there a single m (Yes, a f&@^# single letter, an 
“m” without quotes)"

Allerdings kann ich da kein "m" eingeben, sondern es wird ein Pfad zu 
einer Lib gefordert. Nun sind in dem GCCARM Paket sehr viele "libm.a" 
enthalten.

Welche muss ich einbinden?

von Moritz M. (moritz_m72)


Lesenswert?

Hallo, ich glaube es war die Lib:

arm-none-eabi\lib\fpu\libm.a

Moritz

von Pete K. (pete77)


Lesenswert?

Ich habe folgende libs gefunden, das mit der fpu/lib.a werde ich mal 
probieren:
1
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\libm.a
2
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv6-m\libm.a
3
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7-m\libm.a
4
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7-r\thumb\libm.a
5
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7-r\thumb\fpu\libm.a
6
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7-r\thumb\softfp\libm.a
7
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7e-m\libm.a
8
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7e-m\fpu\libm.a
9
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\armv7e-m\softfp\libm.a
10
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\fpu\libm.a
11
C:\Program Files (x86)\GNU Tools ARM Embedded\4.6 2012q4\arm-none-eabi\lib\thumb\libm.a

von Martin Thomas (Gast)


Lesenswert?

"FPU" im Sinne von Hardware-FPU bei einem STM32F1?
Dem Linker keine absoluten Pfade geben, denn das ist der Anfang vielen 
Übels. Falls CoIDE den Linker via Compiler-Frontend (gcc) aufruft, wird 
intern automatisch Objectcode aus der richtigen Library gelinkt.
Die Fragen von Holger sind noch unbeantwortet.

von Pete K. (pete77)


Angehängte Dateien:

Lesenswert?

Klappt leider immer noch nicht. Vielleicht ist es auch kein 
Linker-Problem.

Ich habe mal das Projekt (zum Compilieren mit Coocox und GCCARM 4.6 q4) 
sowie die main.c (zum Anschauen) angehängt.

Ausgabe des Projekt ist:
1
*** START ***
2
3
SYSCLK: he default value
4
HCLK: K: he default value
5
PCLK1: : he default value
6
PCLK2: : he default value

Also hier werden einige Zeichen verschluckt.

Die angehängte LED sollte über TIM2 im Sekundentakt blinken, tut dies 
aber eher 20x (10x an, 10x aus) in 9 Sekunden (also fast doppelt so 
schnell).

Interessanterweise ändert bei der TIM2 Konfiguration eine Änderung von
TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1; auf
TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV2;
nicht die Blinkzeit.

von Pete K. (pete77)


Lesenswert?

Ich schieb das noch einmal hoch...

von holger (Gast)


Lesenswert?

>  sprintf(buffer, "\nSYSCLK: %li \n", RCC_Clocks.SYSCLK_Frequency / 1000);

Nimm

  sprintf(buffer, "\nSYSCLK: %d \n", RCC_Clocks.SYSCLK_Frequency / 
1000);

Dein sprintf() kann kein %li, da geht nur %i.
Und floating point kann es auch nicht.

von Pete K. (pete77)


Lesenswert?

Ah, ok. Danke für die Info, werde ich mal probieren.
Gibt es denn auch Libs, die floating point können, oder kann das die 
GCCARM Toolchain generell nicht?

Im Coocox Forum scheint es ähnliche Probleme zu geben, allerdings habe 
ich auch noch keine Lösung dort gefunden.

von Pete K. (pete77)


Lesenswert?

holger schrieb:
> Nimm
>
>   sprintf(buffer, "\nSYSCLK: %d \n", RCC_Clocks.SYSCLK_Frequency /
> 1000);

Double ist doch auch floating point, oder?

von Pete K. (pete77)


Lesenswert?

It's magic.... mit %d funktioniert es :-)

Ausgabe:
1
SYSCLK: 72000 
2
HCLK   : 72000 
3
PCLK1  : 36000 
4
PCLK2  : 72000

Jetzt muss ich nur noch schauen, warum der Timer zu schnell läuft.

Wobei aber das Thema floating point damit noch nicht gelöst ist.

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.