www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Bootloader


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: C. H. (_ch_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hans,

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

Gruß
Christian

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: C. H. (_ch_)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Gruß
Christian

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lindi (Gast)
Datum:

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

Gruss Lindi

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rudolph R. (rudolph)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.