Forum: Compiler & IDEs Hardfault auslösen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Walter T. (nicolas)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.