Hallo!
Mit Assembler kenne ich mich nicht gut aus. Das macro habe ich in einem
C-Code gefunden. Es dient zum Reset bei z.B. Timeouts o.ä.
Gerne würde ich den Unterschied zwischen einem "echten" Reset(wie z.B.
durch den Watchdog hervorgerufen) und folgendem macro erfahren:
#define RESET() {asm("ldi r30,0"); asm("ldi r31,0"); asm("ijmp");}
Werden Speicherinhalte genauso behandelt, wie bei einem WDT-RST?
Danke für Erklärungen!
Timo P. schrieb: > Werden Speicherinhalte genauso behandelt, wie bei einem WDT-RST? Was steht denn im Datenblatt deines uCs?
Beim ATMEGA/ATTINY bleiben nach Watchdog-Reset und Soft-Reset die Speicherinhalte (RAM) erhalten. Bei allen anderen nur 42.
Wenn die Inhalte im Ram erhalten bleiben, so werden sie jedoch im code bei eienr Definition/Deklaration einer Variable: char abc = 0; wieder befüllt. Wenn ich also einen RX-Buffer z.B. von der UART habe: char uart_rx_buf[MAX_BUF]; dann bleibt der Buffer nach dem Reset per: ijmp befüllt?!?
Timo P. schrieb: > dann bleibt der Buffer nach dem Reset per: ijmp befüllt?!? Nein, denn alle nicht explizit initialisierten statischen Variablen werden implizit mit Null initialisiert. Wenn du das nicht willst, musst du sie in die .noinit Section packen. Außerdem: in Bezug auf den RAM-Inhalt gibt es gar keinen Unterschied zwischen echtem Reset und Softare-Reset (Sprung nach 0).
Stefan Ernst schrieb: > Außerdem: in Bezug auf den RAM-Inhalt gibt es gar keinen Unterschied > zwischen echtem Reset und Softare-Reset (Sprung nach 0). Der Unterschied liegt in den IO-Registern: ein Sprung nach Adresse 0 ändert diese nicht, ein Reset (egal welcher) setzt sie auf die dokumentierten Resetwerte zurück.
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.