Hallo,
ich habe folgende Frage/Problem:
Chip: Attiny13
Der Speicherplatz ist ziemlich voll, ca. 99%.
Nun habe ich ein Programm, dass je nach Anfangszustand von Ports (High
oder Low) etwas bestimmtes tut. Nach Ausführung soll das Programm wieder
resettet werden, d.h. alle Variablen wieder so belegt werden, wie im
Ausgangszustand. (Der Bediener kann während das Programm läuft die
Anfangszustände wieder manipulieren und somit einen anderen Teil des
Programms aufrufen/starten).
Alle Variablen manuell dann auf Ausgangszustand zu belegen, kostet
zuviel Speicher.
Daher mein Gedanke, durch den Watchdog einen Softwarereset beizuführen.
Dies klappt leider nicht so wie ich will. Greift der WD einmal ein, so
startet das Programm an laufenden Band neu.
Gibt es einen extra Befehl beim WD wie ich das komplette Programm
resette? Oder eine andere Möglichkeit, einen vollständigen Reset per
Software zu erzeugen?
Danke,
David
Wenn Du den WD per Software (nicht per Fuse) eingeschaltet hast, kannst
Du ihn (IIRC) nach dem Reset auch wieder abschalten.
Alternativ kannst Du dafür sorgen, daß Dein Programm den Watchdog aktiv
bedient und wenn es einen Reset erzwingen will, damit aufhört.
Wenn es bei dem Reset nur um die erneute Initialisierung der Variablen
geht, und es nicht nötig ist, auch die Hardware zurückzusetzen, kannst
Du den Watchdog-Reset auch weglassen und einfach an die Adresse 0
springen.
Du könntest auch saubere Startups programmieren, wenn es dein freier
Programmspeicher zulässt. Dann stellt sich dir das Problem erst
garnicht.
Denk mal an Windows damals(tm): Ständig Neustarts nötig... mit sauberen
Initialisierungen wäre das nicht passiert.
Das mit dem Sprung an die Adresse 0 bringt in sich nichts, da die
Speicherzellen erhalten bleiben. Wenn Du direkt nach dem Reset jedoch
eine Initialisierung durchläufst, in der die Variablen gezielt gesetzt
werden, dann wird es funktionieren, wie Du willst.
DerPfarrer schrieb:> Das mit dem Sprung an die Adresse 0 bringt in sich nichts, da die> Speicherzellen erhalten bleiben.
Nach dem Sprung auf 0 sind die alten Werte in der Tat zunächst noch da,
dann wird aber (ich postuliere mal C) der vom Compiler generierte
Initialisierungscode durchlaufen. Der eigene Programmcode findet, wenn
er schließlich angesprungen wird, die Variablen genau so vor, wie nach
einem Reset.
David schrieb:> Alle Variablen manuell dann auf Ausgangszustand zu belegen, kostet> zuviel Speicher.
Du ziehst das Init() einfach mit in die Main-Loop, fertig.
Peter
Darf ich mal leise Fragen, was alles in eine init() Funktion gehört bzw.
was man dort am geschicktesten hinein programmiert?
Ich schreibe dort "nur" das setzen der Register (Ein/Ausgänge,
Interrupts-Konfigurationen, Timer-Konfigurationen).
Die Variablen bzw. Vorbelegung der Variablen die ich z.B. global brauche
(für Interrupts) lege ich ja global fest außerhalb des Hauptprogramms
(main) und kann diese doch nicht im Hauptprogamm initialisieren, sonst
wären diese nur lokal. Die Variablen, die dann nur im Hauptprogramm
verwendet werden, definiere ich dort.
Eine eigene Frage?
Dieser Thread ist über 15 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.