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).
Genau die Antwort wollte ich hören! Danke!
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.