Forum: Mikrocontroller und Digitale Elektronik stm32f401 CoIDE Float-Zahl über Semihosting ausgeben


von Kevin M. (1kevin_m1)


Lesenswert?

Hallo liebe Community,

Ich besitze ein STM32F401 discovery board
und möchte jetz die float werte für mein Quadrocopter-Projekt 
beobachten. Jedoch schaffe ich es nicht, die Float zahlen über 
Semihosting auszugeben.
Ich habe schon ein paar Sachen aus dem Internet probiert aber bis jetzt 
hat nichts funktioniert :(

Entwicklungsumgebung: CoIDE 1.7.7

Ich hoffe ihr könnt mir helfen.
Vielen Dank im Vorraus

Kevin Mayrhofer

von Timmo H. (masterfx)


Angehängte Dateien:

Lesenswert?

Semihosting in den Debugger-Einstellungen an?
Hier mal durchgesehen? 
http://www.ece.nus.edu.sg/ee3032/html/Common/Printf%20Semihosting%20Guide.pdf

von Kevin M. (1kevin_m1)


Lesenswert?

Danke für deine Antwort
aber das Problem besteht nur bei Float zahlen...
"Normale" Printf mit integer und char werten funktionieren einwandfrei.

von Dr. Sommer (Gast)


Lesenswert?

Das readme vom GCC beachten: 
https://launchpadlibrarian.net/200699979/readme.txt

Du musst mit "-u _printf_float" linken. Ggf überprüfen ob der 
Stackpointer korrekt (d.h. auf ein Vielfaches von 8) initialisiert wird 
(typischerweise im Linker Script) .

von holger (Gast)


Lesenswert?

>"Normale" Printf mit integer und char werten funktionieren einwandfrei.

Dann kann dein printf wohl kein float.

von Kevin Mayrhofer (Gast)


Angehängte Dateien:

Lesenswert?

@Dr. Sommer
dann müsste das doch passen oder? Aber es tut sich nichts
Tut mir leid ich bin noch ziemlicher anfänger.
MFG Kevin Mayrhofer

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kevin Mayrhofer schrieb:
> dann müsste das doch passen oder?

Nö.  "-u; _printf_float", da ist ein Semikolon zu viel.

Das müsste aber eigentlich eine Fehlermeldung beim Linkeraufruf
bringen.

Den Thread mit dem Stack-Alignment hast du ja schon gefunden.  Der
dort genannte Linkerscript ist das, was bei dir in den Einstellungen
"arm-gcc-link.lc" heißt.  Da solltest du nochmal gucken, dass das mit
dem Stack passt, sonst knallt's im Prozessor (in den meisten Fällen
wirst du dann irgendwo in einen HardFault rennen, wenn der Stack
nicht passt).

von Kevin Mayrhofer (Gast)


Angehängte Dateien:

Lesenswert?

Jörg Wunsch schrieb:
> Nö.  "-u; _printf_float", da ist ein Semikolon zu viel.
>
> Das müsste aber eigentlich eine Fehlermeldung beim Linkeraufruf
> bringen.
>
> Den Thread mit dem Stack-Alignment hast du ja schon gefunden.  Der
> dort genannte Linkerscript ist das, was bei dir in den Einstellungen
> "arm-gcc-link.lc" heißt.  Da solltest du nochmal gucken, dass das mit
> dem Stack passt, sonst knallt's im Prozessor (in den meisten Fällen
> wirst du dann irgendwo in einen HardFault rennen, wenn der Stack
> nicht passt).

Danke für deine Antwort, aber ich habe nur die Nano C Library eingefügt 
und Printf Float ausgewählt.
Wenn ich -u _printf_float und --specs=nano.specs adde
kommt am Anfang immer ein -| dazu und ich bekomme einen Fehler, dass es 
nicht erkannt wird.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dann hat das Dingens eine sehr eigenartige Konfigurationssyntax.

Bekommst du denn irgendwo die generierte Kommandozeile heraus und
kannst diese hier posten?  Am besten in Textform, in [ pre ] ... [ /pre 
] geklammert (ohne die Leerzeichen).

