Jump auf Bootsektor

Gast #760753
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?
Angehängte Dateien:
#762554
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).
#762712
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
Gast #762721
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren