Forum: Mikrocontroller und Digitale Elektronik hwstack, swstack, framesize (Bascom)


von Martin M. (Gast)


Lesenswert?

Hallo,

es gibt ja schon einige gute Erklärungen zu diesem Thema, wie etwa 
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/speicher_hwstack_swstack_frame/

Den hwstack meine ich auch soweit verstanden zu haben, aber bereits beim 
swstack komme ich an folgender Stelle nicht mehr so richtig mit:
"...für jede Variable, die an die Unterprozedur als Parameter übergeben 
wird..."

Angenommen ich starte mein Programm mit einer Handvoll "Dim Variablen As 
Byte". Kurz darauf geht es gleich in eine "Gosub XY" wo ein relativ 
großer Programmteil erledigt wird, Variablen bekommen Werte zugewiesen, 
werden berechnet, miteinander verglichen usw.

Was genau zählt nun aber als "Parameter-Übergabe"?
Wenn ich innerhalb der Sub den (außerhalb zugewiesenen) Wert einer 
Variable abrufe?
Oder jede Variable die innerhalb der Sub behandelt wird, also z.B. dort 
nur einen neuen Wert bekommt?
Oder ganz anders?

Danke im Voraus,
MfG Martin

von Hannes L. (hannes)


Lesenswert?

Martin M. schrieb:
> Angenommen ich starte mein Programm mit einer Handvoll "Dim Variablen As
> Byte". Kurz darauf geht es gleich in eine "Gosub XY" wo ein relativ
> großer Programmteil erledigt wird, Variablen bekommen Werte zugewiesen,
> werden berechnet, miteinander verglichen usw.
>
> Was genau zählt nun aber als "Parameter-Übergabe"?

Nichts davon, denn Du arbeitest dabei ja mit globalen Variablen.

> Wenn ich innerhalb der Sub den (außerhalb zugewiesenen) Wert einer
> Variable abrufe?

Ich glaube, Du musst zwischen dem altklassischen Unterprogramm (Aufruf 
per Gosub) und der "echten" Sub (Aufruf per Name ohne Gosub) 
unterscheiden. Das Gosub-Unterprogramm arbeitet mit globalen Variablen. 
SW-Stack brauchst Du, wenn Du eine echte Sub mit Parameter aufrufst oder 
eine Funktion (mit Parameter), wobei die Funktion auch selbst 
geschrieben sein darf.

Framesize ist dann der RAM-Bereich, den Funktionen "zum Rechnen" 
brauchen.

> Oder jede Variable die innerhalb der Sub behandelt wird, also z.B. dort
> nur einen neuen Wert bekommt?

Eher nicht, siehe oben.

> Oder ganz anders?

HW-Stack: Rücksprungadressen (Interrupt, Gosub, Aufrufe von SUB und 
Funktionen), Push/Pop (Registersicherung im Interrupt und in Funktionen)

SW-Stack: Übergabeparameter für "echte" Subs (Aufruf ohne Gosub) und 
Funktionen

Framesize: Arbeitsbereich (Schmierzettel) für Funktionen

...

von Martin M. (Gast)


Lesenswert?

Vielen Dank für die einleuchtende Erklärung, Hannes!

Dann bräuchte ich mit meinen maximal zwei gleichzeitigen 
(verschachtelten) Gosubs im Prinzip nicht mehr als 4 Bytes hwstack 
(keine Interrupts) reservieren.

Damit mir die Sache nicht völlig umsonst Kopfzerbrechen bereitet hat, 
werde ich mich gleich mal mit den Vorteilen von "echten" Subs, Function 
usw. beschäftigen... ;)

MfG Martin

von MWS (Gast)


Lesenswert?


von Hannes L. (hannes)


Lesenswert?

Martin M. schrieb:
> Damit mir die Sache nicht völlig umsonst Kopfzerbrechen bereitet hat,
> werde ich mich gleich mal mit den Vorteilen von "echten" Subs, Function
> usw. beschäftigen... ;)

Ob diese Konstrukte auf kleinen AVRs (ATtiny) Vorteile bringen, weiß 
ich nicht. Ich kenne sie halt von VB und fand sie in Bascom wieder. Ich 
vermute, dass sie recht stackhungrig sind, da sie lokale Variablen 
erlauben. Nicht alles, was in Bascom implementiert ist, ist auch auf 
kleinen AVRs vorteilhaft nutzbar.

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.