Boot Loader

  • Frohe Ostern

Hero_123

Mitglied
17 Sep 2010
79
2
8
Sprachen
C
Hallo!

Bei meinem ATMega8 sind für den Boot Loader 1024 Worte (2kByte) reserviert (Boot Fuse programmiert), somit für Anwenderprogramm 3096 Worte (6kB) möglich.
Wenn ich ein (ganz kleines) Programm erfolgreich mit dem AVR Studio 4 kompiliere, wird angezeigt:

Program: 124 bytes (1,5% Full)
(.text +.data + .bootloader)

Data: 0 bytes (0.0% Full)
(.data +.bas + .noinit)

das heißt doch dann für mich, dass ich zu den 124 bytes Program noch die 1024 Worte (= 2048 bytes) dazuaddieren müßte, oder?
Das heißt dann wiederum, dass mein "größtes" Programm nicht größer als 6kB werden darf, sonst ....

Die Anzeige (.text +.data +.bootloader) ist m.E. verwirrend, da ja noch nicht die 2048 Bytes Boot Loader dazuaddiert wurden - oder mache ich da einen Fehler?


mfg

Hero_123
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Also ich hab mich mit Bootloadern selbst noch nicht beschäftigt (beschäftigen müssen), aber meinem Verständnis nach reserviert die BOOTRST-Fuse nicht irgendwelche Speicherbereiche, sondern leitet ganz einfach nur die Reset-Adresse (also den Wert, der beim Reset in den Program Counter geladen wird) von Null nach "irgendwohin" um. "Irgendwohin" wird dabei durch die BOOTSZ-Fuses festgelegt (also 'ne konkrete Adresse). Was da für'n Code steht, ist eigentlich Wurscht (da muß weder irgendwelcher Code von irgendwo geladen werden, noch überhaupt irgndwelche Flash-Adressen beschrieben (programmiert) werden).
Aber die SPM-Instruction geht nur, aus diesem Bereich heraus.

Die Interrupt-Vektoren können übrigens auch in diesen Bereich umgeleitet werden, durch das IVSEL-Bit im GICR. D.h. im Bootloader können andere Interruptvektoren festgelegt werden, als später im Hauptprogramm wirksam werden sollen. (oder genauer: Mit IVSEL kannst Du quasi alternative ISRs implementieren, und zwischen denen zur Laufzeit umschalten lassen).

Der von Dir erzeugte Code enthält selbst keinen Bootloader (also besser gesagt keinen Code, der im entsprechenden Bereich landen soll), sondern eben nur 62 Words Instruktionen.
 
Zuletzt bearbeitet:

Dirk

Administrator
Teammitglied
28 Jan 2007
4.242
127
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
Hallo Hero,

dein Atmega8 hat 8kByte Programmspeicher (Flash memory).

Du hast aktuell 124Byte belegt, das sind 1,5% (allerdings vom gesamten Flash memory)
100%/8192Byte x 124Byte = 1,513%

.text +.data + .bootloader = Programm und Tabellen und Initialisierungen (Flash Memory)


Der Bootloader liegt am Ende des Flash Memory. Es gibt vier mögliche Einsprungadressen (dadurch ergeben sich vier Speichergrößen für den Bootloader).
Diese stellst du mit den Fuses BOOTSZ1 und BOOTSZ0 ein.

Dem Linker musst du noch mitteilen, ab wo er den Programmcode des Bootloaders ablegen soll.

Beispiel:
2kByte Bootloader
Startadresse 0xC00 (WORD) = 0x1800 (BYTE)
BOOTSZ1 = 0
BOOTSZ0 = 0
0 = programmiert

Toolchain
AVR/GNU Linker
General Options
-Wl,-section-start=.text=0x1800


Wenn du den Bootloader erstellt hast, kannst du dir die Position des Bootloader mit diesem Windows-Tool anschauen und kontrollieren ...

Dirk :ciao:
 

Hero_123

Mitglied
17 Sep 2010
79
2
8
Sprachen
C
Hallo Dirk, hallo LotadaC

Vielen Dank für Eure Hilfe!

@Dirk - ich habe mir Dein Tool "AVR-HexVierwer" runtergeladen und installiert und den Speicher meines ATMega8 ausgelesen und bin etwas irritiert - das Programm beginnt ab Adresse 0x0000 - das ist ja korrekt. Ich hatte aber erwartet, dass ab Adresse 0x1800 die Daten des Boot Loaders zu sehen wären (da der ATMega8 mit installiertem Boot Loader und den Einstellungen gemäß Deinem Beispiel geliefert worden war) - aber das ist nach 0x00980 nichts - alles 0xFF im AVR HexViewer .... komisch.

Daten waren gemäß AVR HexViewer nur von 0x0000 - 0x009800 vorhanden (was gemäß -lss file auch korrekt ist -Anzeige lss - file 0x9a2 <__stop_program>).

Fast sieht es so aus, als wäre da kein Boot Loader drauf (es handelt sich um das Board "myAVR Board MK2" des myAVR - shops http://shop.myavr.de/index.php?sp=artlist_kat.sp.php&katID=14)...

Na jedenfalls verstehe ich Deinen Post #3 so, dass ich die Einstellungen so machen muss:
Beispiel:
2kByte Bootloader
Startadresse 0xC00 (WORD) = 0x1800 (BYTE)
BOOTSZ1 = 0
BOOTSZ0 = 0
0 = programmiert

Toolchain
AVR/GNU Linker
General Options
-Wl,-section-start=.text=0x1800
wenn ich selbst einen Boot Loader drauf laden will mit max 1024 Worte.

Wenn ich nur mein normales Programm laden will, muß ich aber keine Adresszuweisung vornehmen, oder?

mfg

Hero_123
 

Anhänge

Dirk

Administrator
Teammitglied
28 Jan 2007
4.242
127
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
Hallo Hero,

anscheinend ist kein Bootloader programmiert, vielleicht hattest du den mal über ISP Programmierung gelöscht?!
(Dass du nur 0xFF liest, hat eventuell was mit Bootloader-Lockbits zu tun)

Kannst du denn ein Programm von dir über den Bootloader programmieren?

Wenn du keinen Bootloader nutzt, dann setzt du BOOTRST auf 1 (unprogrammiert, Resetadresse ist nun 0x0000). BOOTSZ1..0 sind dann egal.

Wenn du dein eigenes Programm erstellst, soll das ab Adresse 0x0000 starten, dann also keinen anderen Startpunkt angeben.

Erstellst du einen Bootloader der 1024 Word (2048 Byte) groß ist, musst du die Einstellungen so vornehmen, wie schon beschrieben.

Dirk :ciao:
 

Hero_123

Mitglied
17 Sep 2010
79
2
8
Sprachen
C
Hallo Dirk

Vielen Dank für Deine Hilfe :)

Ich habe es jetzt nochmal ausprobiert und bei meinem ATMega8 das BOOTRST auf 1 gesetzt - das Ding läuft OHNE Boot Loader (d.h.ich kann Programme ohne Boot Loader flashen)! Da ist tatsächlich kein Boot Loader programmiert, obwohl es bei "myAVR.de" etwas anders dargestellt wird ...(da wird immer empfohlen, den ATMega mit Boot Loader zu ordern)

Ich weiß jetzt jedenfalls Bescheid:
- bei mir ist kein Boot Loader programmiert, zum Flashen ist auch keiner nötig :)
- wenn ich (jemals) einen Boot Loader benötigen sollte, muß ich so vorgehen, wie Du es in #3 beschrieben hast.
- mein Programm startet bei 0x0000

