Forum: Mikrocontroller und Digitale Elektronik Bootloader UND application in den Flash speichern (ATmega164)


von bootie (Gast)


Lesenswert?

Hallo,

ich habe ein Projekt im AVR-Studio4, welches einen Bootloader.hex 
erzeugt und mir per "external makefile" die Daten in den Flash vom 
Microkontroller schreibt. Beim anschließenden Auslesen sehe ich, dass er 
an der richtigen Stelle geschrieben wurde.

Dann habe ich noch die eigentliche Software, welche ich mit dem vom 
AVR-Studio generierten makefile kompiliere. Flashen funktioniert auch 
hier und beim Auslesen sehe ich, dass er den Code brav ab Adresse Null 
geschrieben hat.

Das blöde ist nur, der andere Bereich wird dann wieder im Flash 
überschrieben. Ich habe nun zwar im Forum gelesen, dass ich die Bereiche 
auch im AVR-Studio unter den Einstellungen "Project Options -> Memory 
Settings" einstellen kann, aber wenn ich dort einen Speicherbereich 
reinschreibe, wird dieser trotzdem wieder überschrieben. Kann mir jemand 
sagen welche Einstellungen ich dort machen muss? Um mich nicht mit einem 
eigenen makfile rumärgern zu müssen würde ich es gerne im AVR-Studio 
machen, habe für die Speicheraufteilung aber nichts finden können.

von Oliver J. (skriptkiddy)


Lesenswert?

1. Chip Erase durchführen

2. Bootloader flashen ohne Chip Erase

3. Programm flashen ohne Chip Erase


Dann sollten beide im Flash sein.




Gruß Skriptkiddy

von Christian R. (supachris)


Lesenswert?

Außerdem muss man natürlich den Linker anweisen, den Bereich, in dem der 
Bootloader sitzt, bei der Applikation nicht zu benutzen.

von bootie (Gast)


Lesenswert?

Skript Kiddy schrieb:
> 1. Chip Erase durchführen
> 2. Bootloader flashen ohne Chip Erase
> 3. Programm flashen ohne Chip Erase

Danke, so funktioniert es. Ich habe nicht beachtet, dass das Häckchen 
gesetzt war, dass AVR-Studio den Chip immer "ereasen" soll, bevor er 
programmiert.



Christian R. schrieb:
> Außerdem muss man natürlich den Linker anweisen, den Bereich, in dem der
> Bootloader sitzt, bei der Applikation nicht zu benutzen.

Du meinst doch jetzt den Fall, wenn ich ein eigenes makefile schreiben 
würde. Oder? Ich wollte es eigentlich über die GUI lösen.

von Detlev T. (detlevt)


Lesenswert?

Hallo Leute,

Frage am Rande: Kann man eigentlich Applikation UND Bootloader nicht 
auch zusammen kompilieren? Und falls ja: Wie macht man das? (Also dass 
der Bootloader-Code an der richtigen Stelle landet?)

Gruß, DetlevT

von Thomas E. (thomase)


Lesenswert?

Detlev T. schrieb:
> Frage am Rande: Kann man eigentlich Applikation UND Bootloader nicht
>
> auch zusammen kompilieren? Und falls ja: Wie macht man das? (Also dass
>
> der Bootloader-Code an der richtigen Stelle landet?)

Nicht wirklich. Den Bootloader dort ins Flash zu packen, wo er hingehört 
ist die eine Sache, die andere ist dort auch die Vektortabelle und die 
Initialisierung anzulegen.

Wenn der Bootloader nur ein Teil der Anwendung ist, fehlt das erstmal 
völlig und muß dann "per Hand" eingebaut werden. Wobei sich der 
C-Compiler dabei nicht sonderlich kooperativ zeigt. An dieser Stelle ist 
der µC auch noch kein Rechner, der C-Programme abarbeiten kann.

Da geht's dann nur noch mit Assembler weiter.

Der Controller ist zwar eigentlich durch die Anwendung initialisiert. 
Aber nach einem fehlgeschlagenen Upgrade muß das der Bootloader 
übernehmen. Deswegen nimmt man zwei unabhängige Programme.

mfg.

von Volker Z. (vza)


Lesenswert?

Detlev T. schrieb:
> Frage am Rande: Kann man eigentlich Applikation UND Bootloader nicht
> auch zusammen kompilieren?

Nein.
Aber man kann die Hex-files zusammen packen.
http://www.digipedia.pl/man/doc/view/srec_cat.1/

volker

von Arno F. (binary)


Lesenswert?

Volker Zabe schrieb:
> Detlev T. schrieb:
>> Frage am Rande: Kann man eigentlich Applikation UND Bootloader nicht
>> auch zusammen kompilieren?
>
> Nein.
> Aber man kann die Hex-files zusammen packen.
> http://www.digipedia.pl/man/doc/view/srec_cat.1/
>
> volker

Also ich habe einen Bootloader in C und das Programm zusammen in einem 
Projekt und es Funktioniert. Ich habe dann für Updates das Projektfile 
vom AVR-Studio (4.18) kopiert und in diesem dann den Bootloader 
herausgenommen.
Ich kann dann über I2C das untere Programm Updaten und zwar ganz 
einfach. Über I2C gebe ich den Befehl verlasse das Programm und befinde 
mich dann im Bootloader.
Nach dem Update lasse ich mir den Status des Updates geben. War alles 
erfolgreich gebe ich den Befehl verlasse den Bootloader und das Programm 
Arbeitet wieder. Beim Booten wird die Checksumme überprüft und wenn sie 
korrekt ist geht es vom Bootloader aus direkt in das Hauptprogramm.

Das ganze läuft auf einem Atmega 88pa mit 8 KByte und der Bootloader 
Startet bei 0x1C00. Der C-Bootloader kommt so mit 1 KByte aus. Viel 
Platz ist allerdings nicht mehr aber seine Funktion wird ja erfüllt und 
die Kommunikation wie schon erwähnt läuft über I2C. Dafür gibt es schon 
sehr günstige USB-Adapter für Windows so das ein Update über PC genauso 
weinig ein Problem darstellt wie ein Update über einen Master-Controller 
(Renesas oder ähnlich) welcher dieses Interface Board dann Updaten kann.

Also ist die gemachte Aussage über Bootloader und Programm in einem 
gemeinsamen C Projekt mit AVR-Studio nicht ganz Richtig so, hat 
allerdings ein wenig Schweiß gekostet bis es lief ohne den knappen 
Speicher zu Sprengen.
Ausserdem hat dieses Thema hier im Forum schon einmal jemand angerissen 
und in einem Beitrag wurde genau diese Idee auch dargestellt. Allerdings 
nicht so das sich daraus gleich alles ableiten lies.
Ich musste es im Rahmen eines zu erstellenden Treibers, der vorher in 
Assembler mit Bootloader und Programm in einem Assembler Projekt 
existierte, auf C übertragen. Also in Assembler geht es deutlich 
einfacher aber es sollte alles nach C hochgezogen werden auch wegen der 
leichteren Wartbarkeit. Es gab einige Hürden zu nehmen über die man in 
Assembler nicht nach zu Denken braucht.


mfg

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.