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.
Hallo Hans, was spricht gegen ein paar Zeilen "Inline-Assembler" ? Gruß Christian
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 ?
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
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.
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 ?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.