Forum: Compiler & IDEs Hardfault auslösen


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
die folgende Funktion gibt auf einem STM32F103RB auf dem angeschlossenen 
LCD die sehr zuverlässig die Zeichenkette "536891393" aus:
1
void triggerHardFault(void)
2
{
3
    int *a = NULL;
4
    int b = *a;
5
    b++; 
6
    printf("b=%i", b);
7
}

Unter Windows dagegen sorgt ihr Aufruf für einen Absturz des Programms.

Kennt jemand einen Trick, wie ich auf dem STM32 reproduzierbar einen 
Hard Fault erzeugen kann? Portabler Code ist natürlich zu bevorzugen.

Viele Grüße
W.T.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Aufm µC darfste NULL eben lesen, aufm PC nicht.

Also muss die MPU in Betrieb genommen werden um dies zu verbieten.
Nur hat der STM32F103 wohl blöderweise keine.

Ansonsten:
Das erste MB wird per MPU gesperrt und per VTOR wird der Anfang der IVT 
von 0x00000000 zum Anfang des Flashes verschoben (=0x08000000) (da liegt 
die ja eh und wird nur nach 0x00000000 remapped).
Schon erzeugt jeder Zugriff aufs erste MB einen Hardfault wenn man nicht 
den memmanage Vector aktiviert.

Also musste wohl selber jedesmal auf NULL prüfen und dann asm("udf"); 
aufrufen.
Das ist eine definierte undefinierte Instruction und führt zum 
Hardfault.

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Ja, das tuts. Danke!

Für alle, die das gleiche suchen, die vollständige Lösung:
1
void triggerHardFault(void)
2
{
3
    #ifdef __MINGW32__
4
        int *a = NULL;
5
        int b = *a;
6
        b++; // Warning "unused variable" unterdruecken
7
    #else
8
        asm volatile("udf");
9
    #endif
10
}

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


Lesenswert?

Walter T. schrieb:
> Kennt jemand einen Trick, wie ich auf dem STM32 reproduzierbar einen
> Hard Fault erzeugen kann?

Wenn du auf den Link unter STM32F103 klickst und auf Seite 39 dir
die memory map ansiehst, dann siehst du, dass der Speicherbereich ab
Adresse 0 markiert ist mit: "Aliased to Flash or system memory depending
on BOOT pins".

Du müsstest dir eine Adresse heraussuchen, die dort als "Reserved" oder
"Not used" markiert ist, vielleicht die 0xC0000000.

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.