STM32 : Float linken mit Coocox

OP #3086222
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.
OP
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?
OP
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
Gast
"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.
OP
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.
Angehängte Dateien:
Gast
>  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.
OP
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.
OP
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.