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
Ich wuerd mir den Aufwand sparen, und waehrend dem Debuggen die LED niedriger bestromen. Das Debuggen wird ja wahrscheinlich nicht die LED betreffen..
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.