1 - DEBUG - System einschalten
Der Spin2-Compiler enthält ein Debugger-Programm, das automatisch mit einer Anwendung geladen werden kann.
Es verwendet die letzten 16 KB RAM plus ein paar Bytes für jede Spin2 DEBUG-Anweisung.
DEBUG-Anweisungen werden in einer
Anwendung platziert. Wird während der Programmausführung auf eine DEBUG-Anweisung gestoßen, wird der Debugger aufgerufen, der dann die Nachricht für diese Anweisung im
DEBUG-Fenster anzeigt.
Im Propeller-Tool (ab Vers. > 2.6) kann der Debugger über STRG-D oder das Hauptmenü
aufgerufen werden.
Abb. 1
Einschalten des DEBUG-Modus im Propeller Tool
F10 kompiliert eine Anwendung mit allen
DEBUG-Anweisungen und öffnet das DEBUG-Ausgabefenster.
2 - Was man beim DEBUG-System beachten sollte (Auszug)
- Der Systemtakt muss mindestens 10-MHz betragen. RCFAST
oder RCSLOW können nicht verwendet werden.
- Der Debugger belegt die oberen 16 KB des Hub-RAM, neu zugeordnet auf $FC000..$FFFFF und ist schreibgeschützt. Der
Hub-RAM bei 7C000..$7FFFF wird nicht mehr verfügbar sein.
- Wird nicht für den DEBUG-Modus kompiliert, ignoriert der Compiler die DEBUG-Anweisungen im
Programmcode. Sie müssen nicht auskommentiert werden.
- Das Debugging wird aufgerufen mit STRG+D oder über das Hauptmenü mit RUN - Enable
Debug.
- Während der Ausführung werden beim Auftreten von DEBUG-Anweisungen Textnachrichten seriell an P62 mit 2
MBaud im 8-N-1-Format gesendet.
- DEBUG-Meldungen beginnen immer mit „CogN“, wobei N die Cognummer ist, gefolgt von zwei
Leerzeichen, und sie enden immer mit CR+LF (Zeilenrücksprung und neue Zeile).
- Eine Anwendung darf bis zu 255 DEBUG-Anweisungen enthalten.
- In Spin2 können DEBUG-Anweisungen Ausdrucks- und Variablenwerte, Hub-Byte-/Word-/Long
Arrays und Register-Arrays ausgeben.
- In PASM können DEBUG-Anweisungen Registerwerte/Arrays, Hub-Byte/Wort/Long Arrays
und Konstanten ausgeben. PASM-Syntax: impliziertes Register oder # für unmittelbar.
- DEBUG-Ausgangsdaten können als Fließkomma, Dezimal, Hex oder Binär angezeigt und in Byte, Wort, Long oder
Auto skaliert werden. Hub-Zeichenfolgen werden ebenfalls unterstützt.
- DEBUG-Ausgabebefehle zeigen sowohl die Quelle als auch den Wert an: „DEBUG(UHEX(x))“ könnte „x =
$123“ ausgeben.
- DEBUG-Befehle, die Daten ausgeben, können mehrere durch Komma getrennte Parametersätze haben: SDEC(x,y,z) und LSTR(ptr1,size1,ptr2,size2)
- Komma werden automatisch zwischen Daten ausgegeben: "DEBUG(UHEX_BYTE(d,e,f), SDEC(g))"
könnte in der Ausgabe so aussehen: "d = $45, e = $67, f = $89, g = -1_024".
- Alle DEBUG-Ausgabebefehle haben alternative Versionen, die mit „_“ enden und nur den Wert ausgeben: DEBUG(UHEX_BYTE_(d,e,f)) könnte sein: „$45, $67, $89“ .
- DEBUG-Anweisungen können IF()- und IFNOT()-Befehle enthalten, um weitere Ausgaben
innerhalb der Anweisung zu steuern. Ein anfängliches IF/IFNOT wird die gesamte Nachricht durchgehen.
- DEBUG-Anweisungen können einen abschließenden DLY(Millisekunden)-Befehl enthalten, um die Nachrichtenübermittlung eines Cogs zu verlangsamen, da Nachrichten mit einer Rate von ~10.000 pro Sekunde gestreamt werden
können.
- DEBUG-Anweisungen können PC_KEY()- und PC_MOUSE()-Befehle enthalten, um den Status von Tastatur und Maus des Hosts in DEBUG-Anzeigen zu dokumentieren.
CON-Bezeichner für DEBUG-Oberfläche
Abb. 2 - Die Bezeichner in der linken Spalte müssen im CON-Block eines SPIN2 Programms deklariert werden.
In einer ersten Übung machen wir uns mit dem SPIN2 DEBUG-System vertraut.
Übung 1 - Registerinhalte von DIRA und OUTA auslesen
Übung 1 - Registerinhalte von DIRA und OUTA auslesen |
Material |
- 1x Grundausstattung Propeller P2 mit P2-Edge-Breadboard
- 3x LED, rot
- 2x Steckkabel
- 1x Propeller P2 Hardware Manual
|
Aufgaben |
- Baue die Schaltung nach Vorlage auf.
- Übertrage das Programm Pinadressierung_REG_A.spin2 in den Propeller Tool Editor und speichere es
ab.
- Notiere dir auf einem Zettel die Anzahl der Special Purpose Register eines Propeller P2 und ihre HUB-Adressen. Benutze
als Hilfe das Propeller P2 Hardware Manual.
- Aktiviere im Hauptmenü des Propeller Tool Editor über RUN - Enable Debug den
Debugger.
- Beschreibe für jede Programmzeile die Wirkung.
- Starte jetzt mit F10 das Programm und vergleiche deine Aussage mit der Darstellung im Debug-Fenster.
|
Schaltskizze und Schaltungsaufbau
Abb. 3
Die 64 Pinanschlüsse des Propeller P2 sind
auf dem P2-Edge Breadboard in acht 8-Pin Gruppen zusammengefasst.
Jeder Gruppe ist eine eigene Spannungs- versorgung zugewiesen.
Abb. 4
Verdrahtung auf einem P2-Edge Breadboard.
Das Programm Pinadressierung_REG_A.spin2
Darstellung im DEBUG-Fenster
Abb. 5
Die Belegung der beiden 32-Bit Register DIRA und OUTA werden zu unterschiedlichen Programmschritten im Debug-Fenster angezeigt.
3 - Die verfügbaren Speicherbereiche in einem Propeller P2 (Theorie)
Jeder der acht Kerne(Cogs) eines Propeller P2 verfügt über einen
internen RAM-Bereich. Er wird verwendet, um den Programmcode auszuführen und Daten unabhängig von den anderen Kernen zu speichern und zu verändern. Dieser interne RAM-Bereich ist in zwei
zusammenhängenden Blöcken von je 512 x 32 Bit organisiert:
- Register-RAM, Adressbereich: $00_000 bis $00_1FF mit
- acht Dual-Purpose- ($00_1F0 bis $00_1F7)
und
- acht Spezialregistern ($00_1F8 bis $00_1FF), sowie
einem
- Lookup-RAM, Adressbereich: $00_200 bis $00_3FF.
Abb. 4
Speicherorganisation in einem Kern (COG) eines Propeller P2 Controllers.
Bild entnommen aus: Propeller 2 Hardware Manual - Draft 2021, S. 16; Parallax Inc.
Register-RAM-Bereich
Der 512 x 32-Bit-Dual-Port-Register-RAM-Bereich (kurz: Reg-RAM) jedes Kerns sorgt u.a. für die
Programm-Codeausführung und schnellen direkten Registerzugriff. Es wird mit Variablen des Typs Long (4 Bytes oder 32 Bit) gelesen und beschrieben und enthält Allzweck-, Dual-Purpose-
und Spezialregister.
- Allzweck-Register
Die Register
im RAM-Bereich von $000 bis $1EF sind Allzweckregister für Code- und
Datennutzung.
- Dual-Purpose-Register
Die Register im RAM-Bereich von $1F0 bis $1F7 können entweder als
Allzweckregister oder als Spezialregister verwendet werden, wenn ihre zugeordneten Funktionen freigegeben sind.
- Spezial-Register
Die Register im RAM-Bereich von $1F8 bis $1FF geben zugeordneten
Zugriff auf acht Spezialregister; unter anderem zu:
- DIRA mit der COG-RAM
Adresse $1FA,
DIRB mit der COG-RAM Adresse $1FB
OUTA mit der COG-RAM Adresse $1FC
OUTB mit der COG-RAM Adresse $1FD
INA mit der COG-RAM Adresse $1FE
INB mit der COG-RAM Adresse $1FF.
4 - Einige Formatierungsanweisungen für DEBUG (Theorie)
Vorzeichenlose Dezimalausgabe unter DEBUG
Vorzeichenbehaftete Dezimalausgabe unter DEBUG
Vorzeichenlose Binärausgabe unter DEBUG
5 - Wie arbeitet das Programm Pinadressierung_REG_A.spin2 ?
Im CON-Block (Programmzeilen (PZ) 10 - 24) werden die im Programm benutzten Größen mit Werten belegt. Die PZ 13, 17 und 18
beziehen sich bereits auf die Übung 2 und haben in dieser Übung keine Bedeutung.
Für das Richtungs- und Ausgangsregister DIRA und OUTA sind in den PZ 19 und 20 die COG-Adressen im Hex-Format angegeben.
Die Hauptmethode umfasst die PZ 34 bis 56.
Zuerst werden die Pullup-Widerstände für die drei LEDs eingeschaltet (PZ 36).
Anschließend wird der Inhalt des DIRA-Registers im Debug-Fenster im vorzeichenlosen Binärformat ausgegeben (PZ 37) und ein Zeilenrücksprung erfolgt, bevor in PZ 38
die LED an P15 auf HIGH gezogen und eine kurze Pause von 1 sec eingelegt wird.
Auf diese Art und Weise werden nacheinander die drei LEDs ein- und wieder ausgeschaltet und der jeweilige Zustand der Register DIRA und OUTA im Debug-Fenster
angezeigt.
6 - Die Darstellung im Debug Output Fenster
Nach dem Start des Programms wird der Spin2 Setup-Code von Kern0 (Cog0) ab der
Speicherstelle $00000 geladen.
In Zeile 2 wird der Spin2 Interpreter ab $0_0D8C gestartet, wobei
sein Stack-Speicherplatz bei $0_1344 beginnt.
In Zeile 3 wird der Inhalt des 32-Bit Registers DIRA ausgegeben. Dazu muss im Programmcode eine Debug-Anweisung erscheinen:
- debug(u_bin_reg_array(DIR_A,1),
13)
Alle Bits sind auf 0 gesetzt. Nachdem P15 in PZ 38 auf HIGH gezogen wurde, zeigt der nachfolgende Registerinhalt in den Zeilen 4 und 5 für DIRA und OUTA an der 15.
Bitstelle jeweils eine 1.
Das LSB ist 0, das MSB ist 31, deshalb entspricht der 15. Bitstelle die 16. Position im Register.
Übung 2 - Registerinhalt OUTA beim Mod 6 Zähler auslesen
Aufgabe
- Im Kapitel I/O Pin - Teil 4
wird in Übung 3 ein Modulo 6 - Zähler aufgebaut und programmiert. Ergänze das Programm in Abb. 10 dort so, dass der Registerinhalt von OUTA im Debug-Fenster angezeigt
wird.
Abb. 5
Ergänze die Programmzeile 41 in dem Programm.
Im Debug-Fenster sollte die folgende Darstellung angezeigt werden.
DEBUG-Nachrichten können zusätzlich spezielle grafische Anzeigen aufrufen, die in einem gesonderten Fenster
dargestellt werden. Um welche grafischen Anzeigen es sich handelt und wie man sie aufruft wird im folgenden Kapitel beschrieben.