Hallo Ich portiere gerade ein AVR Projekt auf STM32 und habe ein Problem bei dem ich nicht weiter weiß. Wenn ich Funktionen aufrufe wie strtod, isspace, trunc,... finde ich mich im HardFault_Handler wieder. Ich habe probiert den source code von strtod einzufügen um zu sehen was genau der Auslöser ist --> Interrupt bei isspace. Dann hab ich den isspace code eingefügt --> es funktioniert! Als ich glücklich weiter debugged habe, passiert das selbe bei trunc. Alle Funktionen neu zu schreiben ist keine Lösung. Muss ich irgendwas beim Linker einstellen? Libs hinzufügen? ...?? Code für strtod hab ich von hier: http://www.jbox.dk/sanos/source/lib/strtod.c.html Vielen Dank Lukas Edit: CooCox IDE + STM32F4 Discovery Board
ich kenne deine Platform nicht, aber es klingt so als ob die libs mit anderen compiler einstellungen wie dein Programm erzeugt wurden ist.
Ich würde mal aus dem Bauch raus sagen, das diverse Funktionen sozusagen adresstechnisch "zer"linkt ins Nirvana zeigen. Nimm mal dein binary mit objdump (arm-none-eabi-objdump -S) ausseinander und guck nach ob die Funktionen auch wirklich da sind wo sie sein sollen und/oder probier mal ne andere Toolchain z.B. https://launchpad.net/gcc-arm-embedded Gruß Heiko
> Muss ich irgendwas beim Linker einstellen? Ja! Du musst den CPU Typ angeben, denn sonst linkt er ARM Code hinzu. Auf dem Cortex M4 läuft aber nur Thumb(2) Code. Im Disassembly sollte man erkennen, dass er versucht eine grade Addresse in den PC zu laden, d.h. das LSB ist 0 - was dann ein Fault produziert. Dieses Bit wird nämlich zum Umschalten von ARM/Thumb Modus genutzt und muss immer 1 für Thumb Mode sein.
Heiko Jakob schrieb: > Nimm mal dein binary mit > objdump (arm-none-eabi-objdump -S) ausseinander und guck nach ob die > Funktionen auch wirklich da sind wo sie sein sollen und/oder probier mal > ne andere Toolchain z.B. https://launchpad.net/gcc-arm-embedded Hab gerade trunc überprüft, sollte stimmen. In Zeile 1928 auf trunc in Zeile 11425. Diese Toolchain verwendet ich gerade (sry wollte ich eigentlich noch dazuschreiben) Ich werde morgen eine andere probieren. Jim Meba schrieb: > Ja! Du musst den CPU Typ angeben, denn sonst linkt er ARM Code hinzu. > Auf dem Cortex M4 läuft aber nur Thumb(2) Code. Ich hatte die beiden Optionen -mcpu=cortex-m4 -mthumb Fehlt da noch was? Du hast recht, alle Adressen sind gerade! Wie bring ich ihm jetzt Thumb bei?
Hast Du die zusätzlichen Libs beim linker eingebunden? Wie das in der CoIDE geht, siehe hier: Beitrag "CoIDE Linker Problem - Anfaengerfrage"
Ok Fehler gefunden und behoben. Meine Dummheit kennt keine Grenzen! Ich hab die genommen: C:\Program Files (x86)\...\arm-none-eabi\lib\libm.a Richtig ist: C:\Program Files (x86)\...\arm-none-eabi\lib\thumb\libm.a Jetzt funktioniert alles! Danke
Lukas H. schrieb: > Ich hatte die beiden Optionen -mcpu=cortex-m4 -mthumb > Fehlt da noch was? Du solltest den gcc statt dem ld als frontend zum linken nehmen der ld kann mit mcpu und mthumb nix anfangen. Wenn Du dennoch mit ld linken möchtest musst Du explitzit mit -L den Pfad zur jeweiligen Version setzten z.B. "-L/opt/cortex-m3/lib/gcc/arm-none-eabi/4.6.2" Gruß Heiko
Hi Zusammen, ich bin gerade dabei den At91sam3s (zwar ein anderer Prozessor aber der gleiche Core) in Betrieb zu nehmen und da stehe ich vor dem gleichen Problem: Jim Meba schrieb: > Im Disassembly sollte man erkennen, dass er versucht eine grade > Addresse in den PC zu laden, d.h. das LSB ist 0 - was dann ein Fault > produziert. Dieses Bit wird nämlich zum Umschalten von ARM/Thumb Modus > genutzt und muss immer 1 für Thumb Mode sein. Laut Disassambly passiert bei mir genau das, und anschließend springt er (logischerweise) in den Hardfault-Handler. Nur wieso kompilliert er den Code nicht richtig? Beim GCC-Aufruf habe ich die Option für den Cortex-Core gesetzt, somit sollte er eigentlich nur den Thumb-Modus verwenden. Den GCC (4.6.2) rufe ich wie folgt auf: arm-none-eabi-gcc -c -DPROCESSOR=At91sam3s -g -O0 -c -Wall -Wno-unknown-pragmas -mcpu=cortex-m3 -mthumb -Iincludes -o build/HNFbldAt91sam3s_Interpreter.o COMMON/HNFbldAt91sam3s_Interpreter.c Kann mir hier jemand einen Tipp geben?
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.