Stack-Werte richtig setzen

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Stackwerte richtig angeben

    Leider werden Die Stackwerte nicht richtig oder gar nicht im Programm angegeben.
    Deshalb hier mal eine Übersicht der Stackwerte.

    Mit freundlicher Unterstützung von Gerold Penz
    Er hat mir erlaubt seine Ausführungen in abgewandelter Form hier zu präsentieren
    Hallo Bascom-Gemeinde,

    nachdem ich des öfteren mal die Seite von Gerold Penz zu den Stack-Werten hier angeführt habe, möchte ich dies hier nochmal näher erklären.
    Es gibt in Bascom drei verschiedene Bereiche im S-Ram (Arbeitsspeicher) die man für verschiedene Aufgaben reservieren kann.

    Diese sind $swstack, $hwstack und $framesize.

    BASCOM Source Code

    1. $swstack = 32
    2. $hwstack = 32
    3. $framesize = 40
    Die Zahl hinter dem Gleich-Zeichen gibt dabei die Größe des Speicherbereiches in Byte an

    Wichtig ist, dass man diese Werte immer im Programm mit angeben sollte.

    Macht man das nicht, kann es bei einer Weitergabe oder auch einer späteren Bearbeitung des Programms zu unerwünschten Nebeneffekten kommen bzw. das Programm arbeitet nicht wie gewünscht.
    Die Voreinstellungen von Bascom sind nur Standardwerte und lassen sich nicht auf jedes Programm übertragen.

    $hwstack:



    Der $hwstack reserviert einen Bereich im S-Ram für die Rücksprungadressen von Gosub, Call und Interrupts. Die Größe richtet sich dabei nicht nach der Anzahl von Subroutinen sondern nach der Menge der Verschachtelungen der Subroutinen. Also je mehr verschachtel wird um so mehr Speicher muss reserviert werden. Für Gosub oder Call werden 2 Byte benötigt. Wenn man jetzt aber aus einer Subroutine eine
    weitere Subroutine aufruft benötige man schon 4 Byte usw.
    Werden Interrupts aktiviert benötigt man 32 Byte und dazu kommen dann noch die Byte für die Gosubs und Calls. Also sind an Anfang, wenn man großzügig ist und nicht viel verschachtelt, 40 Byte ausreichend.

    $swstack:


    Beim $swstack verhält es sich im Grunde genau so wie beim $hwstack. Je mehr verschachtelt wird um so mehr Speicher muss dafür reserviert werden.
    Werden einer Subroutine Parameter übergeben benötigt man pro Parameter 2 Byte und werden dann noch Local-Variablen definiert kommen pro Variable noch 2 Byte dazu.
    Hat man also eine Sub mit 2 Parametern und noch 3 Local ergibt das einen Bedarf von 10 Byte für den $swstack.
    Wenn man jetzt noch eine Sub aus dieser Sub aufruft verdoppelt sich der Stack auf 20 Byte.
    Also gilt auch hier: Lieber etwas großzügiger sein.

    $framesize:

    Das ist der Bereich für die Daten. Übergibt man einer Sub einen Parameter wird dieser Wert des Parameters hier abgelegt und die Adresse dafür im $swstack.
    Die Größe richtet sich dabei nach der Menge und Größe der Parameter die übergeben werden.
    Übergibt man 2 Byte als Parameter so müssen also auch 2 Byte dafür reserviert werden. Bei einem String kommt immer noch ein Byte mehr dazu

    String * 16 = 16 Byte + 1 Byte (für das Abschlussbyte) = 17 Byte.

    Den $framesize kann man also auch erstmal großzügig wählen.

    Bascom benutzt den Bereich aber auch für die Umwandlung von Variablen in andere Datentypen.

    -------------------------------------------------------------------------------------------------------------------------


    Der Rest des SRam bleibt natürlich nicht ungenutzt sondern wird für die Globalen Variablen genutzt.


    Für Schreibfaule bietet Bascom aber auch eine Funktion die Werte mit einem Klick einzufügen.

    bascomforum.de/index.php?attac…95a3b3ee16304f25cc99c9e34

    danach sieht es so im Code-Fenster aus

    bascomforum.de/index.php?attac…95a3b3ee16304f25cc99c9e34


    Ich hoffe das ich mich nicht zu umständlich ausgedrückt habe :)
    Die original-Seite ist ja oben noch mal verlinkt.

    251 times viewed