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 (:
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.
Indem ich mit einem Zeiger auf Adresse "0x0000" zeigen lasse?
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.
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..
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?
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
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.
> 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.
Stimmt ja. Mit meiner Methode hätte ich ja nur den RAM lesen können.. Danke!
Was ist eigentlich der Unterschied zwischen "near" und den "fear" Funktionen?
> Was ist eigentlich der Unterschied zwischen "near" > und den "fear" Funktionen? Das steht auf der oben verlinkten Webseite ziemlich weit oben im Absatz "Note".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.