mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bootloader in Hauptprogramm integrieren


Autor: Andrej (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hall Leute, Der Bootloader an sich ist nichts neues. Bis jetzt habe ich 
Bootloader programmiert in dann mit Bootloader das Hauptprogramm 
geladen.
Nun möchte ich Bootloader als eine Funktion bzw. Satz von Funktionen 
schreiben und die dann in In Bootloader-Sektor platzieren. Der Booloader 
wird dann einfach aus dem  Hauptprogramm als Funktion aufgerufen. Es 
soll nur ein Code seien, kein extracode für Bootloader. Damit ich es 
einfach debugging kann.
Die Frage wie festlege ich wo mein Code im Programmspeicher liegen soll?
Mit BOOTLOADER_SECTION bzw. .bootloader habe ich probiert. Da bekomme 
ich die  Meldung: 
"C:\WinAVR\bin\..\lib\gcc\avr\3.4.6\..\..\..\..\avr\bin\ld.exe: section 
.bootloader [000049a2 -> 000049e3] overlaps section .data [000049a2 -> 
00004c9d]"
In der Docu habe ich Infos gefunden das Platzierung vom Code über Linker 
gehen soll. Da fehlen mir  leider die richtige Infos, wie das gehen soll

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andrej wrote:

> Der Booloader
> wird dann einfach aus dem  Hauptprogramm als Funktion aufgerufen. Es
> soll nur ein Code seien, kein extracode für Bootloader.

Du magst den Thrill (hoffentlich hab ich kein Bug in der neuen Version, 
hoffentlich sind die Daten korrekt, hoffentlich stolpert keiner übers 
Kabel, hoffentlich fällt nicht der Strom aus), stimmts?


Ein Bootloader sollte immer funktionieren, auch wenn das Hauptprogramm 
aus irgendeinem Grund buggy ist.

Daher sollte er eine komplett eigenständige Applikation sein, die nach 
nem Reset immer aktiv ist oder auch einfach aus der User-Applikation 
gestartet wird (jump Secondbootstart).


Peter

Autor: Andrej (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der separater Bootloader ist eben nicht das Problemm. Das Problem ist 
wenn ich Target über JTAG teste, ist der Booloader weg (da der 
Bootloader ist nicht ein Teil vom Hauptprogramm). Nachher muss ich 
wieder Bootloader programmieren und dann Hauptprogramm laden. Diese 
Umständlichkeit wollte ich vermeiden. Wenn mein Booloader nach debuggen 
nicht gelöscht wäre, wäre ich schon mal zufrieden. Dann wäre "jump 
Secondbootstart" auf jedem Fall interessant und könnte mit separatem 
Bootloader leben. Wird das so auch im Hauptprogramm geschrieben oder es 
ist nur ein Begriff?
Starten den Bootloader soll das Hauptprogramm. Das Programm soll halt 
eine Update Funktion bieten.
PS. Target ist M64

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andrej wrote:
> Der separater Bootloader ist eben nicht das Problemm. Das Problem ist
> wenn ich Target über JTAG teste, ist der Booloader weg

Ja, da gibts wohl keine Lösung, JTAG und Bootloader vertragen sich 
nicht.
JTAG kann den Flash wohl nur komplett löschen und nicht nur die 
benötigten Pages.


> nicht gelöscht wäre, wäre ich schon mal zufrieden. Dann wäre "jump
> Secondbootstart" auf jedem Fall interessant und könnte mit separatem
> Bootloader leben. Wird das so auch im Hauptprogramm geschrieben oder es
> ist nur ein Begriff?

Ist nur das Prinzip, die C-Syntax sieht etwas anders aus.

Peter

Autor: mim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade einen Bootloader im Hauptprogramm geschrieben und kann 
den auch prinzipiell debuggen (AVRStudio mit JTAGICE MkII).
Im AVRStudio musst du unter den Projekt Optionen die Memory Settings 
anpassen.
Memory Type: Flash Name: .bootloader Address: 0x7800 (bei mir und immer 
als word Adresse!)
Dann
#include <avr/boot.h>

BOOTLOADER_SECTION
void my_bootloader()
{
}

Falls du mehrere Funktionen hast, dann alle mit BOOTLOADER_SECTION 
kennzeichnen.
Von deinem Hauptprogramm kannst du jetzt mit my_bootloader() in den 
Bootloader Code wechseln und dort debuggen.
Ich habe am Anfang alle Flash Zugriffsfunktionen auskommentiert um 
zunächst sicherzustellen, dass der Rest (Download Protokoll) 
funktioniert. Danach alles aktiviert und es läuft.

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Vorschlag:

* Bootloader als eigenständige Applikation übersetzen.
* Output des Linkers auf binary stellen.
* Die Boot.bin in eine .c datei umwandeln, die ein progmem Array
  of uint8_t enthält mit dem kompletten Boot-Code.
* Dieses C-File bindest Du in Deine Firmware mit ein ->
  und hast damit automatisch den Bootloader mitgeladen.

uint8_t bootcode[] BOOTLOADER_SECTION = {
  0x01, 0x02, 0x03, 0x04,  // hier steht der Bootcode in Binärform
  0x05, 0x06, 0x07, 0x08   // nur Beispielbytes!
}

Vorteil dabei:

Du hast wie gewohnt eine komplett eigenständige Bootloader-Applikation - 
mit Startupcode, mit IR-Vektoren, etc.

Einziger Nachteil:

Den Bootloader selbst kannst Du innerhalb der Firmware nicht symbolisch 
debuggen - das würde auch schon deshalb Probleme machen, da es 2 main() 
gibt - die des Bootloaders und die der Firmware.


Viele Grüße, Stefan

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.