Hallo, ich nutze AVR-Studio und habe ein kleines Programm für den ATmega8 geschrieben, dass ich gerne im Boot-Bereich des Flashs ablegen möchte und auch von dort aus direkt nach einem Reset ausführen möchte. Das Programm lässt nur eine LED blinken. Es funktioniert auch ganz prima. Später soll es zu einem Bootloader ausgebaut werden. Wenn ich jetzt bei den Projekteinstellungen unter "Memory Settings" die Zeile "Flash .text 0xc00 hinzufüge", dann sieht auch die Hex-Datei korrekt aus: Der Programmcode liegt nicht mehr am Anfang sondern am Ende in der Hex-Datei. Der Bereich vor dem Programmcode ist mit FF gefüllt. Bei den Fusebits habe ich unter BOOTSZ folgende Einstellung: "Boot Flash size=1024 words Boot address=$0C00" Außerdem setze ich noch den Haken bei BOOTRST. Leider startet mein Programm nicht. Meine bisheringe Fehleranalyse: Ich habe die Einstellung bei "Memory Settings" wieder rückgängig gemacht, sodass das Programm wieder am Anfang der Hex-Datei steht. Wenn ich es jetzt flashe, startet es auch sofort. Und zwar unabhängig davon, ob ich BOOTRST gesetzt habe oder nicht. Das finde ich komisch, da ich erwartet hätte, dass wenn BOOTRST gesetzt ist, das Programm nicht startet, da der Einstiegspunkt in einem Bereich liegt, der keinen Programmcode enthält. Danke, heinz
heinz schrieb: > Wenn ich es jetzt flashe, startet es auch sofort. Und zwar unabhängig > davon, ob ich BOOTRST gesetzt habe oder nicht. > Das finde ich komisch, da ich erwartet hätte, dass wenn BOOTRST gesetzt > ist, das Programm nicht startet, da der Einstiegspunkt in einem Bereich > liegt, der keinen Programmcode enthält. Das ist schon ok so. Die FFs dort werden als NOP interpretiert, und am Ende vom Flash springt der PC um auf Adresse 0 und dein Programm startet. Blinkt die LED vielleicht mit Hilfe eines Timer-Interrupts?
nein, die LED blinkt folgendemaßen:
1 | while(1) |
2 | {
|
3 | LED_AN; |
4 | _delay_ms(250); |
5 | LED_AUS; |
6 | _delay_ms(250); |
7 | }
|
Hast du auch nach dem Programmieren mal kontrolliert, ob der Code komplett ist und an der richtigen Stelle gelandet ist? Es gab eine AVR-Studio-Version, die wegen eines Bugs das Hex-File nicht korrekt programmiert hat, wenn es nicht an 0x0000 angefangen hat.
Wenn ich den Flash auslese, dann sehe ich, dass das Programm definitiv an der richtigen Stelle gelandet ist (Adresse 1800).
Also bei mir hab ich bei den Linker Options die Zeile -Wl,--section-start=.text=0x1800 für den Bootloader. Klappt wunderbar damit. Bei dir müssts dann eben -Wl,--section-start=.text=0x0C00 sein.
Müsste es gerade nicht und vielleicht liegt auch da der Hase im Pfeffer. Ich zitiere mal: > Bei den Fusebits habe ich unter BOOTSZ folgende Einstellung: "Boot Flash > size=1024 words Boot address=$0C00" Das sind *Wort*Adressen. Wird die gcc-Toolchain eingesetzt, müssen die Werte verdoppelt werden, Bootgröße ist 2 kBytes, und es kommt --section-start=.text=0x1800 heraus.
Hazeh Zimmerer schrieb: >> Bei den Fusebits habe ich unter BOOTSZ folgende Einstellung: "Boot Flash >> size=1024 words Boot address=$0C00" > > Das sind *Wort*Adressen. Wird die gcc-Toolchain eingesetzt, müssen die > Werte verdoppelt werden, Bootgröße ist 2 kBytes, und es kommt > --section-start=.text=0x1800 heraus. Das AVR-Studio macht diese Verdopplung selber. Man muss also bei den "Memory Settings" tatsächlich 0x0c00 eintragen. Und er hat ja auch schon bestätigt, dass der Code bei 0x1800 liegt.
Kann mir mal einer eine Hex-Datei für den ATmega erstellen, die z.B. einen Doppelblitz macht, wenn der Code im Bootloaderbereich ausgeführt wird und einen Einzelblitz, wenn der Code im "normalen" Flash ausgeführt wird? So könnte ich die Funktion von BOOTRST überprüfen. Ich danke im Voraus für die Unterstützung! :-) P.S.: Die LED hängt an PC1.
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.