Forum: Compiler & IDEs bootloader section in c


von nurmi (Gast)


Angehängte Dateien:

Lesenswert?

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

von Wolfgang Horn (Gast)


Lesenswert?

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

von mthomas (Gast)


Lesenswert?

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

von nurmi (Gast)


Lesenswert?

@mthomas
supi, das wars. hab jetzt die section auf 0x3800 gesetzt und jetzt
funzt es.
thx

von Matthias (Gast)


Lesenswert?

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

von tripledot (Gast)


Lesenswert?

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

von Wolfgang Horn (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.