Hallo!
Mein Bootloader ist eigentlich ein Loader. Mein Hauptprogramm ruft ihn
bei Bedarf auf und dann lädt dieser die Hauptanwendung neu. Klappt
super. Nur der anschließende Neustart nicht.
Ich mache das ganz simpel so:
1 | wdt_enable(WDTO_1S);
|
2 | while (1);
|
Er startet neu, aber dann startet die Hauptanwendung in einem Interval
von deutlich weniger als einer Sekunde ebenfalls immer wieder neu. Bis
man die Schaltung kalt neustartet. Dann ist alles in Ordnung und die
Anwendung läuft korrekt an. Dabei rufe ich fast als erstes in der
Hauptanwendung wdt_disable() auf. Ich dachte mir, dass vielleicht der
Watchdog noch eingeschaltet sein könnte. Was habe ich übersehen? Oder
geht das so gar nicht?
In der Hauptanwendung wird der Sprung zum Loader mit
#define BOOTLOADER 0x7000
(*((void(*)(void))BOOTLOADER))();
ausgeführt. Was passiert da eigentlich mit dem ganzen Krams, der im RAM
ist (also auch Stack und so). Da es zwei verschiedene Projekte sind
werden die Variablen wohl einfach überschrieben, oder? Und was ist mit
den Interrupts? Im Loader nutze ich keine. Aber in der MainApp.
Viele Grüße!
P.S.: Wenn jemand an dem Bootloader von SD-Karte interessiert ist, dann
kann ich den auch mal rüberschicken. Ist z.Z. noch nicht elegant
programmiert, klappt aber.