Hallo Ich möchte in meinem Bootloader keinen externen Jumper oder ähnliches Signal verwenden. Ist es möglich recht sicher festzustellen ob der Flash beschrieben ist ? Hat soetwas schon mal jemand gemacht ? Ich stell mir das z.b. so vor: Bootloader wird gestartet-> Schaut nach ob an Flash Adresse 0 ein jump Oppcode steht wenn ja wird zu Adresse 0 gesprungen wenn nein wird der Bootloader gestartet. So ist sichergestellt das wenn keine Applikation da ist der Controller geflasht werden kann. Wenn eine Applikation da ist springt die auf ein spezielles Kommando hin in den Bootloader. Hat da jemand Erfahrungen mit ? Sieht jemand Probleme ? Was muss ich beachten wenn ich aus der Applikation in den Bootloader Springe ? Muss ich dann irgendwelche Flags vorher setzen ?
Es gab mal ein 80C535-Entwicklungssystem, das ein Terminalprogramm (mit Bootloader-Funktionalität) im EPROM und das Anwenderprogramm im Elko-gepufferten SRAM hatte. Ob besagtes Terminalprogramm oder das Programm aus dem RAM gestartet wurde, wurde durch die letzten beiden Bytes des RAM-Inhalts bestimmt; eine bestimmte "Signatur" dort löste den Auto-Start der Applikation aus. Diese konnte dann durch Löschen der letzten beiden Bytes den Bootloader reaktivieren, falls nötig. Das Prüfen des ersten Befehls im Flash ist da eigentlich nicht so viel anders. Normalerweise sollte es auch kein Problem sein, den Bootloader aus dem Anwendungsprogramm heraus anzuspringen. Wenn dieser so geschrieben ist, daß er die benötigten Register selbst initialisiert, erfordert dies keine weiteren Vorbedingunbgen. Ein möglicher Fehlerfall wäre teilweise geflashter Programmspeicher durch abgebrochenen Programmiervorgang: Programm wird gestartet und stürzt dann irgendwo ab.
Das könnte man vermeiden indem man Am ende des Flashs noch eine Signatur setzt und vom Bootloader liest man den Jmp opcode und die Signatur am ende des Flashs. Vor Programmierbegin wird außerdem die letzte Flash Seite gelöscht, damit sichergestellt wird das die Signatur nicht noch vom alten programm da ist. Aber da mangelts mir schon an Wissen. Kann ich in C den Offset einer Variable (oder Kontante im Flash) angeben ? const uint16_t Signature PROGMEM = 0xAABB; ^ wie kann ich das ergänzen um es am ende des Flashs abzulegen ? pgm_read_byte(0); ^ würde das wirklich den jmp opcode liefern ??
Christian Ulrich wrote: > Wenn eine Applikation da ist springt die auf ein spezielles Kommando hin > in den Bootloader. Sofern die Applikation funktioniert und auch vollständig geflasht wurde. Ansonsten hast Du Dich für alle Zeiten ausgesperrt (wie bei BIOS, DVD-Player Updates usw.). Ich mache es daher so, daß immer der Bootloader angesprungen wird und wenn er nicht innerhalb 0,2s ein Magic empfangen hat, startet er die Anwendung. Peter
Also, ohne Garantie darauf zu geben, sieht das vom Prinzip her ganz gut aus, ähnlich wie im Tutorial: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29 Eventuell muß das Schlüsselwort "static" verwendet werden. Die letzte Programmspeicheradresse ergibt sich aus der Größe des Flash, d.h. bei einem 32k-Typ wäre das 0x7FFF, da die erste Speicherstelle die Adresse 0 hat. Bei einem AVR, wohlgemerkt. Bei einem MSP430 ist das nicht zwangsläufig so.
Ja aber wie kann ich den Offset einer Variable setzen ähnlich dem org Befehl in Assembler ? Oder geht das villeicht sogar mit Inline Assembler ??? Aber am liebsten wäre es mir in C einer PROGMEM Konstante einen Offset verpassen zu können der am ende des Flashs steht. Gibt es ein define in der die Flash grösse steht ?
@ Peter deshalb will ich ja 1. prüfen ob ein jmp befehl an Adresse 0 ist und 2. ob eine Signatur am ende des Flashs steht. 3. hab ich nen Jumper der den Bootloader sicherheitshalber immer aktiviert wenn er gesteckt ist (will ich aber später vielleicht anders nutzen können) und 4. ist ja auch noch eine ISP Schnittstelle dran. Also für alle Zeiten ausgesperrt ist nun wirklich was anderes.
Du musst den Flashbereich des µC im Linkerfile des Compilers in 3 bis n logische Sektionen unterteilen. 1. Sektion : Bootloader ; sollte mit einer physikalichen Sektion des Flash identisch sein. 2. Sektion : Die Anwendung ... n. Sektion : liegt in den letzten n Bytes des Flash und enthält eine Checksumme, Signatur,....... Deine Signatur weißt du dann dieser 3. Sektion zu. Wie das mit deinem Compiler funktioniert kann ich dir jedoch nicht sagen. Dazu gibt es einfach zu viele Möglichkeiten.
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.