Verständnisfrage Bootloader Fuses

Gast #4801827
Hallo,

ich beschäftige mich mit dem Tutorial zu Bootloadern hier auf dieser 
Seite und versuche mich gerade am Hallo-Welt-Bootloader.

Ich verwende einen Atmega 168-20PU extal 20 Mhz.
Ich habe die Fuses so programmiert:
-U lfuse:w:0xf7:m -U hfuse:w:0xdf:m -U efuse:w:0xf8:m

Ich würde nun vermuten, dass die MCU nun nicht mehr versucht von Adresse 
0 zu starten sondern von einer höheren. Dennoch wenn ich ein Programm 
normal kompiliere und linke wird es gestartet.

Weshalb kann das so sein?
Vielen Dank für jede Hilfe!
Gast
Hallo,

die Fuse Bits sind dafür da, dass dein Programm getrennt vom Bootloader 
geflasht werden kann ohne den gesamten Flash löschen zu müssen.

Dein neues Programm muss also ab der Adresse gelinkt werden, wie du den 
Bootloader / Fuse Bits eingestellt hast.

Der Bootloader braucht irgendeine Bedingung um im Bootloader zu bleiben 
oder dein Programm zu starten (zum Beispiel ein gesetzter I/O Pin) und 
wenn die Bedingung zu trifft wird dein Hauptprogramm oder gestartet oder 
der Bootloader bleibt in deinem eigenen Programm.

Als erstes musst du dann den Bootloader flashen und kannst danach dein 
Hauptprogramm über den Bootloader flashen.

Jens
Bertine Maxe schrieb:
> Ich verwende einen Atmega 168-20PU extal 20 Mhz.
> Ich habe die Fuses so programmiert:
> -U lfuse:w:0xf7:m -U hfuse:w:0xdf:m -U efuse:w:0xf8:m

Ich überprüfe das jetzt nicht, sondern glaube dir einfach, daß du den 
AVR damit dazu gebracht hast, bei einer höheren Adresse als 0x0000 zu 
starten. Für die Zukunft: drösele die Fusebytes auf die einzelnen Fuses 
auf, die du gesetzt haben willst.

> Ich würde nun vermuten, dass die MCU nun nicht mehr versucht von Adresse
> 0 zu starten sondern von einer höheren. Dennoch wenn ich ein Programm
> normal kompiliere und linke wird es gestartet.

Ich nehme an, du meinst damit, daß du noch keinen Bootloader geflasht 
hast, sondern statt dessen per ISP den gesamten Flash gelöscht und dann 
eine Anwendung ab 0x0000 in den Flash geschrieben hast. Korrekt?

> Weshalb kann das so sein?

Der gelöschte Flash enthält 0xFF in jeder Zelle, was den Opcode 0xFFFF 
ergibt. Der AVR behandelt den praktisch [1] wie ein NOP. Unter Annahme, 
daß der Booloader-Bereich im Flash komplett leer ist, läuft der AVR also 
durch alle diese NOPs hindurch, bis der Adreßzähler überläuft und zu 0 
springt. Und dort findet und startet er dein Programm.

[1] http://www.avrfreaks.net/forum/what-opcode-0xffff

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.