Forum: Mikrocontroller und Digitale Elektronik AVR Bootloader


von Hans (Gast)


Lesenswert?

Moin,

ich versuche gerade einen Bootloader für meinen AVR in C zu 
programmieren. Meine ersten Versuche in ASM haben wunderbar 
funktioniert. Jetzt habe ich allerdings folgende Probleme welche sich in 
ASM einfach lösen ließen:

1) Wie springe ich in C an eine bestimmte Adresse ? D.h. wenn der 
Bootloader sich beenden soll habe ich in ASM einfach einen Sprung an 
0x0000 gemacht. Wie macht man sowas in C ?

2) Um herauszufinden ob ein Update der eigentlichen Firmware notwendig 
ist liest mein ASM-Bootloader die Firmwareversion an einer bestimmnten 
Adresse im Flash. Wie geht das in C ? In ASM war das einfach per LPM 
möglich. Die Version wurde im Hauptprogramm einfach per .ORG-Anweisung 
an eine bestimmte Adresse gelegt.

Danke.

von C. H. (_ch_)


Lesenswert?

Hallo Hans,

was spricht gegen ein paar Zeilen "Inline-Assembler" ?

Gruß
Christian

von Hans (Gast)


Lesenswert?

Prinzipiell ja nichts, aber kann ich da für das Problem 2) auch .ORG 
Benutzen dass das genau an der entsprechenden Stelle im Flash steht ? 
Weiß der C-Compiler dass er den entsprechenden Bereich aussparen muss ?

von C. H. (_ch_)


Lesenswert?

Das kann ich jetzt leider nicht beantworten, da ASM nicht meine Stärke 
ist...
Ich nutze in "C" immer das PROGMEM Attribut wenn ich Konstantenarrays 
oder Zeichensätze im Flash anlege bzw. aus dem Flash lese - siehe 
Tutorial;
Hilft dir das vllt. weiter?
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

Gruß
Christian

von Hans (Gast)


Lesenswert?

Das Tutorial hatte ich mir schon angeschaut. Dort legt aber der Compiler 
(oder wer auch immer) fest wo das Ding nachher im Flash liegt. Ich will 
es halt an einer bestimmten Stelle haben. Muss es ja im Bootloader von 
genau dieser Stelle lesen.

von Lindi (Gast)


Lesenswert?

zu 1):
...  asm volatile ("jmp 0"); /* asm-inline */

Gruss Lindi

von Hans (Gast)


Lesenswert?

So hatte ich mir das dann auch gedacht. Jetzt hab ich nur noch das 
Problem mit C an eine bestimmte Stelle im Flash einen Wert abzulegen. 
Hat da einer Rat ?

von Stefan E. (sternst)


Lesenswert?

Ich sehe da zwei Möglichkeiten:

1) Pack die Variable in eine separate Section und weise den Linker an, 
diese Section an eine bestimmte Adresse zu packen.

2) Lass Compiler und Linker aus dem Spiel und "bastle" (z.B. mit einem 
Shell-Script) die Versionsinfo direkt in das HEX-File. Dessen Format ist 
ja nicht soo kompliziert.

von Rudolph R. (rudolph)


Lesenswert?

In der Code-Sammlung gibt es Bootloader in C für den AVR, einfach mal 
reinschnuppern was die machen.

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.