von Kevin M. (1kevin_m1)


Lesenswert?

Jörg Wunsch schrieb:
> Dann hat das Dingens eine sehr eigenartige Konfigurationssyntax.
>
> Bekommst du denn irgendwo die generierte Kommandozeile heraus und
> kannst diese hier posten?  Am besten in Textform, in [ pre ] ... [ /pre
> ] geklammert (ohne die Leerzeichen).

Srry habe nicht ganz verstanden was Sie brauchen.
Diese hier?
1
-mcpu=cortex-m4; -mthumb; -g; -nostartfiles; -Map=Test.map; -O0; --gc-sections; -L; -l--specs=nano.specs; -L; -l-u _printf_float; -L${linkdir}; -T${linkdir}/arm-gcc-link.ld;

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kevin Mayrhofer schrieb:
> Diese hier?

Nein, das ist ja offenbar nur das, was du in der IDE dort einstellst.

Irgendwie baut die IDE dann einen Aufruf für Compiler bzw. Linker
draus, wenn sie diese starten will.  Den hätte ich gern.  Steht
vermutlich in irgendeinem Log-Fenster.

(„Sie“ ist in Internetforen eine eher unübliche Anrede.  Normalerweise
duzt man sich hier einfach, unabhängig von Alter, Erfahrung etc.)

p.s.: Das mit den [pre]-Tags ist ok!

von Michael F. (startrekmichi)


Lesenswert?

Die "Linked Libraries" sind nur eine kleine Hilfe, um die 
Übersichtlichkeit zu steigern und das "-l" nicht eintippen zu müssen.

Unter "Misc Controls" kannst du beliebige eigene Kommandos eintippen, 
die werden dann einfach hinten an die autogenerierten Teile angehängt. 
D.h. mach das "-u _printf_float" einfach mal dort rein.

PS: das unter "Linker Control String" sollte schon die komplette 
Argumentenliste sein, ansonsten müsste es auch beim Kompilieren in's Log 
geschrieben werden.

von Kevin M. (1kevin_m1)


Lesenswert?

Ok hatt funktioniert. Aber float Zahlen kann ich immer noch nicht 
ausgeben. Wie und wo kann ich denn STACK-Pointer ändern?

von Gerd E. (robberknight)


Lesenswert?

Solche Probleme sind der Grund warum ich eine IDE nicht benutze um das 
Kompilieren meiner Programme zu steuern. Für das Editiern des 
Sourcecodes, das Debuggen etc. sind die sehr gut geeignet, aber nicht 
als Ersatz für make. Und wenn ne neue Version von der IDE rauskommt, 
werden die Optionen etwas anders umgesetzt und der Ärger geht von vorn 
los.

Daher mach ich das alles mit cmake und das Buildsystem ist damit 
unabhängig von der IDE.

von Student (Gast)


Lesenswert?

Gerd E. schrieb:
> Solche Probleme sind der Grund warum ich eine IDE nicht benutze um
> das Kompilieren meiner Programme zu steuern. Für das Editiern des
> Sourcecodes, das Debuggen etc. sind die sehr gut geeignet, aber nicht
> als Ersatz für make. Und wenn ne neue Version von der IDE rauskommt,
> werden die Optionen etwas anders umgesetzt und der Ärger geht von vorn
> los.
>
> Daher mach ich das alles mit cmake und das Buildsystem ist damit
> unabhängig von der IDE.

+1
Auch wenn ich oft blöd angemacht werde, wie umständlich das doch ist und 
ob ich masochistisch veranlagt sei...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kevin Mayrhofer schrieb:
> Aber float Zahlen kann ich immer noch nicht ausgeben.

Was heißt das genau: läuft der Rest des Programms (und läuft danach
auch weiter), oder crasht das Teil in einen HardFault (oder so), d. h.
danach passiert einfach gar nichts mehr?

> Wie und wo kann
> ich denn STACK-Pointer ändern?

