www.mikrocontroller.net

Forum: Compiler & IDEs bootloader section in c


Autor: nurmi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: nurmi (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tripledot (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß.

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.