Kein Boot Loader heißt dann aber auch für mich, dass ich die 8kB für mein Programm zur Verfügung habe :)

Achja - Dein AVR HexViewer - tolles Tool :good3:

mfg

Hero_123
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Ich habe es jetzt nochmal ausprobiert und bei meinem ATMega8 das BOOTRST auf 1 gesetzt - das Ding läuft OHNE Boot Loader (d.h.ich kann Programme ohne Boot Loader flashen)!
Die BOOTRST-Fuse wirkt sich (nur) auf den Start des Controllers nach dem Reset (also jeden echten Start) aus. Mehr nicht. Sie legt lediglich fest, ob der Controller den Flashinhalt ab Adresse 0x0000 ausführt, oder ab der durch BOOTSZ bestimmten Adresse.
Unabhängig von dieser Fuse kannst Du den Controller trotzdem via SPI-ISP programmieren (sofern SPIEN aktiv, und RSTDSBL inaktiv sind). Üblicherweise geht dem flashen via SPI-ISP ein Chiperase voraus, der dann je nach Boot-Lockbits auch den Boot-Bereich mit löscht.

Willst Du einen vorhandenen Bootloader verwenden, übernimmt der Loader ja das eigentliche Flashen - es wird nicht wie sonst üblich via SPI-ISP geflasht.
Wie dem Loader der Code zugeführt wird (und wie das Flashen gestartet wird) ist Sache des Loaders (also dem Code, der ab der, durch BOOTSZ festgelegten Adresse ausgeführt wird) . Meist über den UART, aber prinzipiell ist alles möglich: vorhandene Hardware-Schnittstellen, irgendwelche Software-implementierten Schnittstellen, was auch immer...
Achja - Dein AVR HexViewer - tolles Tool :good3:
Der wertet aber auch nur das zu programmierende HEX-File aus, also nicht, was sich wirklich (vorher) im Controller befindet. Ader hast Du den Controllerinhalt auslesen lassen, und das ausgelesene Hexfile ausgewertet?

