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
> 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.
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
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
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
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
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
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.
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.