Basiskurs 2 – Abschnitt 1 - Methoden und Kerne (COGS)
Objekte sind organisiert in Programmbausteinen, die man Methoden nennt. In der Sprache SPIN lassen sich mit Hilfe von Methodennamen die Programmkontrolle und Parameterwerte von einer Methode in eine andere übertragen.
Bei einem Methodenaufruf benutzt eine Methode den Namen einer anderen und übergibt ihr die Programmsteuerung.
Methoden lassen sich auch in verschiedenen COGS starten, so dass ihre Befehle parallel mit Befehlen in anderen Methoden ausgeführt werden. Werden SPIN-Methoden in verschiedenen COGS ausgeführt, müssen globale Variablenfelder deklariert und Speicherplatz für die Rücksprungadressen der Methoden, Rückgabewerte, Parameter und Berechnungswerte reserviert werden. Dieser Speicherplatz wird Stack genannt.
Übung 1 - Methoden und lokale Variable
Übung 1 - Methoden und lokale Variable | |
Aufgaben |
|
Material |
|
Das Programm Blinker_locVar.spin
Oszillogramm
Wie arbeitet das Programm Blinker_locVar.spin?
Beginnen wir mit den Vorgabewerten, die als Variable im PUB-Kopf hinter dem Pipe-Symbol eingetragen werden (Zeile 13).
Um eine LED ein- und wieder auszuschalten, benötigt man zwei Taktimpulse; dies soll neun mal hintereinander ausgeführt werden. Dafür sind dann 18 Taktimpulse (2 * 9) nötig. Die Repeat-Schleife (Zeile 21) muss wdh * 2 durchlaufen werden.
Die 18 Taktimpulse sollen in 3s ausgeführt werden (Vorgabe sind 3 Hz), deshalb muss die Blinkrate verdoppelt werden mit blinkrate / 2.
Was man auch mal probieren sollte!
Wie muss das Programm abgeändert werden, um
Lösungen
Übung 2 - Eine Methode aufrufen
In der nachfolgenden Übung wird das Objekt aus Übung 1 mit einer zweiten Methode taster erweitert zu einem neuen Objekt.
Beschreibung des neuen Objekts
Eine LED1 an P22 zeigt durch ihr Leuchten an, dass der Taster T1 an P26 betätigt werden kann. Sobald er gedrückt wird, erlischt LED1 und LED2 an P20 fängt an mit einer Frequenz von 1 Hz 9-mal hintereinander an- und auszugehen. Anschließend wird Taster T1 nach einer kurzen Pause von 2s wieder aktiv geschaltet und LED1 an P22 leuchtet auf.
Übung 2 - Eine Methode aufrufen | |
Aufgaben |
|
Pinbelegung |
|
Vorgehensweise
Die Methode blinkerLocVar aus Übung 1 wird ohne Änderung übernommen. Zusätzlich wird eine Methode taster am Anfang des neuen Objektes eingefügt, die nach dem Programmstart als erstes ausgeführt wird. In dieser wird die Methode blinkerLocVar aufgerufen, abgearbeitet und anschließend wird das Programm in der Methode taster fortgesetzt (siehe Abb. 2).
Objekt AufrufBlinker
Übung 3 - Parameterübergabe
Eine noch flexiblere Handhabung lokaler Variabler erreicht man dadurch, dass man die Werte der Variablen bereits im Methodenaufruf definiert, statt es erst in der Methode selbst zu tun, wie es in Übung 2 erfolgte. Wie das praktisch funktioniert zeigt die folgende Übung. Der dazu notwendige Schaltungsaufbau ist identisch mit dem aus Übung 1.
Objekt AufrufBlinker
Die Methode blinker lässt sich in der Methode Main wiederholt und mit unterschiedlichen Parametern aufrufen und erzeugt damit hintereinander verschiedene Blinkmuster, sobald Taster T1 gedrückt wurde. Probiere es aus, indem du nach Zeile 18 die folgenden Befehlszeilen eingibst:
Übung 4 - Eine Methode einem anderen Kern (COG) übertragen
Bisher wurden alle Methoden eines Objektes nur vom COG 0 ausgeführt; dies ist standardmäßig die Voreinstellung.
Die in Übung 3 ausgeführten Blinksequenzen mit verschiedenen LEDs (s. Abb. 5) werden nacheinander ausgeführt, keinesfalls gleichzeitig.
Übertrage das Programm BlinkenMitCOG.spin in den Propeller-Tool-Editor und speichere es ab. Starte das Programm und betrachte das Ergebnis. Vergleiche es mit dem Blink-Verhalten aus Übung 3.
Das Programm BlinkenMitCOGS.spin
Wie arbeitet das Programm BlinkenMitCOG.spin?
Die erste Methode eines Objektes wird immer COG0 zugewiesen. Für das Objekt BlinkenMitCOG ist das die Methode Main. Es werden vier cognew-Befehle ausgeführt; anschließend fährt COG0 herunter. Inzwischen wurden vier andere COGS gestartet, von denen jeder wenige Sekunden arbeitet. Hat der letzte COG seine Arbeit getan, geht der Propeller Chip in den Low-Power Modus über.
Während COG0 auf unbenutzten globalen RAM zugreift, der gleich nach dem Programmcode für Methodenaufrufe, Rücksprungadressen, lokale Variable und Berechnungsausdrücke kommt, müssen andere COGS, die ebenfalls Methoden ausführen, ihre Variablen im globalen RAM vorübergehend im sogenannten Stackbereich ablegen.
Das blinkenMitCOG-Objekt aus dieser Übung benötigt 40 Elemente vom Typ long für alle gestarteten COGS, jedes Element 32-Bit lang.
Der Befehl
ruft die Methode blinker mit dem nächsten verfügbaren COG auf, das ist COG1. Der Parameter @stack[0] überträgt die Adresse des stack[0]- Feldelementes an COG1. Damit startet COG1 die Ausführung der Methode blinker(20, clkfreq/2, 11) mit Hilfe von stack[0], in den er Rücksprungadresse, lokale Variable und Berechnungen ablegt.
Den freien RAM, den COG0 für seinen Stack nutzt, kann über Object Info (Aufruf mit F8) eingesehen werden (siehe Abb. 7).
Übung 5 – Eine Methode in einem bestimmten Kern starten/ anhalten
Mit dem Befehl
schaut der Propeller Chip, welcher COG verfügbar ist und startet ihn anschließend. Im Objekt BlinkenMitCOG aus Übung 4 war vorhersagbar, nach welchem Muster ein neuer COG angesprochen wird.
Statt den nächsten verfügbaren kann man auch einen beliebigen der verfügbaren COGs ansprechen und starten. Dies geschieht mit dem Befehl:
Ein COG wird angehalten mit
Aufgaben
Das Programm StartStopCOGS.spin
Hier geht es weiter mit dem Basiskurs 2 Abschnitt 2 - Kerne und Stack