Du Implementierst im Studio einen Bootloader, und flasht den via SPI-ISP ab einer der vier BOOTSZ-Adressen in den Flash, und setzt die BOOTRST-Fuse entsprechend.
Dieser Zustand ist ggf bei Deinem Controller bereits vorhanden gewesen.
Der Controller startet dann bei jedesmal mit dem Code des Loaders - Ziel ist dann normalerweise, zu flashenden Code zu laden, d.H. Du brauchst "PC-seitig" 'ne zum Loader passende Software, die mit dem Loader kommuniziert. Wird dieser Kontakt nicht hergestellt, startet der Loader "das normale Programm" oder korrekter: er springt zu Adresse 0x0000. Der Loader aknn natürlich weitere Bedingungen enthalten, zB daß irgend'ne Taste beim Start des Programmes gedrückt sein muß/ein Jumper gesteckt,...
 
Zuletzt bearbeitet:

Hero_123

Mitglied
17 Sep 2010
79
2
8
Sprachen
C
Hallo LotadaC

Vielen Dank für Deine Hilfe :)

Ader hast Du den Controllerinhalt auslesen lassen, und das ausgelesene Hexfile ausgewertet?
Ich habe den Flash Speicher meines ATMega8 auslesen lassen (wollte ja wissen, wo bzw ob ein Boot Loader implementiert ist - siehe auch #4).
Ich habe dann die Fuses ausgelesen:
- Low Fuses: FD
- High Fuses: D8
- Lock Bits: FF

=> BOOTRST Flag gesetzt (Boot Loader enabled), Lock Bits Mode1, BLB0 Mode1, BLB1 Mode => gemäß Atmel Doku bedeutet das ja "no Memory lock features enabled", "no lock on SPM and LPM in Application section","no lock on SPM and LPM in Boot section", d.h. für mich, dass ein evtl vorhandener Boot Loader überschrieben bzw beim Chip erase gelöscht wird, wenn ich mein Anwenderprogramm flashe (ich habe im AVR Studio angegeben, dass vor dem Flashen der Chip gelöscht wird)
Ich habe dann das BOOTRST Flag disabled, den Boot flash size von 1024 words habe ich gelassen
- Low Fuses: FD
- High Fuses: D9
- Lock Bits: FF

Geflasht wird der Prozessor mittels http://shop.myavr.de/Systemboards und Programmer/mySmartUSB MK2 (Programmer und Bridge).htm?sp=article.sp.php&artID=42 (der 10-polige ISP Stecker ist nicht aufgelötet, ich flashe per USB).

Wenn ich also (irgendwann mal zum testen) einen Boot Loader implentieren würde, müsste ich das BOOTRST Flag setzen, die Lock Bits entsprechend setzen und so vorgehen, wie Dirk in #3 beschrieben hat.

mfg

Hero_123
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)