mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bootloader ohne externe Bedingung


Autor: Christian U. (z0m3ie)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Sebastian Eckert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian U. (z0m3ie)
Datum:

Bewertung
0 lesenswert
nicht 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 ??

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian Eckert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

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.

Autor: Christian U. (z0m3ie)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Christian U. (z0m3ie)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.