Debugger im Monitor, wie funktioniert das? (generell)

OP #912144
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.
#912185
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....
#912293
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
(Firma: HSCS) #912294
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren