PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : State Machine oder HW/SW -stack Problem



Loro
19.11.2008, 22:51
Servus zusammen, ich beschäftige mich wieder mit der State Machine www.roboternetz.de/wissen/index.php/Bascom_State_Machine_Menu

Habe die Menüpunkte um einige Funktionen erweiter (Jeder Punkt ermöglicht die Manipulation von integerwerten), jezt habe ich das Poblem das, wenn ich in mein 5tes Untermenue wechsle, sich der Contoler Resettet und wieder von Vorner Anfängt als wäre er frisch gestartet.

den hwstack, swstack habe ich mittlerweile auf 1024 erhöht und die framesize auf 512.

Gib es eine Möglichkeit die Belegung der Stacks abzufragen, wobei ich eigentlich nicht glaube das es an deren größe leigt, denn die ganze zeit ging es mit 256, bis ich halt die 5te Ebene Eingefügt habe.

Hat zufällig jemand eine Idee wie ich den Fehler Einkreisen könnte?
Den Code mit mehr als 3500 Zeilen zu Posten spare ich mir mal hier ;-)

stefan_Z
20.11.2008, 02:05
Möglicherweise ist der Speicherverbrauch durch die 5. Ebene nicht mehr nur 2x so groß, sondern vielleicht 4x oder 8x? ich weiß es nicht, aber wäre mein erster Gedanke...

Jaecko
20.11.2008, 07:54
Naja spars dir mal nicht, lad die .bas +.cfg direkt hier rein. Dann kann man im Simulator mal drüberschauen, ob man irgendwo nen Grund für das Verhalten findet.

Loro
20.11.2008, 12:21
Das wird im Simulator nicht laufen, da das ganze mit einem kleinen Display von Display3000 verbunden ist.

Freien HWStack habe ich, es stehen noch 560 zur Verfügung. Ich werde dann mal den Code Später hier rein klopfen.

cipher
20.11.2008, 12:40
Hi!

Hört sich ganz nach einem Buffer Overflow an. Dein RAM-Bedarf wird ziemlich sicher zu groß sein, so daß das Programm entweder Deinen Stack überschreibt oder den Stack für Funktionsaufrufe.

Das gleiche Problem hatte ich bei einem C-Programm. Ein Puffer sollte Daten für eine Übertragung zwischenspeichern. Mal gings, mal gings nicht - AVR reagierte nicht mehr, AVR resettete. Zum Debuggen der absolute Horror.

Die Lösung des Ganzen war, dass der Puffer zwar in den Speicher passte, aber dann kein Platz mehr für den Stackframe bei Funktionsaufrufen übrig blieb.

Loro
28.11.2008, 15:11
Es hat zwar etwas gedauert, aber ich habe mal den Code auf das nötigste reduziert und der Fehler kommt imer noch. So wie ich in SUB U110 springe Resette sich das ganze und fängt von vorne an. Auch wenn ich in eine Sub wechsel die ich schon mal ausgeführtz habe kracht wenn ich diese gegen die U110 auswechsele.


Der code ist als bas File angehängt.

-tomas-
29.11.2008, 12:50
Hallo,

vorneweg: ich habe die State Machine in RNWissen geschrieben ;-)

Der Witz dieser State Machine besteht darin, dass sie nur einen Zustand=Pointer=Index wechselt, d.h. es gibt keine Stack-Ebenen. Egal wieviel Menüebenen Du bastelst, es verbraucht keinen zusätzlichen Stack (PUSH/POP).
Dein Fehler muss also irgendwo in Deinem Code liegen. Leider kann ich die tmp.bas nicht so einfach zum Laufen bringen ($include Init21_display3000.bas).

Tip: Setze die State Machine erst einmal im Simulator zusammen und ergänze Deine Display3000 Routinen später.

Loro
30.11.2008, 10:09
Hi Thomas,
die Funktionsweise der State Machine ist mir schon verständlich. (Mal neben bei, dein Beitrag ist echt super)

Ich glaub aber nicht das es am meinem Code liegt, denn wenn ich die "fehlerhafte" Sub gegen eine ander auswechsel die Vorher Funktioniert, z.B "Hmenu_select", kracht es auch.

Also lag meine Vermutung das es wohl ein Stack Problem ist....

Ich werde noch mal versuchen den Code für den Simulator um zu schreiben....

-tomas-
30.11.2008, 21:54
Hallo Loro, Du scheinst aber hier im Forum auch der einzige Freund der State Machine zu sein.
Ich habe mal unser letztes Gespräch zur State Machine rausgekramt: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=42629


Ich werde noch mal versuchen den Code für den Simulator um zu schreiben....
Ok, bastel mal den Code in den Simulator.
Stichwort: $SIM
Ich schau mir dann gerne Deinen Code an.
PS: Die State Machine hat wirklich keinen Memory Leak. Den hast Du reingebastelt ;-)