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