Der wäre nur der Schuldige, wenn es um den zweiten genannten Fall
geht.

Du musst mal die genannte Datei suchen (arm-gcc-link.ld, im Text oben
kann man es besser lesen als im Screenshot).  Das ist der Linkerscript,
und darin wird irgendwo der Stack festgelegt.

von Kevin M. (1kevin_m1)


Lesenswert?

Jörg Wunsch schrieb:

>
> Der wäre nur der Schuldige, wenn es um den zweiten genannten Fall
> geht.
>
> Du musst mal die genannte Datei suchen (arm-gcc-link.ld, im Text oben
> kann man es besser lesen als im Screenshot).  Das ist der Linkerscript,
> und darin wird irgendwo der Stack festgelegt.

Ja genau deswegen frage ich ja, er crash in einen Hardfault.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kevin Mayrhofer schrieb:
> Ja genau deswegen frage ich ja, er crash in einen Hardfault.

Schön, dass du mal konkret wirst. ;-)

Ja, dann such mal den Linkerscript.

von Kevin M. (1kevin_m1)


Lesenswert?

Jörg Wunsch schrieb:
> Kevin Mayrhofer schrieb:
>> Ja genau deswegen frage ich ja, er crash in einen Hardfault.
>
> Schön, dass du mal konkret wirst. ;-)
>
> Ja, dann such mal den Linkerscript.

Ich geb mir alle Mühe ;)

Ok gefunden. Und was genau muss ich jetzt ändern?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kevin Mayrhofer schrieb:
> Und was genau muss ich jetzt ändern?

Die Lage des Stacks. ;-)

Wenn du das (mit den Infos aus dem anderen Thread) nicht findest, dann
müsstest du den Linkerscript hier mal als Dateianhang posten.  Benenne
ihn am besten in .txt um, mit .ld wird die Forensoftware nicht viel
anfangen können.

von Kevin M. (1kevin_m1)


Angehängte Dateien:

Lesenswert?

Jörg Wunsch schrieb:
>
> Die Lage des Stacks. ;-)
>
> Wenn du das (mit den Infos aus dem anderen Thread) nicht findest, dann
> müsstest du den Linkerscript hier mal als Dateianhang posten.  Benenne
> ihn am besten in .txt um, mit .ld wird die Forensoftware nicht viel
> anfangen können.


Sollte die Zahl nicht ein Vielfaches von 8 sein?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kevin Mayrhofer schrieb:

> Sollte die Zahl nicht ein Vielfaches von 8 sein?

Sieht eigentlich nicht unvernünftig aus:
1
  __StackTop = ORIGIN(ram ) + LENGTH(ram );

Poste doch mal bitte auch das Mapfile (test.map).

von Kevin M. (1kevin_m1)


Angehängte Dateien:

Lesenswert?

Jörg Wunsch schrieb:
> Kevin Mayrhofer schrieb:
>
>> Sollte die Zahl nicht ein Vielfaches von 8 sein?
>
> Sieht eigentlich nicht unvernünftig aus:
>
>
1
>   __StackTop = ORIGIN(ram ) + LENGTH(ram );
2
>
>
> Poste doch mal bitte auch das Mapfile (test.map).

von Kevin M. (1kevin_m1)


Lesenswert?

Hab mich getäuscht, dass Programm bleibt nicht hängen, der Rest des 
Programms läuft normal.
Das Programm besteht nur aus zwei Printf und eines davon sollte eine 
float Zahl ausgeben.Tut es aber nicht. Das andere arbeitet normal.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Damit sollte der SP zu 0x20010000 initialisiert werden, was völlig OK
ist.  Das ist die erste Adresse direkt hinter dem SRAM, aber der
SP wird dekrementiert, bevor etwas auf dem Stack gespeichert wird.

Das heißt allerdings für dich, dass du dich jetzt durch die ARM-Register
wühlen musst, die die genaue Ursache des HardFault beschreiben.
Irgendwo da gibt's dann auch ein Register mit der Adresse, die die
Ursache für den Fault war.

