Code ausführen immer vor CPU "HALT" (z.B. vor Breakpoint)?

OP (Firma: Appsys ProAudio) #4108979
Lesenswert?
• ▲
▼
Gibt es bei einem Cortex-M0 (konkret: STM32F0) eigentlich eine 
Möglichkeit, einen Interrupt oder ähnliches zu installieren, der immer 
genau dann ausgeführt wird, bevor die CPU in den State "halted" geht 
(also z.B. bei einem Breakpoint)?

Der Hintergrund ist folgender:

Die CPU steuert unter anderen auch eine gemultiplexte LED-Matrix; 
realisiert als FreeRTOS-Background-Task. Bei aktiven LEDs darf dieses 
Multiplexing nicht gestoppt werden, weil sonst die LED(s) dauerbestromt 
werden und durchbrennen.

Ein Breakpoint bewirkt jedoch genau das, daher möchte ich die
LED-Treiber abzuschalten bevor ein Breakpoint erreicht wird.

(Im Moment schraube ich im Debug-Mode den LED-Strom soweit runter, dass 
auch eine permanent leuchtende LED keinen Schaden nimmt. Damit bin ich 
"teilzufrieden". In der fertigen Firmware wird der Schutz über den 
Watchdog realisiert, der ist beim Debugging aber kontraproduktiv und 
deshalb abgeschaltet. Einen externen Watchdog möchte ich mir sparen, 
wenn möglich).
#4109085
Lesenswert?
• ▲
▼
Was du suchst, ist ein "Run-Mode debug".
Du verwendest gerade ein "Freeze-Mode debug".
(an dieser Stelle habe ich mal die Terminologie von Greenhills Multi IDE 
übernommen)

Lass mich dazu ein bischen weiter ausholen:

Ein Mikrocontroller besitzt eine Core-nahe Debug Hardware, mit der der 
Core tiefgreifend extern gesteuert werden kann.
Ein Breakpoint kann auf zwei verschiedene Arten eingefügt werden:
1. Ein Hardware Breakpoint, bei dem der aktuelle PC mit den Registern 
der Debughardware verglichen wird, bei ARM die "BreakPointUnit" (BPU), 
beim Cortex M0 zwischen 0 und 4 Register.
2. Sollten diese nicht ausreichen, so können Software Breakpoints 
gesetzt werden. Diese werden im Programm eingefügt (daher 
"Software"Breakpoints) mit dem Assembler-Befehl "BKPT". Dies kann im 
laufenden Programm geschehen, macht aber nur Sinn, wenn das Programm aus 
dem RAM ausgeführt wird (sonst müsste jedes mal beim setzen eines BP 
eine komplette flash page gelöscht und neu geschrieben werden).

Solche Breakpoints stoppen den Core sofort und es wird ein Eingriff 
eines Debuggers benötigt. Alles wird angehalten, je nach Configuration 
Fuses sogar Timer und andere Peripherie (daher "FreezeMode" Debug)

Hast du ein Betriebssystem, wie Beispielsweise "Integrity" von 
Greenhills, so kannst du einzelne Tasks anhalten und debuggen, während 
alle anderen Tasks davon unberührt bleiben (daher "RunMode" Debug). Dies 
muss aber das Betriebssystem unterstützen! Dann wird auch keine Debugger 
Hardware benötigt!
Eine Frage, die an der Stelle auch mich interessiert: Kann das das 
FreeRTOS auch? Evtl durch ein Plugin?

Evtl kann dein Debugger ein Skript ausführen, sobald ein Breakpoint 
erreicht wurde. Dann könntest du sagen, dass die Ausgänge via Debugger 
ausgeschaltet werden sollen.

Fakt ist, im FreezeMode ist deine gewünschte Funktionalität vom 
Prozessor nicht gegeben.

Antwort schreiben

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.

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.