bootloader für ATmega162

Gast #75225
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

}
Gast #75226
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
Gast #75228
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
Gast #75230
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren