kann ich einfach auch nur auf nummer sicher gehen und nen 32iger hinklatschen($hwstack = 32 usw.)?
Hallo Minibot!
Ich versuche mal einen Teil zu beantworten.
$hwstack, $swstack und $framesize sollten im Programm angegeben werden. Einfach, damit man den Überblick behält und damit das Programm, falls man es weitergibt auch bei Anderen läuft. Man kann ja nie wissen, welche Werte der Andere in seiner IDE eingestellt hat.
HWSTACK:
Der Hardware-Stack ist der Bereich im Speicher, der dafür reserviert ist um Rücksprungadressen und, bei einem Interrupt, eine Sicherung der Register abzulegen.
Springst du mit GOSUB irgendwo hin, dann wird zuvor die Adresse gespeichert, zu der bei einem RETURN wieder zurück gekehrt werden soll. Wenn du innerhalb dieser Unterroutine in die du gesprungen bist, noch einmal GOSUB verwendest, dann wird diese zweite Rücksprungadresse ebenfalls auf den Hardware-Stack (=Stapel) abgelegt.
Bei einem RETURN wird dann von der zweiten Unterroutine in die erste Unterruoutine zurück gesprungen. Dann wird die Adresse vom Stack gelöscht. Wird die erste Unterruoutine beendet (RETURN), dann springt das Programm zur ersten Rücksprungadresse zurück. Auch diese Adresse wird wieder vom Hardware-Stack gelöscht.
Wie viel Speicher für diese Springerei benötigt wird, hängt also nicht von der Anzahl an GOSUBs ab, sondern davon, wie viele GOSUB ineinander verschachtelt sind. Für ein GOSUB in eine Unterroutine und noch ein GOSUB innerhalb dieser ersten Unterroutine und dann noch ein GOSUB innerhalb der zweiten Unterroutine brauchst du 3 x 2 Byte. Wenn du also deine Programme nicht extrem verschachtelst, dann brauchst du selten mehr als 10 Byte Hardware-Stack für diese Springerei.
Außer dieser Rücksprungadressen, legt Bascom auch die Werte der Register in diesen Stack, sobald ein Interrupt auftritt und der zugehörige Interrupt-Handler (ISR) angesprungen wird.
Bevor also die Unterprozedur aufgerufen wird, die immer dann automatisch ausgeführt wird, wenn ein Interrupt auftritt, werden die Register in den HWStack gesichert. Dafür werden 32 Byte benötigt. Wenn du also Interrupts aktivierst, dann brauchst du mindestens 32 Byte HWStack. Da man in einem Interrupt-Handler so wenig wie möglich macht und die Hauptarbeit normalerweise in der MainLoop verrichten lässt, ist es unüblich, innerhalb eines Interrupt-Handlers Unterprozeduren anzuspringen. Wenn du es aber doch machst, was ja kein Problem ist, dann musst du zu den benötigten 32 Byte noch die Byte für die Springerei dazuzählen.
Ich würde mal sagen, dass du beim HWSTACK mehr als großzügig bist, wenn du diesen am Anfang auf 40 Byte festlegst. Und falls du weißt, dass du nicht so viel brauchst, weil du z.B. keinen Interrupt aktiviert hast, dann kannst du später den HWSTACK entsprechend verkleinern.
$hwstack = 40
mfg
Gerold
:-)