Forum: Mikrocontroller und Digitale Elektronik Bootloader ohne externe Bedingung


von Christian U. (z0m3ie)


Lesenswert?

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 ?

von Sebastian Eckert (Gast)


Lesenswert?

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.

von Christian U. (z0m3ie)


Lesenswert?

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 ??

von Peter D. (peda)


Lesenswert?

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

von Sebastian Eckert (Gast)


Lesenswert?

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.

von Christian U. (z0m3ie)


Lesenswert?

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 ?

von Christian U. (z0m3ie)


Lesenswert?

@ 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.

von Ralph (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.