Forum: Mikrocontroller und Digitale Elektronik Jump auf Bootsektor


von Julius Krebs (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,


#Ziel
Aus der MainApp heraus soll der Bootsektor gestartet werden.

#Umsetzung
1
void (*jump_to_bootloader)(void) = (void *)0x7800;
2
...
3
cli();
4
/* Enable change of interrupt vectors */
5
GICR = (1<<IVCE);
6
/* Move interrupts to boot Flash section */
7
GICR = (1<<IVSEL);
8
jump_to_bootloader();

#Problem
Der Bootsektor wird nicht gestartet, stattdessen erfolgt ein Reset

#Erläuterung
Ist das Bit "Beetsektor enabled" aktiviert, erfolgt der Start des 
Bootsektor problemlos.
Zur zusätlichen Orientierung habe ich den gesamten Inhalt das AVRs in 
beiliegende Hex-Datei kopiert.

#Geräteigenschaften / Konfiguration
- device: mega32
- bootsectorsize: 1024

#Frage
Ist der Jumpbefehl und dessen Adresse korrekt?

von Julius K. (julius-krebs)


Lesenswert?

hat wirklich keiner eine idee?

von Julius K. (julius-krebs)


Lesenswert?

ach leute, das kann es doch nicht sein.

von Walter (Gast)


Lesenswert?

wird im Bootsektor auch der Stackpointer initialisiert?

Ich kenne die Variante über den Watchdog einen RESET auszulösen
(mit gsetztem BOOTRST Bit)

von 6632 (Gast)


Lesenswert?

Julius, ein Jump in den Bootsector ist nicht dasselbe wie ein Reset. 
Falls die Reset Funktionalitaet gewuenscht ist, sollte man den Watchdog 
starten und warten bis der ablaeuft.

von Julius K. (julius-krebs)


Lesenswert?

Walter wrote:
> wird im Bootsektor auch der Stackpointer initialisiert?
Das kann ich leider nicht sagen.

6632 wrote:
> Julius, ein Jump in den Bootsector ist nicht dasselbe wie ein Reset.
Da hast du recht.
Im Atmel Datenblatt steht der Jumpbefehl als Möglichkeit zum 
Bootlaoderstarten an erster Stelle (den gewünschten Effekt wird er also 
haben).

von Peter D. (peda)


Lesenswert?

Also wenn ich in das "m32def.inc" schaue, dürfte Dein Sprung ins Nirwana 
gehen:
1
.equ    FIRSTBOOTSTART  = 0x3f00
2
.equ    SECONDBOOTSTART = 0x3e00
3
.equ    THIRDBOOTSTART  = 0x3c00
4
.equ    FOURTHBOOTSTART = 0x3800
Viele wichtige Defines, die Atmel in seinen Includes hat, fehlen leider 
in den Includes des AVR-GCC.


Es ist völlig witzlos, die Interrupts zu verbiegen.
Wenn das Bootprogramm Interrupts braucht, muß es das gefälligst selber 
tun. Beim Start durch Reset sind die ja auch nicht verbogen.

Dagegen ist es aber nötig, alle selber benutzte Interrupts zu disablen, 
sonst hüpft der Bootloader ins Nirwana, wenn er dafür keine Handler hat.
Die UART muß auch disabled werden, könnten ja noch Bytes im 
Empfangspuffer sein, die den Bootloader stören.

Daher wird der Bootloaderstart per Watchdog sehr gerne verwendet, damit 
hat man ohne Aufwand einen sauberen Resetzustand.


Peter

von JojoS (Gast)


Lesenswert?

bei mir hat diese Variante funktioniert:

/* external for Bootloader ---------------------- */

typedef void (*pFn)(void);
const pFn Bootloader = (pFn)(0x7810/2);

...

Bootloader();  // exit to Bootloader


ist fast identisch, aber wie hier schon angemerkt wurde stimmte die 
Adresse nicht.

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.