Forum: Mikrocontroller und Digitale Elektronik ATXmega Bootloader und eigentliche Firmware


von Ron C. (Gast)


Lesenswert?

Moinsen,

ist es irgendwie möglich vom Bootloader aus zu Prüfen ob schon eine 
Firmware geflasht wurde? Ohne das ich erst den kompletten Bootloader 
laden lassen muss?

Danke (:

von Stefan F. (Gast)


Lesenswert?

Du musst den Bootloader gar nicht laden, weil er schon "da" ist. Der 
gesamte Inhalt des Flash Speichers ist immer sofort ohne Verzögerung 
verfügbar.

Initial sind alle Flash Zellen leer, und haben den Wert 0xFFFF. Darauf 
kannst du den Speicherinhalt testen.

von Ron C. (Gast)


Lesenswert?

Indem ich mit einem Zeiger auf Adresse "0x0000" zeigen lasse?

von Stefan F. (Gast)


Lesenswert?

Ich glaube jetzt habe ich es: Er will einen Einweg-Bootloader, der nach 
dem Laden der eigentlichen Firmware nicht mehr aktiv wird. Kann man 
machen.

von Ron C. (Gast)


Lesenswert?

Stefanus F. schrieb:
> Ich glaube jetzt habe ich es: Er will einen Einweg-Bootloader, der
> nach
> dem Laden der eigentlichen Firmware nicht mehr aktiv wird. Kann man
> machen.

xD Möchte nur darauf hinweisen das schon eine Firmware vorhanden ist..

von Ron C. (Gast)


Lesenswert?

1
  uint16_t *applicationPtr = ( uint16_t *)0x0000;
2
  if ( *applicationPtr != 0xFFFF )
3
  {
4
    uartPutStr( "Es ist bereits eine Firmware vorhanden..\r\n" );
5
  }
so geht es nicht oder?

von Max D. (max_d)


Lesenswert?

Ron C. schrieb:
> uint16_t *applicationPtr = ( uint16_t *)0x0000;
>   if ( *applicationPtr != 0xFFFF )
>   {
>     uartPutStr( "Es ist bereits eine Firmware vorhanden..\r\n" );
>   }
>
> so geht es nicht oder?

Xmega ist Harvard. Also zumindest ein LPM wird irgendwie vorkommen 
müssen.
In der avr-libc gibt's dafür die progmem includes. Den Funktionen/Makros 
kann man beliebige Adressen übergeben

von Ron C. (Gast)


Lesenswert?

Komme nicht ganz mit.. Wie mache ich das jetzt?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ron C. schrieb:
>
1
>   uint16_t *applicationPtr = ( uint16_t *)0x0000;
2
>   if ( *applicationPtr != 0xFFFF )
3
>   {
4
>     uartPutStr( "Es ist bereits eine Firmware vorhanden..\r\n" );
5
>   }
6
>
> so geht es nicht oder?

 Gehen tut es schon, nur hat dein Bootloader nix davon, da er so nicht
 wissen kann was im Flash ist, nur dass der Flash nicht gelöscht ist.

 Ausserdem kannst du Flashinhalt nicht so deklarieren, bzw. man kann
 nicht so aus dem Flash lesen, das meinte der Max D.

von Stefan F. (Gast)


Lesenswert?

> Komme nicht ganz mit.. Wie mache ich das jetzt?

Das lesen: 
https://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

Du brauchst die Funktion pgm_read_word_far() oder pgm_read_word().

Diese Seite solltest du als Lesezeichen abspeichern, da ist nämlich die 
gesamte AVR C Library dokumentiert.

von Ron C. (Gast)


Lesenswert?

Stimmt ja. Mit meiner Methode hätte ich ja nur den RAM lesen können..
Danke!

von Ron C. (Gast)


Lesenswert?

Was ist eigentlich der Unterschied zwischen "near" und den "fear" 
Funktionen?

von Stefan F. (Gast)


Lesenswert?

> Was ist eigentlich der Unterschied zwischen "near"
> und den "fear" Funktionen?

Das steht auf der oben verlinkten Webseite ziemlich weit oben im Absatz 
"Note".

von Bernd K. (prof7bit)


Lesenswert?

Den Inhalt von $0000 zu checken ist nur die halbe Miete. Was ist wenn 
während des ersten Uploads der Anwendung jemand am Stecker gewackelt hat 
und die Übertragung abgebrochen ist? Dann denkt der Bootloader beim 
nächsten Start daß alles OK ist und lädt die Anwendung (die dann 
abstürzt). Und dann ist es gebrickt.

Am sichersten wäre es eine Prüfsumme zu errechnen und irgendwo an einem 
festen Offset Länge und Prüfsumme hinzuschreiben, dann kann der 
Bootloader bei jedem Start schnell die Prüfsumme ausrechnen und 
daraufhin entscheiden ob eine gültige Anwendung existiert oder nicht.

Alternativ könnte der Bootloader auch die Prüfsumme nur einmal prüfen 
(unmittelbar nachdem er die Anwendung ins Flash geschrieben hat) und 
dann bei Erfolg im letzten Flash-Sektor in den letzten paar Bytes noch 
ein Magic hinschreiben an dem er später erkennen kann daß alles OK ist, 
dann geht die Überprüfung nach dem Einschalten schneller.

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.