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
Semihosting in den Debugger-Einstellungen an? Hier mal durchgesehen? http://www.ece.nus.edu.sg/ee3032/html/Common/Printf%20Semihosting%20Guide.pdf
Danke für deine Antwort aber das Problem besteht nur bei Float zahlen... "Normale" Printf mit integer und char werten funktionieren einwandfrei.
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) .
>"Normale" Printf mit integer und char werten funktionieren einwandfrei.
Dann kann dein printf wohl kein float.
@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
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).
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.
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).
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; |
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!
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.
Ok hatt funktioniert. Aber float Zahlen kann ich immer noch nicht ausgeben. Wie und wo kann ich denn STACK-Pointer ändern?
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.
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...
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.
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.
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.
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?
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.
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?
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).
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).
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.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.