ich wollte in c einfach mal die funktionalität des bootloaders ausprobieren und hab darum zwei funktionen geschrieben, die eine (main()) sitzt nach dem reset-vektor und die zweite (loader()) an der ersten bootloader einsprungadresse (0x1c00). wenn ich den code mit avr-gcc compiliere läuft alles ohne fehler ab, das lst-file schaut meiner meinung auch nicht schlecht aus. das programm startet allerdings immer an der adresse 0x0000, auch dann wenn ich die boot-fuses auf den bootloader(0x1c00) setze. mach ich beim linken irgend was falsch? kann mir jemand weiterhelfen? ich kompiliere mit avr-gcc 3.3.2 und flashe das ganze mitn stk500 auf einen mega16
Hi, nurmi, Ich habe dies Thema selbst unterschätzt. Es ist mir zu kompliziert für a) einfachen Rat, b) den "Wizzard" meiner IDE, der verspricht, mir all die Überlegungen abzunehmen, mich bei Unstimmigkeiten aber hilflos läßt. Lies das Datenblatt genau durch und insbesondere die AVR Application Note 109. 1. Setz mit JTAG ICE oder STK500 die BOOTRST-Fuse. 2. Sorge für eine passende Interrupt-Behandlung - Du brauchst zwei Tabellen Interrupt-Vektoren, eine in der Application Section, die andee in der Bootloader-Section. Ciao Wolfgang
Die Einstellung 0x1C00 fuer die Startadresse des Bootloaders duerfte die Word-Adresse lt. Datenblatt sein. Der avr-gcc nutzt aber Byte-Adressen. Die section sollte in dem Fall also bei 0x1c00*2 starten. Zwei Interrupt-Vektoren sind nicht erforderlich, wenn man im Bootloader-Code keine Interrupts benoetigt und diese global sperrt. Martin
@mthomas supi, das wars. hab jetzt die section auf 0x3800 gesetzt und jetzt funzt es. thx
Hi sei dir aber im klaren das das nur funktionieren wird wenn du ein sehr simples Programm (ohne Funktionen und Interrupts) in der Bootloader-Section hast. Dir fehlen nämlich in dieser Section INT-Vektoren und der Startupcode (SP Initialisierung, Variableninitialisierung). Ich gehe bei sowas immer so vor das ich zwei getrennte Programme erstelle (Bootloader und Applikation). Die Bootloaderapplikation verschiebe ich dann per Linkerkommando an den Start der Bootloader-Section. Abschließend bastelt dann ein (sehr) kleines Perl-script aus den zwei HEX-Dateien eine gemeinsame HEX-Datei mit beiden Programmen. Matthias
Hallo... Kann mir jemand sagen, wo ich so ein Script herbekmmen kann? Oder verraten, was so ein Script genau macht. Einfaches Kopieren-Zusammenfügen wirds wohl nicht sein.. Im Moment sitze ich an einer Sache, in der es quasi darum geht eine Umgebung zu erstellen, mit der man über I2C ein Programm in verschiedenartige Slavemodule zu laden. Mein Problem ist jetzt, dass nur das Prinzip steht, aber weder auf Hostseite Code vorhanden ist, noch auf der Slave Seite. Da ich das ganze mehr oder weniger parallel aufziehen muss, würde es mir helfen, in die Slaves 2 separate Programme (Bootloader und eigentliches Hauptprogram, dass I2C Befehle auswerten muss und ggf. den Bootloader aufruft). Vielleicht kann mir einer den entscheidenden Hinweis geben? Gruß.
Hi, "..." :-), Du: "mit der man über I2C ein Programm in verschiedenartige Slavemodule zu laden...." Du benötigst folgende Funktionen: 1. I2C-Loader, der eine Hex-Datei, das Produkt des Linkers, von der Festplatte des Entwicklungssystems liest und zu den Targets sendet. 2. I2C-Bootloader in der Bootloader-Section der Targets. Dieser Empfängt die Daten vom I2C-Loader und schreibt sie in die Application Section. Schau Dir all die Bootloaders an, jeder Entwickler hat auch sein Host-Programm dazu vorgestellt oder gezeigt, wo man es bekommen kann. Ich habe viel gelernt und übernommen von "Megaload" von Sylvain Bissonnet, guck hier: http://www.microsyl.com/megaload/MegaloadforAVR.pdf Ciao Wolfgang Horn
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.