Forum: Compiler & IDEs [ATmega64] Boot Loader und Applikation + gemeinsame globale Variable


von jola (Gast)


Lesenswert?

Hallo,

ich habe folgende Anforderungen:
1. Firmware Update über UART
2. Applikation muss im Normabetrieb unverzüglich aufstartten
3. Keine Interaktion mit dem Gerät bis auf UART

Idee/Lösung:
1. Boot Loader (kein Problem)
2. Boot Loader nicht über irgendeine magic number über UART + timeout 
antriggern sondern anders.


Also dachte ich an eine globale Variable die ein FW-Update anzeigt. 
Diese wird sowohl in der Applikation als auch im Boot Loader genutzt. 
Damit muss sie natürlich in der noinit Sektion abgelegt werden, 
allerdings an einer fixen Adresse.

1
uint8_t fw_update __attribute__ ((section (".noinit")));
2
3
int boot_loader(void)
4
{
5
   uint8_t reset_source; 
6
   
7
   reset_source = MCUCSR;
8
   MCUCSR = 0;
9
   
10
   /* falls watchdog reset und FW-Upate gewünscht */
11
   if ((reset_source & (1<<WDRF))
12
         && (TRUE == fw_update))
13
   {
14
      /* FW-Update ausführen */
15
   }
16
   else
17
   {
18
      /* Sofort zur Applikation springen */
19
   }
20
}

1
uint8_t fw_update __attribute__ ((section (".noinit")));
2
3
int application_main(void)
4
{
5
   fw_update = FALSE; 
6
7
   /* ... */
8
   
9
   if ("FW-Update starten")
10
   {
11
      fw_update = TRUE; 
12
      
13
      wdt_enable(WDTO_2S);
14
      wdt_reset();
15
   }
16
}


Meiner Meinung nach muss ich sicherstellen, dass beides mal die 
fw_update Variable an der selben Stelle im SRAM abgelegt wird. Denn in 
der Applikation gibt es noch mehr globale Variablen an anderen Stellen.

Wie kann ich das tun?

Oder wie kann ich mir eine einge Sektion erstellen an einer definierten 
Stelle die ebenfalls wie ".noinit" nicht initialisiert wird?

1
uint8_t fw_update __attribute__ ((section (".fwupdate")));
2
3
...
4
5
avr-gcc -mmcu=atmega64 -Wl,-Map=avr_gcc_test.map -Wl,-section-start=fwupdate=0x800100 avr_gcc_test.o -o avr_gcc_test.elf


Was gibt es noch für Möglichkeiten?

Leider kann ich nicht von außen an einem Pin wackeln um das FW Update zu 
triggern. Und zu lange auf ein entsprechendes UART zeichen warten um das 
FW-Update anzuzeigen geht auch nicht. Im Normalfall muss die Applikation 
ruck zuck da sein.



Grüße
jola

von Stefan E. (sternst)


Lesenswert?

Warum nimmst du nicht ein Flag im EEPROM?
Erstens hat das (im Gegensatz zum RAM) keinen eher zufälligen Inhalt 
direkt nach einem Power-Up, und zum anderen brauchst du keine weiteren 
Verrenkungen, um im Bootloader und in der Applikation auf die selbe 
Adresse (letztes Byte im EEPROM würde sich z.B. anbieten) zuzugreifen.

von jola (Gast)


Lesenswert?

ja das EEPROM habe ich als weitere Lösung im Hinterkopf.

Allerdings fände ich die Realisierung über .noinit "schöner". Man muss 
ja keine EEPROM Zelle verschwenden, wenn es eine andere Lösung über SRAM 
gibt... ...wenn es eine gibt :)

von Stefan E. (sternst)


Lesenswert?

jola schrieb:

> Allerdings fände ich die Realisierung über .noinit "schöner".

Sorry, mir erschließt sich diese "Schönheit" nicht.

Was sich mir auch nicht erschließt, ist, wie das dann überhaupt sicher 
funktionieren soll. Flag wird auf "Flashen" gesetzt, der Bootloader 
gestartet, und mitten im Flashen fällt der Strom für eine Stunde aus. 
Nach dem erneuten Power-Up enthält sowohl das Flash, als auch das Flag 
im RAM nur Müll. Welche Entscheidung soll nun der Bootloader auf der 
Basis welcher Informationen treffen?

von Peter D. (peda)


Lesenswert?

jola schrieb:
> Und zu lange auf ein entsprechendes UART zeichen warten um das
> FW-Update anzuzeigen geht auch nicht. Im Normalfall muss die Applikation
> ruck zuck da sein.

Ich warte in meinem Bootloader 300ms und finde das in keinster Weise 
störend.
Der Vorteil ist, daß man so immer an den Bootloader kommt, auch wenn die 
Applikation buggy ist.


Peter

von jola (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Der Vorteil ist, daß man so immer an den Bootloader kommt, auch wenn die
> Applikation buggy ist.

...hm, das ist natürlich klar. Daran habe ich jetzt wirklich nicht 
gedacht. Der Start des Boot Loaders wäre in meinem Fall von der 
Applikation abhängig und das ist ja genau nicht der Sinn der Sache, 
überzeugt.

Peter Dannegger schrieb:
> Ich warte in meinem Bootloader 300ms und finde das in keinster Weise
> störend

Und wie sieht das über einen FT232 aus? Reichen da auch 300ms um über 
USB das zeitlich noch hinzukriegen?

von Peter D. (peda)


Lesenswert?

jola schrieb:
> Und wie sieht das über einen FT232 aus? Reichen da auch 300ms um über
> USB das zeitlich noch hinzukriegen?

Keine Ahnung.
Ich benutze fertige USB-RS232 Umsetzer (Prolific, FTDI) unter XP, damit 
gehts.


Peter

von jola (Gast)


Lesenswert?

Peter Dannegger schrieb:
> jola schrieb:
>> Und wie sieht das über einen FT232 aus? Reichen da auch 300ms um über
>> USB das zeitlich noch hinzukriegen?
>
> Keine Ahnung.
> Ich benutze fertige USB-RS232 Umsetzer (Prolific, FTDI) unter XP, damit
> gehts.

FT232/FTDI... also geht es. Die 300ms werd ich dann wohl mal ausmessen.

jola

von Karl H. (kbuchegg)


Lesenswert?

Ausserdem ist das nicht sooo kritisch.
Du startest zuerst das Übertragungsprogramm am PC und erst dann wird der 
µC resettet. Wenn der µC anfängt an der USART zu lauschen, ballert der 
PC schon längst sein Anfragebyte über die Serielle imeer wieder und 
wieder raus.

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.