Forum: Mikrocontroller und Digitale Elektronik Code ausführen immer vor CPU "HALT" (z.B. vor Breakpoint)?


von Rolf E. (Firma: Appsys ProAudio) (roffez)


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

: Bearbeitet durch User
von Pandur S. (jetztnicht)


Lesenswert?

Ich wuerd mir den Aufwand sparen, und waehrend dem Debuggen die LED 
niedriger bestromen. Das Debuggen wird ja wahrscheinlich nicht die LED 
betreffen..

von Little B. (lil-b)


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.

: Bearbeitet durch User
von daheme (Gast)


Lesenswert?

Eventuell kann deine IDE ein Makro ausführen sobald gestoppt wird! Dort 
Schreiber du direkt in die gpio und schaltet ab!

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.