Forum: Compiler & IDEs bootloader für ATmega162


von Martin Raffelsieper (Gast)


Lesenswert?

Hallo!

ich versuche mich gerade damit, einen Bootloader zu schreiben.

Die Routine "bootloader()" soll in der Bootloader-Section landen,
damit nach reset dorthin gesprungen wird, wenn die Fuse gesetzt ist.

Dazu muss ich dem Linker doch sicher noch eine Adresse angeben, aber
wie??
Ist das überhaupt so richtig, wie ich es versuche?

Gruß Martin


Das untenstehende habe ich mal probehalber compiliert, die Routine
liegt aber anschliessend im Normalen Speicher



#include <avr/io.h>
#include <avr/ina90.h>
#include <avr/interrupt.h>
#include <avr/boot.h>
#include <avr/signal.h>


BOOTLOADER_SECTION


void bootloader( void );

void bootloader( void )
{
::::
hier soll mal code hinein, um
 - das Flash zu löschen
 - neu zu beschreiben
 - anschliessend nach RESET zu Springen

}

von Georg (Gast)


Lesenswert?

Hallo!

Du must im Makeile angeben, wo Dein Code landen soll. Und zwar bei den
Linker-Flags. Bei mir (WinAVR) sieht das dann so aus:

LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -Ttext=0x1F000

-Ttext gibt dann an, an welcher Adresse der Code starten soll.

Gruß, Georg

von Martin Raffelsieper (Gast)


Lesenswert?

danke georg, das werde ich mal versuchen.


Gruß Maartin

von Martin Raffelsieper (Gast)


Lesenswert?

Hallo Georg
Es funktoniert!

Aber wie schaffe ich es denn, dass bei einem Programm, welches aus
einem "Hauptteil" und einem "Loaderteil" besteht, dass der
Hauptteil bei 0x0000 und der Loaderteil z.b. bei 0x1F80 anfängt??

mit der -Ttext -angabe verschiebe ich ja immer nur einen
zusammenhängenden block??!!


Gruß martin

von Shane (Gast)


Lesenswert?

würde mich auch interessieren wie man das hinbekommt


habe schon

avr-objcopy [...]  --change-section-address .bootloader=0x1234  [...]

probiert, aber funktioniert leider nicht wie gewünscht

von Matthias (Gast)


Lesenswert?

Hi

das steht in der AVRlibc beschrieben wie sowas geht.
http://www.nongnu.org/avr-libc/user-manual/index.html

Es wird aber nicht funktionieren wenn du beim Reset direkt in die
Bootloader-Section springst da der komplette Startup-Code nicht dort
liegt. Ich löse das so das der Bootloader eine extra Anwendung ist die
ich per Linkerkommando an die Bootloaderadresse verschiebe. Für den
Release bau ich mir dann mittels Shellscript aus Applikation und
Bootloader eine gemeinsames HEX-file.

Matthias

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.