Hardfault auslösen

OP #5331903
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.
(Firma: fritzler-avr.de) #5331928
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.
OP #5331937
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
}
Moderator Persönliche Seite #5331940
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.