stationeers.de Mod-Werkstatt · Dominik1199
EN Anmelden
  1. Start
  2. IC10-Akademie
  3. Tag 141

Tag 141 von 365 · Fortgeschritten · Monat 5: Speicher und Struktur

Mit 16 Registern auskommen

16 Register sind schnell voll. Mit define, einem gemeinsamen tmp, Unterprogrammen und dem Stack als Ablage kommt auch ein großer Chip damit aus.

Lektion 15 Min. Woche 21

Das lernst du heute

  • Register mehrfach nutzen
  • Zwischenwerte vermeiden
  • Stack als Auslagerung

Die Basis wächst. Drei Räume mit eigener Heizung, dazu Pumpen, Lampen und Anzeigen – und irgendwann zeigt dein Registerplan: alle 16 belegt. sp und ra zählen nicht mit, die brauchst du für Stack und Unterprogramme. Ein zweiter Chip wäre eine Lösung. Meist reicht es aber, sparsamer mit den Registern umzugehen.

Was wirklich ein Register braucht

Ein Register brauchst du nur für Werte, die sich zur Laufzeit ändern und die du später noch einmal brauchst. Alles andere kostet nichts:

WasRegister?
Schwellwert, Prefab-Hash, Gerätenamenein – define
Zwischenergebnis, das gleich weitergehtein gemeinsames tmp
Messwert, der nur in dieser Runde zähltja, aber jede Runde neu
Zustand, der über Takte erhalten bleibtja – oder Stack

Ein alias ist nur ein Name, er reserviert nichts. Zwei alias auf dasselbe Register sind deshalb zwei Namen für einen Speicher: Steht aus Versehen alias druck r3 unter alias temp r3, überschreibt jeder Druckwert still die Temperatur.

Register mehrfach nutzen

Ein Hilfsregister wie tmp darf in jeder Zeile etwas anderes bedeuten, solange du den alten Inhalt nicht mehr brauchst. Am meisten spart ein Unterprogramm, das für mehrere Räume dieselben Register benutzt:

move name HASH("Raum1")   # Eingabe: welcher Raum
jal raum
move name HASH("Raum2")
jal raum                  # gleiche Register, anderer Raum

Statt drei Sätzen mit Temperatur, Zustand und Hilfswert brauchst du einen.

Zwischenwerte vermeiden

Viele Rechnungen kommen ohne eigenes Ergebnisregister aus. Rechne im selben Register weiter und schreib das Ergebnis direkt an das Gerät:

lbn t SENSOR HASH("Lager") Temperature Average
sub t t CELSIUSOFFSET           # in Grad C, gleiches Register
slt tmp t FROST                 # zu kalt?
sbn LAMPE HASH("Frost") On tmp  # sofort raus, nicht aufheben

Der Stack als Ablage

Was über mehrere Takte erhalten bleiben muss, aber nicht ständig gebraucht wird, legst du in den Stack. Mit get und put an festen Adressen bleibt sp unberührt:

define ADR_RAUM1 0      # Stack-Platz fuer Zustand Raum1
get heiz db ADR_RAUM1   # Zustand holen
put db ADR_RAUM1 heiz   # Zustand zuruecklegen

Ein Platz im Stack ersetzt so ein Register, das sonst die ganze Laufzeit über belegt wäre. Jeder Zugriff kostet dafür eine Zeile.

Achtung

Feste Adressen und push teilen sich denselben Speicher. sp startet bei 0 – das erste push überschreibt also Platz 0, auf dem vielleicht dein Zustand liegt. Benutze nur eines von beiden oder leg die festen Plätze ans obere Ende, zum Beispiel ab Adresse 500.

Tipp

Mit push und pop räumst du Register auch kurz frei, etwa um ein Unterprogramm herum. pop holt in umgekehrter Reihenfolge zurück: Nach push a und push b kommt erst pop b, dann pop a.

Übung

Aufgabe

Drei Räume „Raum1“, „Raum2“ und „Raum3“ haben je einen Gassensor und eine Wandheizung mit demselben Namen. Jede Heizung arbeitet mit Hysterese: an unter 19 °C, aus über 21 °C, dazwischen bleibt sie, wie sie war.

Das Unterprogramm raum wird für alle drei Räume mit denselben Registern aufgerufen: name ist der Name-Hash, adr der Stack-Platz des Raums (0, 1 oder 2).

Damit sich die Räume nicht gegenseitig den Zustand überschreiben, liegt er im Stack. Ergänze im Unterprogramm: Zustand mit get holen, Hysterese rechnen, Zustand mit put zurücklegen.

Hinweise

Hinweis 1

get heiz db adr holt den Zustand des Raums, put db adr heiz legt ihn zurück.

Hinweis 2

Hysterese wie gewohnt: slt tmp t AUS und and heiz heiz tmp, dann slt tmp t AN und or heiz heiz tmp.

Hinweis 3

Ohne Stack lebt der Zustand von Raum1 in Raum2 weiter – genau das prüft der zweite Test.

Quiz

5 Fragen. Ab 60 % ist das Quiz bestanden – die Auswertung macht der Server.

Tag abschließen

  • Übung im Simulator bestanden
  • Quiz mit mindestens 60 % bestanden

Ohne Konto wird der Fortschritt nur in diesem Browser gespeichert.

Fehler in dieser Lektion melden

Zum Melden bitte anmelden. Anmelden

Esc
↑ ↓ wählenEnter öffnen/ öffnet die Suche überall