Forum: Mikrocontroller und Digitale Elektronik Debugger im Monitor, wie funktioniert das? (generell)


von Christian B. (casandro)


Lesenswert?

Wie funktioniert eigentlich so ein Debugger im Monitor, wie ihn viele 
Mikrocomputersysteme haben?

Der Monitor muss ja da irgendwie in der Lage sein, einen einzigen Befehl 
im Programm auszuführen oder das Programm an einer bestimmten Stelle 
anzuhalten. Wie wird das gemacht?

Also auf den ATMegas fällt mir spontan nur eine Möglichkeit ein. Man 
sorgt für einen Interrupt der genau nach Bearbeitung der 
Interruptroutine auftritt. So läuft das Programm immer genau einen 
Programmschritt.

Auf vielen Plattformen geht das aber nicht.

von Christian R. (supachris)


Lesenswert?

Die Debug-Logik im µC hat kompletten Zugriff auf CPU, alle Register, 
Speicher usw. Sie kann die CPU einen Schritt machen lassen, 100 
Schritte, neu Starten, Programmzähler mit beliebigen Werten laden, 
Register und Speicherstellen lsen und verändern. Desweiteren kann die 
Hardware-Breakpoints setzen, d.h. wenn der Programmzähler auf einer 
bestimmten Stelle ankommt, wird die CPU angehalten und die Steuerung dem 
Debugger übergeben. Das Debug-Modul ist im Normalfall stark mit der CPU 
verwachsen....

von Christian B. (casandro)


Lesenswert?

Das mein ich aber nicht. Das ist ja Hardware debugging. Ich hann aber 
auch auf dem Z80 oder gar dem 8086 debuggen. Da ist (traditionell) keine 
Debug-Logik im Sinne von JTAG o.Ä. drin.

von Bernhard M. (boregard)


Lesenswert?

Hallo,

Softwaremäßig wird das üblicherweise so gemacht, daß bei Breakpoints der 
Maschinencode an der Stelle des Programms durch einen Sprung in den 
Debugger ersetzt wird. Im Debugger wird dann, wenn dort angehalten 
wurde, wieder der original Maschinencode zurückgeschrieben. Das geht 
natürlich nur, wenn der Programmspeicher verändert werden kann.
Für Einzelschrittausführung besteht noch die Möglichkeit, einen freien 
Interrupt zu verwenden, das geht dann auch, wenn der Programmspeicher 
nicht verwendet werden kann. Man kann da z.B. einen freien Interrupt Pin 
verwenden. Im Debugger sperrt man die Interrupts, schreibt dann auf den 
Interrupt-Pin einen Wert, der den Interrupt auslöst, schreibt die 
auszuführenden Speicheradresse des Programmspeichers als 
Interrupt-Return Adresse auf den Stack und führt einen "Return from 
Interrupt" Befehl aus. Der gibt den Interrupt frei, der Return springt 
and die auszuführende Adresse, führt einen Befehl aus und sprint in die 
Interrupt-Service Routine, die zum Debugger gehört.
Das geht auf den meisten kleineren Prozessoren weil:
- üblicherweise nach einem Return-from-Interrupt immer ein Befehl 
ausgeführt wird und,
- alle Maschinen Befehle atomar sind, d.h. eine Maschinenbefehl kann 
nicht durch einen Interrupt unterbrochen werden (was bei größeren 
Prozessoren, ab 68000, möglich ist).

Diese Varianten habe ich mal auf einen 8051 implementiert, ob das auf 
dem AVR auch funktioniert weiß ich nicht, dort habe ich kene ich die 
Interruptfeinheiten noch nicht so gut..

Gruß,
Bernhard

von Frank S. (Firma: HSCS) (linuxerr)


Lesenswert?

das wurde zb so gemacht

1. setzen eines haltepunktes im programm, dazu wurde ein spezieller 
sprungbefehl (call, jp oder rst) in den ram geschrieben und der dortige 
op-code gerettet.
2. erreicht das programm den sprungbefehl, führt dieser in das 
debuggingprogramm, in dem alle register und flags gerettet und angezeigt 
werden.
3. auf knopfdruck wird der alte opcode wieder zurückgeladen die register 
und flags wieder restauriert und der restaurierte op-code angesprungen.

von AVRFan (Gast)


Lesenswert?

>Softwaremäßig wird das üblicherweise so gemacht

Wow, klasse erklärt :-)

von Christian B. (casandro)


Lesenswert?

Danke für die guten Erklärungen!

von Marco S. (masterof)


Lesenswert?

@Bernhard

Hi

Willst du nicht den Beitrag in die Artikelsammlung stellen und bei dem 
Artikelschreib-Wettbewerb mitmachen?

Gruß Marco

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.