Forum: Compiler & IDEs Bootloader Programmierung


von Wolfgang (Gast)


Lesenswert?

Hallo allerseits

Ich beschäftige mich gerade mit dem Schreiben eines Bootloaders für
einen Atmega64 und benutze hierfür den GNU-Compiler.

Hierbei stellen sich mir folgende Fragen:
Dürfen Bootloader und Applikation in einem Projekt angelegt und gelinkt
werden?

Wie muss ich einen Interrupt deklarieren, damit dieser in der 2
Vectortabelle (Bootloader-Section) durch den Linker erzeugt wird?

Wolfgang

: Gesperrt durch Moderator
von Joerg Wunsch (Gast)


Lesenswert?

> Dürfen Bootloader und Applikation in einem Projekt angelegt und
> gelinkt werden?

Im Prinzip schon.

Aber: es geht nur über verschieden benannte sections.  Falls Du mit
AVR Studio simulieren willst, solltest Du bedenken, daß AVR Studio nur
den Inhalt der section .text laden und simulieren kann.

> Wie muss ich einen Interrupt deklarieren, damit dieser in der 2
> Vectortabelle (Bootloader-Section) durch den Linker erzeugt wird?

Die Bibliothek liefert nur eine Vektortabelle, die zweite mußt Du
selbst anlegen (gcrt1.S clonen).  Diese müßtest Du in eine andere
section als .text legen.  Hab's noch nicht probiert, aber ich denke,
daß Du mittels __attribute__((section(...))) auch eine Deklaration
eines Interrupt-Vektors entsprechend behandeln kannst.

von Peter D. (peda)


Lesenswert?

Da man ja bei einem Bootloader keine komplexe Speicherverwaltung oder
Rechenoperationen braucht, habe ich meinen gleich in Assembler
geschrieben.

Man muß da ja eh sehr Hardware nah programmieren.
Z.B. müssen Register (R0, R1, R30, R31) direkt manipuliert werden. Die
dürfen dann auch nicht versehentlich durch anderen Code verändert
werden.

Auch sind die Zeitlimit geschützten Zugriffe in Assembler einfacher zu
erstellen (kann der GCC sowas überhaupt).


Und um das gründliche Lesen des Datenblattes kommt man auch nicht
herum.
Ich bin z.B. darauf reingefallen, daß man jedes Byte im Schreibpuffer
nur einmal beschreiben kann (steht nur ganz versteckt drin).


Peter

von Wolfgang (Gast)


Lesenswert?

Hallo

@Joerg Wunsch

mit den Verschiedenen Section klappt recht gut,
aber wie ich die Vector-Definitionen „klonen“ kann, verstehe ich leider
nicht.

Habe zur Zeit folgendes ausprobiert:

#define PROGSECTION(name) _attribute_ ((section ("."#name)))

PROGSECTION(bootloader)
void FunktionReturn( void )
{  return;    }

PROGSECTION(BootloaderVector)
void IntVecTab2( void )
{
    _asm__ __volatile_
    (
      "jmp BootLoader_main\n\t"    //Vector00  Reset_Vector
  "jmp FunktionReturn\n\t"    //Vector01  SIG_INTERRUPT0
  "jmp FunktionReturn\n\t"    //Vector02  SIG_INTERRUPT1
...
  "jmp Uart_Data_Int\n\t"    //Vector19  SIG_UART0_DATA
  usw.


PROGSECTION(bootloader)
void Uart_Data_Int (void) _attribute_ ((signal));
void Uart_Data_Int (void)
{  return;    }

Dieses Funktioniert auch, nur leider kann ich so nicht  gleichzeitig
mit dem SIGNAL(SIG_UART0_DATA) oder SIGNAL(Boot_ SIG_UART0_DATA)
arbeiten.

Kannst du mir vielleicht noch einen Tipp für das Klonen der
Vectortabelle geben?

Gruß Wolfgang

von Fiffi (Gast)


Lesenswert?

Hallo,

hat von euch schon mal jemand einen mit GCC kompilierten Bootloader mit
dem AVR-Studio simuliert ?

Ich habe einfach die .text section verschoben mit:
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref,--section-start=.text=0x3C00

Das verschieben funktioniert auch. (Im Disassembler nachgesehen ...)


Beim ersten "Einzelschritt" fängt das Programm an zu laufen. Wenn ich
es dann mit "Pause" unterbreche, steht es wie vorher auf:

=> int main(void)
{
...

Im Disassembler kann ich durch das Programm steppen.

Ich have AVR-Studio 4.08 build 310 und WinAVR 20030913 verwendet.


Hat von euch jemand ähnliche Probleme ?


Fehlt in der boot.h ein Makro um die Interruptverktoren auf die
Boot-Section umszustellen, oder habe ich etwas übersehen ?


Gruß

Fiffi

von eugen dischke (Gast)


Lesenswert?

hi all,
ich war vor langer zeit auch damit beschäftigt mir ein bootloader zu
schreiben, jedoch bin ich kläglich gescheitert. mir fehlten einfach zu
viele infos,
kann mir einer von euch sagen, wo ich z.B. die ID des jeweiligen avr's
finde, also die zahl, die AVRProg mittteilt ich bin ein mega 8 oder ein
mega 16... usw bzw nuzt ihr andere programme um den code in den avr zu
laden?
MfG
eugen d

von Fiffi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Eugen,

>die ID des jeweiligen avr's finde, also die zahl, die AVRProg
>mittteilt ich bin ein mega 8 oder ein mega 16... usw

In einem Forum auf www.avrfreaks.net gab es letztens einen Thread
darüber.

Hier der Link zum Thread:
http://www.avrfreaks.net/phorum/read.php?f=3&i=45870&t=43651#45870


Gruß

Fiffi

von Joerg Wunsch (Gast)


Lesenswert?

Der Thread ist ziemlich länglich, aber ich sehe dort nichts, was wie
die Atmel device signature aussieht.  Vielmehr war wohl die Rede von
den AVR910 device IDs.

Meiner Erinnerung nach gibt es nichts, wie man die signature im
laufenden Betrieb lesen kann.

von Wolfgang (Gast)


Lesenswert?

Hallo Fiffi

Die Vektortabelle stellst du mit folgendem Befehl auf die
Bootvektortabelle: (IVSEL-Flag)
  MCUCR  = 0x01;
  MCUCR  = 0x02;

Es gibt zur Zeit scheinbar keine vordefinierte Bootvektortabelle!
Du musst dir diese selber erzeugen.
Wie dieses gehen kann, zeigt mein Beispiel vom 08.01 (siehe oben).

Ich hoffe du kommst damit klar, wennn nicht Melde dich nochmal

Gruß
    Wolfgang

Beitrag #4962519 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.