Init1 - Section Bootloader: Abstürze

OP #4380796
Lesenswert?
• ▲
▼
Nach stundenlanger Suche bin ich einem sporadischem Problem auf die 
schliche gekommen, welches ich mir nicht richtig erklären kann.

Im Bootloader eines mega328p benutze ich einen Watchdog-Reset in der 
Init1 Section:
1
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init1")));
2

3
void wdt_init(void)
4
{
5
  MCUSR = 0;
6
  wdt_disable();
7
  
8
  return;
9
}

Dieser Code führt allerdings dazu, dass wenn ich die Spannung lange 
abgetrennt lasse (Vollentladung) das Hauptprogramm (Start nach 
Bootloader) nach ein paar Sekunden abstürzt.
Auch der Bootloader kann bei längerem Betrieb abstürzen.

Das Problem tritt nicht immer auf. Bei schnellen, mehrmaligen Resets oft 
nicht. Nehme ich den Code raus, ist das Problem weg.

Wieso kommt es zu derartigem Fehler?
#4380802
Lesenswert?
• ▲
▼
Im init1 hast du noch keinen Stack und auch das r0 Register ist noch auf 
einem zufälligen Wert, meist ungleich 0.

http://www.nongnu.org/avr-libc/user-manual/mem_sections.html


Beim wdt_disable() Aufruf (der eigentlich nur ein define ist), benötigst 
du aber afaik schon das r0 Register.

Bei kurzem Spannungsausfall ist das Register höchstwahrscheinlich noch 
auf 0. Wenn du die Spannung wegnimmst kippen bald schon viele Bits im 
Stack und in den Registern selbst um => Du bekommst Probleme.

Warum schaltest du überhaupt deinen Watchdog so früh aus? Solche .init1 
Spielereien sollte man nur tun, wenn es UNBEDINGT notwendig ist und man 
weiß was die Einschränkungen sind -- was in den meisten Anwendungen 
nicht der Fall ist.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.