Forum: Mikrocontroller und Digitale Elektronik Bootloader in Hauptprogramm integrieren


von Andrej (Gast)


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

von Peter D. (peda)


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

von Andrej (Gast)


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

von Peter D. (peda)


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

von mim (Gast)


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
1
#include <avr/boot.h>
2
3
BOOTLOADER_SECTION
4
void my_bootloader()
5
{
6
}

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.

von Stefan K. (_sk_)


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

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.