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.
Du rufst Deine Funktion init(), die am Anfang Deines Programmes steht (stehen sollte) auf. citb
>Du rufst Deine Funktion init(), die am Anfang Deines Programmes steht >(stehen sollte) auf. Aber irgendwann ist der Stack voll.
Sollte nicht am Anfang der init() das Setzen des Stacks stehen? OK, muss heissen: Du springst zum Anfang Deiner ... citb
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.