Forum: Mikrocontroller und Digitale Elektronik STM32F4 HardFault Interrupt bei stdlib Funktionen


von Lukas H. (1uk3)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

ich kenne deine Platform nicht, aber es klingt so als ob die libs mit 
anderen compiler einstellungen wie dein Programm erzeugt wurden ist.

von Heiko J. (heiko_j)


Lesenswert?

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

von Jim M. (turboj)


Lesenswert?

> 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.

von Lukas H. (1uk3)


Angehängte Dateien:

Lesenswert?

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?

von Matthias K. (matthiask)


Lesenswert?

Hast Du die zusätzlichen Libs beim linker eingebunden?

Wie das in der CoIDE geht, siehe hier:
Beitrag "CoIDE Linker Problem - Anfaengerfrage"

von Lukas H. (1uk3)


Lesenswert?

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

von Heiko J. (heiko_j)


Lesenswert?

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

von Franz (Gast)


Lesenswert?

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?

von Ingo (Gast)


Lesenswert?

Was ist Thumb???



Ingo

von Heiko J. (heiko_j)


Lesenswert?

Ingo schrieb:
> Was ist Thumb???

Der auf Daumengröße geschrumpfte Befehlssatz der Cortex-M CPUs

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.