Forum: Mikrocontroller und Digitale Elektronik Atxmega Sprung von Bootloader section in Application section


von Jsc J. (alderaan)


Lesenswert?

Hallo,

muss man beim Sprung von der bootloader section in die Application 
section im Code
die BOOTRST fuse auf Null setzen?  Wenn ja, wie.

Ich habe bisher folgendes gemacht.

Definition im bootloader:
void (*funcptr)(void)=0x00000;

Aufruf im bootloader:
funcptr();

Damit funktioniert es nicht.

von Thomas E. (thomase)


Lesenswert?

Jsc Jsc schrieb:
> void (*funcptr)(void)=0x00000;
Flash >64K?

Ist ein Bug im Compiler.
Beim Atmega 2560 hilft da folgendes:

EIND = 0x00;
funcptr();

mfg.

von Jsc J. (alderaan)


Lesenswert?

Hallo,

danke für die Antwort.

Es ist ein ATXMEGA128A1 mit 128 KB Flash.

Leider scheint es auch mit dem Zusatz "EIND = 0x00;"
nicht zu funktionieren. Oder anders: Ein reset scheint
ausgeführt zu werden aber es wird wieder der Bootloader
gestartet obwohl zu 0x00000 gesprungen werden sollte.

Hat das ev. was mit FUSEBYTE2 zu tun? Ich habe wegen des
Bootloaders BOOTRST auf 1 gesetzt. Kann dann per seriell
empfangenem Command den Sprung zu 0x00000 auslösen.

Springt das Programm vielleicht nur kurz zu 0x00000 und
dann sofort zum Bootloader zu 0x10000?

Muss ich zur Laufzeit des Bootloaders eventuell BOOTRST
auf 0 setzen? Habe noch nicht rausgefunden wie...

von Thomas E. (thomase)


Lesenswert?

Jsc Jsc schrieb:
> Muss ich zur Laufzeit des Bootloaders eventuell BOOTRST auf 0 setzen?

Die Fuses können zur Laufzeit nicht verändert werden.

Jsc Jsc schrieb:
> Springt das Programm vielleicht nur kurz zu 0x00000 und
> dann sofort zum Bootloader zu 0x10000?

Ist denn das Program auch tatsächlich drin? Wenn das Beschreiben des 
Flashs mit dem Bootloader nicht funktioniert, läuft der Controller durch 
das gelöschte Flash(0xFF) und landet dann wieder beim Bootloader.

Ich kenne den Atxmega nicht weiter. Aber beim 2560 beginnt der 
Bootloader mit 4K Words bei Adresse 0x1FC00. Beginnt der Bootloader bei 
0x10000, würde das bedeuten, daß der Bootsektor 64K Words groß ist.
Das ist ein bisschen viel. Das ist Applikationssektor.

Sollte das beabsichtigt sein, ist das Problem, daß das Beschreiben des 
Flashs nur aus dem Bootsektor heraus ausgeführt wird. Die entsprechenden 
Befehle sind im Applikationssektor wirkungslos. Dann wird das Flash 
nicht beschrieben.

Setze einfach nach dem Beschreiben mit dem Bootloader testweise per ISP 
die Fuses auf Start 0. Dann startet der Controller auch bei 0. Wird dann 
der Bootloader erreicht, ist das Flash leer.

mfg.

von Jsc J. (alderaan)


Lesenswert?

Hallo,

OK, die Fuses sind's also nicht.

Es sind Applikation und Bootloader geflasht, ich habe das mit einem Hex 
Editor überprüft.

Der Bootloader beginnt bei 0x10000 (WORD), also 0x20000 (Byte). Das ist 
etwas verwirrend gemacht. Der µC hat 128 KByte Flash für Applikation und 
8 kByte Flash für den Bootloader (0x10000...0x11000)Byte oder 
(0x20000...0x22000) WORD.

Ich bin noch nicht soweit, dass ich das Beschreiben des Application 
Sector Flashs aus dem Bootloader heraus getestet habe - wollte erst das 
Springen zwischen den 2 Sections können. Die Application section habe 
ich per AVR Studio5 ISP geflasht, genau wie die Bootloader section.

Wenn ich nach dem Flashen des Bootloaders per AVR Studio5 die BOOTRST 
auf 0 setze läuft sofort die Applikation los. Setze ich BOOTRST auf 1 so 
startet der Bootloader.

Ich verstehe den letzten Satz "Wird dann der Bootloader erreicht, ist 
das Flash leer." leider nicht, was ist damit gemeint?

Gruss & Danke

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Jsc Jsc schrieb:
> Der Bootloader beginnt bei 0x10000 (WORD), also 0x20000 (Byte).

Ist OKAY.

Jsc Jsc schrieb:
> Wenn ich nach dem Flashen des Bootloaders per AVR Studio5 die BOOTRST
> auf 0 setze läuft sofort die Applikation los. Setze ich BOOTRST auf 1 so
> startet der Bootloader.

Ist doch in Ordnung. Wenn Du den Bootloader verlassen willst, führe ein 
JMP$000000 aus. Das geht zur Not auch mit Inline-Assembler.

Jsc Jsc schrieb:
> Ich verstehe den letzten Satz "Wird dann der Bootloader erreicht, ist
> das Flash leer." leider nicht, was ist damit gemeint?

Wenn die Programmsektion leer, also komplett $FFFF, läuft der 
Programmzähler durch, bis eine verwertbare Instruktion gefunden wird. Im 
Fall eines vorhandenen Bootloaders startet dieser, unabhängig von der 
BOOTRST-Fuse.

von Jsc J. (alderaan)


Lesenswert?

Manchmal muss man einen Schritt zurück treten, um das ganze Bild zu 
betrachten...

Ich hatte noch einen Fehler in der Bootloader Polling 
Empfangs-/Senderoutine, die erst die Antwort sendet, um dann in den 
Bootloader zu springen. Es kam also nicht zu der Ausführung von 
entweder:


EIND = 0x00;
funcptr();   // Jump to Reset vector 0x00000 in Application Section.


oder:

//Eingebundene Assembler routine
_asm_ __volatile
(
  "jmp 0x000000" "\n\t"
 );

Beide Lösungen funktionieren! An dieser Stelle noch mal Danke für die 
Antworten!

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.