Im Datenblatt eines SAM4 von Atmel (das ich gerade zur Hand hatte,
aber dieser Bereich ist von ARM vorgeschrieben) sieht das so aus:
1
Offset      Register                                          Name         Access         Reset
2
0xE000E008  Auxiliary Control Register                        SCB_ACTLR    Read/Write     0x00000000
3
0xE000ED00  CPUID Base Register                               SCB_CPUID    Read-only      0x410FC240
4
0xE000ED04  Interrupt Control and State Register              SCB_ICSR     Read/Write(1)  0x00000000
5
0xE000ED08  Vector Table Offset Register                      SCB_VTOR     Read/Write     0x00000000
6
0xE000ED0C  Application Interrupt and Reset Control Register  SCB_AIRCR    Read/Write     0xFA050000
7
0xE000ED10  System Control Register                           SCB_SCR      Read/Write     0x00000000
8
0xE000ED14  Configuration and Control Register                SCB_CCR      Read/Write     0x00000200
9
0xE000ED18  System Handler Priority Register 1                SCB_SHPR1    Read/Write     0x00000000
10
0xE000ED1C  System Handler Priority Register 2                SCB_SHPR2    Read/Write     0x00000000
11
0xE000ED20  System Handler Priority Register 3                SCB_SHPR3    Read/Write     0x00000000
12
0xE000ED24  System Handler Control and State Register         SCB_SHCSR    Read/Write     0x00000000
13
0xE000ED28  Configurable Fault Status Register                SCB_CFSR(2)  Read/Write     0x00000000
14
0xE000ED2C  HardFault Status Register                         SCB_HFSR     Read/Write     0x00000000
15
0xE000ED34  MemManage Fault Address Register                  SCB_MMFAR    Read/Write     Unknown
16
0xE000ED38  BusFault Address Register                         SCB_BFAR     Read/Write     Unknown
17
0xE000ED3C  Auxiliary Fault Status Register                   SCB_AFSR     Read/Write     0x00000000

Das HardFault Status Register und die Register rundrum wären die
interessanten hier.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kevin Mayrhofer schrieb:
> Hab mich getäuscht, dass Programm bleibt nicht hängen, der Rest des
> Programms läuft normal.
> Das Programm besteht nur aus zwei Printf und eines davon sollte eine
> float Zahl ausgeben.Tut es aber nicht. Das andere arbeitet normal.

OK.
1
Discarded input sections
2
3
 .text          0x00000000        0x0 ..\obj\semihosting.o
4
 .data          0x00000000        0x0 ..\obj\semihosting.o
5
 .text.SH_SendString
6
                0x00000000       0x24 ..\obj\semihosting.o
7
 .text.SH_GetChar
8
                0x00000000       0x40 ..\obj\semihosting.o
9
 .text          0x00000000        0x0 ..\obj\startup_stm32f4xx.o
10
 .data          0x00000000        0x0 ..\obj\startup_stm32f4xx.o
11
 .bss           0x00000000        0x0 ..\obj\startup_stm32f4xx.o
12
 .text          0x00000000        0x0 ..\obj\main.o
13
 .data          0x00000000        0x0 ..\obj\main.o
14
 .bss           0x00000000        0x0 ..\obj\main.o
15
 .text.printfloat
16
                0x00000000       0x90 ..\obj\main.o

D. h., deine Funktion printfloat() innerhalb von main.c wird vom
Linker verworfen, weil sie offenbar niemand referenziert.

von Kevin M. (1kevin_m1)


Lesenswert?

Jörg Wunsch schrieb:
> OK.
> D. h., deine Funktion printfloat() innerhalb von main.c wird vom
> Linker verworfen, weil sie offenbar niemand referenziert.

printfloat() wird nie aufgerufen, war nur meine Notlösung für das 
Floatproblem

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Aber irgendwas wie printf_float finde ich im Mapfile auch nicht.

Hast du denn mal die Kommandozeile gefunden, die nun tatsächlich
aufgerufen wird?

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.