Forum: Mikrocontroller und Digitale Elektronik AVR Bootloader tiny45


von Michael L. (nightflyer88)


Lesenswert?

Hallo

kurz eine allgemeine frage:

bei den meisten bootloadern wird zu beginn des Flash-speichers (adresse 
0000) überprüft, ob der bootloader gestartet werden soll. Das neue 
Programm wird dann jedoch nicht bei adresse 00 im Flash gespeichert, 
sondern später. Der Programmstart des neuen Programms ist jedoch für 
adresse 00 kompiliert, können dadurch probleme entstehen, oder läuft 
jedes Programm auch an einer anderen Stelle im Flash ?

Habe da bedenken, wenn zum beispiel JUMP befehle im Programm enthalten 
sind, dann wird doch zur falschen Adresse gesprungen ??

von Bole aus Serbien (Gast)


Lesenswert?

Michael L. schrieb:
> Habe da bedenken, wenn zum beispiel JUMP befehle im Programm enthalten
> sind, dann wird doch zur falschen Adresse gesprungen ??

 Ja.
 RJMP ist relativ, also +/- 2K Words
 JMP ist absolut ( 0 - 4M) Words.

> Das neue
> Programm wird dann jedoch nicht bei adresse 00 im Flash gespeichert,
> sondern später. Der Programmstart des neuen Programms ist jedoch für
> adresse 00 kompiliert,

 Warum wird der dann auf eine andere Adresse geladen ?
 Oder anders herum:
 Warum wird das Programm nicht mit der richtigen Adresse kompiliert ?

von Michael L. (nightflyer88)


Lesenswert?

aha, muss ich in dem fall im neuen Programm, die Bootloader überprüfung 
zu beginn direkt integrieren ? So dass ich das neue Programm immer bei 
adresse 00 ablege ?

Sollte das neue Programm jedoch einen Fehler haben, so hab ich mit dem 
Bootloader keinen zugriff mehr.

Warum ich frage: habe mir einen Bootloader für einen Tiny45 
programmiert, und bin mir nicht sicher welches die beste Lösung für den 
Bootloader aufruf ist.

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


Lesenswert?

Michael L. schrieb:
> aha, muss ich in dem fall im neuen Programm, die Bootloader überprüfung
> zu beginn direkt integrieren ?

 MEGAs haben BOOTRST und IVSEL dafür.
 ATTINY45 nicht, so YES, wenn das Programm ab 0x00 kompiliert wird.

> Sollte das neue Programm jedoch einen Fehler haben, so hab ich mit dem
> Bootloader keinen zugriff mehr.

 Neee, nicht ganz so.
 Erster Fall (kompilieren ab .org IntVectSize+1):
 ATTINY45 hat CALL and JUMP überhaupt nicht, so dass die Sache mit dem
 verschieben 100% funktioniert.

 Zweiter Fall (kompilieren ab .org 0x00):
 Musst halt nur aufpassen wie du die erste Page programmierst:
  a) Buffer mit neuen Flash schreiben, Adresse 0x00 merken
  b) Adresse 0x00 auf deinen Bootloader ändern
  c) Wenn fertig, gemerkte Adresse (RESET Vector) irgendwo unterhalb
     deiner Bootloader routine flashen und hop...

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


Lesenswert?

Marc Vesely schrieb:
> c) Wenn fertig, gemerkte Adresse (RESET Vector) irgendwo unterhalb
>      deiner Bootloader routine flashen und hop...

 Falls ich (mal wieder) etwas verwirrend war:
 In deinem Bootloader wartest du, sagen wir 1Sec auf Zeichen.Wenn
 nichts kommt, springst du auf eine vorher fastgelegte Adresse die
 sich 1 PageSize unterhalb deiner Bootloader Routine befindet.
 Und auf diese Adresse wird altes RESET Vector geflasht.
 Wenn das Bootloader selbst programmiert wird, kann diese Adresse
 unprogrammiert bleiben (0xFF = NOP), PC schreitet munter durch bis
 zum Bootloader.

von Michael L. (nightflyer88)


Lesenswert?

Bestens, soweit habe ich das Prinzip verstanden.

Wenn ich nun folgendermassen vorgehe: Bootloader auf Adresse 0000 (Page 
0) legen und das Anwender-Programm nach dem Bootloader. Aber wie finde 
ich die Länge des Bootloaders heraus ? Also anders gesagt, wie finde ich 
heraus, ab welcher Page ich das Anwenderprogramm schreiben darf ? Ich 
programmiere mit Bascom. Ich kann natürlich den Bootloader kompilieren, 
und danach die Page manuel im eingeben, und nochmals kompilieren. Ist 
aber keine elegante Lösung.

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


Lesenswert?

Michael L. schrieb:
> Wenn ich nun folgendermassen vorgehe: Bootloader auf Adresse 0000 (Page
> 0) legen und das Anwender-Programm nach dem Bootloader. Aber wie finde

 Nein, warum ?
 Dein neues Programm darf (und kann) dann keine Interrupte benutzen.
 Also:
 Bootloader auf: (Flashend - BootloaderSize - 1 Page) zur Sicherheit.

 Kompiliere Bootloader, ich glaube Bascom muss auch irgendwo Daten
 uber die Lange des kompilierten Programms bereitstellen, so weisst
 du welche Adresse in Frage kommt.
 Aber das ist irrelevant, ich wiederhole mich:
 Egal auf welche Adresse du das Program ladst, in Tinys funktioniert
 der 100%, mit Ausnahme der IVs.

von Uwe (de0508)


Lesenswert?

Hallo  Michael,

suche mal nach Fastboot 2.9 von Peter Dannegger PeDa hier im Forum.

Damit arbeiten viel und so könntest Du von diesem Code lernen oder ihn 
gleich benützen.

OK ?

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.