Forum: Mikrocontroller und Digitale Elektronik Bootloader <-> Software jumps warm reset


von Simon (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgendes Bootloader/Software Problem mit dem Xmega32A4U. 
Programmiersprache: C

Ich habe eine HauptApplication im folgenden Software(SW) genannt und 
einen Bootloader(BL) - beide funktionieren für sich einwandfrei, das 
Problem tritt auf wenn ich versuche vom BL zur SW oder von der SW zum BL 
zu springen.

Wenn ich den BL erst starte und zur SW springe [ asm("jmp 0x0000") ]
läuft die SW nicht korrekt und es wird beispielsweise USB nicht mehr 
initialisiert.

Wenn ich die SW zuerst starte und zum BL springe [ asm("jmp 0x8000") ]
läuft der BL nicht korrekt und es werden falsche Zeichen über die UART 
ausgegeben.

Wenn ich einen Hardware-Reset durchführe funktioniert der Start von BL 
respektive SW, jetzt stecke ich allerdings fest, da ich in beiden 
Richtungen springen muss und ich das BLRST Bit zur Laufzeit nicht ändern 
kann.


Ziel ist es OHNE Hardware-Reset von der SW zum BL als auch vom BL in die 
SW zu springen. (Watchdog|Soft-Reset|RST-Pin scheiden daher aus)

Ich vermute das irgend ein interner Wert auf dem 
Stack/Heap/Rücksprungadresse die Initialisierung behindern und es nicht 
ausreicht Interrupts zu deaktivieren (einzeln und global erfolgt) bzw. 
Systemclock auf Default (2 MHz) zu setzen.

Da der Hardware Reset funktioniert und Google nichts sinnvolles zum 
Thema Warm-Reset ausgespuckt hat, würde mich noch interessieren ob es so 
etwas für den Xmega32A4U gibt - Bei definierten Register Zuständen 
laufen BL und SW schließlich einwandfrei.

In bestehenden BL Applicationen auf Git habe ich auch keine gravierenden 
Unterschiede gesehen um erfolgreich in die SW zu springen und bin für 
jeden Hinweis, was hier schieflaufen könnte, dankbar.


Vielen Dank für eure Hilfe!

Mit freundlichen Grüßen
Simon

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Simon schrieb:
> läuft der BL nicht korrekt und es werden falsche Zeichen über die UART
> ausgegeben.

[Glaskugelmodus]Das hört sich irgendwie an als ob du in den beiden 
Teilen die Hardware nicht richtig/vollständig initialisierst und dich 
stattdessen darauf verlässt das überall die Resetwerte drinstehen und du 
nur die jeweils notwendigen Bits änders. Du berücksichtigst vermutlich 
aber nicht welche du im jeweils anderen Teil bereits verändert 
hast.[/Glaskugelmodus]

von Peter D. (peda)


Lesenswert?

Die Applikation springt in den Bootloader per Reset (Watchdogreset), 
dann ist alles fein.
Der Bootloader springt nach 0x0000, nachdem er sämtliche eigenen 
Initialisierungen rückgängig gemacht hat.
Da Bootloader nur einen einfachen Ablauf haben, ist es in der Regel 
nicht nötig, überhaupt Interrupts freizugeben. Der Datenempfang kann 
einfach per Polling erfolgen.

von Wendels B. (wendelsberg)


Lesenswert?

Ich habe in meinen Versuchen mit dem XMega noch folgendes gefunden:
1
/* Procedure for jumping into the DFU bootloader                        */
2
/* The normal jumping into the bootloader does not work as described in */
3
/* document 1916, the usb interface does not come up correctly          */
4
/* The jumping into the bootloader is done if byte dfu_boot (in the     */
5
/* area which is not cleared in reset) contains the value BL_RUN.
Ich kann aber nicht mehr genau sagen, wie das zusammenhing, ist ueber 6 
Jahre her.

von W.S. (Gast)


Lesenswert?

Simon schrieb:
> ich habe folgendes Bootloader/Software Problem mit dem Xmega32A4U.
> Programmiersprache: C

Eigentlich ist die verwendete Programmiersprache hier egal.

Was ist das für ein Bootlader? (ich selber benutze die Atmels nicht)
a) ein vom Hersteller in das Silizium gesetzter Lader, der dann 
normalerweise außerhalb des normalen Programmspeichers angeordnet ist?
b) ein von dir (oder einem anderen Programmierer) geschriebener 
Bootlader, der irgendwie in den normalen Programmspeicher gesetzt wird 
und sich den Platz dort mit der eigentlichen Anwendung teilen muß?

Im Falle a) gibt es irgendwelche Hardware-Einrichtungen, die ab Reset 
entscheiden, ob der Bootlader gestartet werden soll oder ob die von dir 
geschriebene Firmware loslaufen soll. Wenn da der Hersteller nichts 
vorgesehen hat, um von der Anwendung in den Bootlader zu kommen, geht 
nur der Weg von außen: Reset und sowas wie Bootmode o.ä. applizieren. 
Also das Manual zum Chip gründlich durchlesen.

Im Falle b) mußt du selber nachdenken, wie du die geordnete Koexistenz 
von Firmware und Bootlader organisierst.

W.S.

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
Noch kein Account? Hier anmelden.