-
-
Erfahrener Benutzer
Fleißiges Mitglied
Hallo,
in diesem Falle habe ich das in BASCOM-AVR eingebaute Hilfsmittel $DBG verwendet.
Dieses initialisiert an der Stelle, wo es im Programm vorkommt, die 3 Speicherbereiche Frame, SoftStack und HW-Stack mit den ASCII-Zeichen F (für Frame), S (für Softstack) und H (für HW-Stack). Daher muss dieses Statement ziemlich am Anfang des Programmes eingefügt werden vor der eigentlichen Benutzung dieser Bereiche durch das Programm selbst.
Nach dem Testen des Programms im Simulator ist in der SRAM-Darstellung (End des SRAM-Bereiches des Chips) anhand der überschriebenen Bytes der Bedarf im jeweiligen Stack-Bereich ersichtlich.
Grundsätzlich werden die Bereiche verwendet für:
Frame:
- Konvertierung Nummerische Variable in ASCII-Ausgabe bei Print und LCD
In Sub und Function übergebene Variable mit byVal
In Sub und Functions dimensionierte LOCALe Variable
Softstack:
- Addressen zu den im Frame abgelegten Variablen ( 2 Bytes pro Addresse)
HW-Stack:
- Rücksprungaddressen aus Unterprogrammen ( 2 Bytes pro Rücksprungadresse)
Retten von CPU-Registern in Assembler-Routinen
Retten von CPU-Registern bei Aufruf von Interrupt-Service-Routinen
Für die oben erwähnte Konvertierung von Num. Variablen in Strings werden fix die ersten 16 Bytes des Frame verwendet (bei DOUBLE sind es 24 Byte). Der andere Bedarf sich nach der Größe der abgelegten Variablen.
Manche Assembler-Routinen legen auch interne Byte oder Word-Werte im Softstack ab, da dies gegenüber der Standardmethode (im Frame) Speicherplatz und Ausführungszeit spart.
Der HW-Stack wird besonders bei ISR-Routinen, falls nicht mit der Option NOSAVE gearbeitet wird, stark beansprucht (30 Bytes).
Der Bedarf richtet sich nach der Sub oder Function mit den höchsten Werten, bei verschachtelten Aufrufen von Sub oder Function sind die jeweiligen Werte zu addieren. Bei ISR-Routinen ist auch noch dieser Bedarf beim HW-Stack zu addieren. Falls nicht in der ISR-Routine verschachtelter Interrupt-Aufruf zugelassen wird, genügen hier die Werte der ISR-Routine mit dem höchsten Bedarf.
Eine genaue theoretische Abschätzung ist kaum möglich, da selten bekannt, wie die BASCOM-Befehle selbst unter Umständen die Stacks belegen.
Zudem ist es noch möglich, mit $DBG und DBG (siehe Hilfe-Datei) die Werte im Chip zur Laufzeit zu ermitteln.
Eine schnelle Abschätzung ist auch im Simulator /Reiter UP mit den Differenzen von SoftStack - SoftStack Min, HW Stack - HW Min und Frame max - Frame Pointer möglich. Die Werte hier sind allerdings in Hexadezimal angegeben.
Abschließend ist zu sagen, dass eine zu kleine Einstellung dieser Stacks oft die Ursache von Programmabstürzen bzw. unerklärlichem Verhalten des Programmes ist und daher entsprechend ausreichend dimensierte Stacks von eminenter Bedeutung ist.
Viele Grüße Josef
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen