Jump auf Bootsektor

Gast #760753
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:
Gast #762416
wird im Bootsektor auch der Stackpointer initialisiert?

Ich kenne die Variante über den Watchdog einen RESET auszulösen
(mit gsetztem BOOTRST Bit)
Gast #762463
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.
#762554
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
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
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.