Basiskurs 2 – Abschnitt 2 - Kerne und Stack
Übung 1 - Berechnung des Stackplatzes
Die nachfolgende Liste weist aus, wieviele longs jede aufgerufene Methode im Stackbereich beansprucht.
Beispiel 1
Wir haben drei Methoden A, B und C.
Beispiel 2
In der Methode blinker wird der Arbeitsspeicher auf zwei verschiedene Arten benutzt. Mit
Werden zwei Elemente auf den Stack gelegt: der Wert des Parameters wdh und die Zahl 2. Nach Ausführung der Multiplikation
wird die 2 vom Stack entfernt und das Ergebnis in einem Element1 auf dem Stack abgelegt. Es verbleibt dort, bis die repeat-Schleife abgeschlossen ist.
Ähnlich verhält es sich mit
Der Parameter blinkrate und 2 werden auf den Stack gelegt, die Division ausgeführt, 2 vom Stack entfernt und das Ergebnis in einem Element2 abgelegt. Es verbleibt ebenfalls bis zum Abschluss der repeat-Schleife auf dem Stack.
Anschließend wird der Parameter cnt auf den Stack gelegt, mit Element2 , das sich bereits auf dem Stack befindet, addiert und das Ergebnis in Element3 auf den Stack gelegt.
In der Summe werden auf dem Stack maximal benötigt:
In der Summe macht das maximal 10 long, die für die Methode blinker auf dem Stack pro COG reserviert werden müssen.
Übung 2 - Methodenaufruf und Rückgabewert
Jede Methode verfügt automatisch über eine eingebaute vordefinierte lokale Variable result. Sie wird bei jedem Methodenaufruf mit dem Wert 0 initialisiert und der aktuelle Wert von result wird mit Abschluss des Methodenaufrufs an die aufrufende Methode zurückgegeben.
Übung 2 - Methodenaufruf und Rückgabewert | |
Aufgaben |
|
Material |
|
Das Objekt TasterBlinker
Wie arbeitet das Programm TasterBlinker.spin ?
Für die Methode main wurde eine Variable DeltaT deklariert; sie besteht nur aus zwei Methoden-Aufrufen: tastzeit und blinker.
Tastzeit(26) ruft die Methode tastzeit auf übergibt 26 an die Variable pin. Die erste repeat-Schleife wird beendet, sobald der Taster an P26 gedrückt wurde und die Variable t_a nimmt den Wert des cnt-Registers auf.
Die zweite Schleife wird solange durchlaufen, wie die Taste gedrückt bleibt. Sobald sie losgelassen wird, speichert t_e den dann aktuellen cnt-Registerwert. Die Differenz aus t_e und t_a wird als Rückgabewert des Methodenaufrufs tastzeit in DeltaT abgelegt.
Der anschließende Methodenaufruf blinker übernimmt den Wert von DeltaT in blinkrate. Diese Methode ist uns inzwischen sehr bekannt und wird nicht mehr weiter besprochen.
Hinweis
Statt result als Rückgabevariable zu nutzen, kann man auch ein alias einführen. Dazu muss in Programmzeile 13 und 19 eine kleine Änderung vorgenommen werden (siehe die folgende Abbildung).
Hier geht es weiter mit dem Basiskurs 3 Abschnitt 1 - Objekte