Hallo,
ich bin gerade dabei einen Bootloader zu schreiben. Um erst einmal zu
lernen man mit dem Flash-Speicher umgeht, habe ich folgende Funktion im
Bootloader, die eine Test-Applikation (LED blinken lassen) in den
Anwendungs-Speicher-Bereich des Flash schreiben soll:
Erst einmal Danke, Stefan. :-)
Was für eine Adresse will boot_page_write(...) denn haben? Eine Byte-
oder eine Word-Adresse? Geschrieben wird ja immer ein Word, wenn ich das
richtig sehe.
Du kannst nicht erst alles füllen und dann alles schreiben. Oder
erwartest du tatsächlich, dass es einen Zwischenpuffer in der vollen
Größe des Flash gibt?
Jetzt hast du beim page_write ja wieder eine "Page-Nummer". Und warum
eigentlich immer "32"? Deine Rückleseversuche legen eigentlich nahe,
dass eine Page 64 Bytes hat.
jacky schrieb:
> jetzt habe ich nochmal auf Deinen Rat hin den Code geändert:
Und mittlerweile bist du bei einer etwas kruden Struktur angekommen.
Warum hast du nicht die Struktur deiner ersten Version beibehalten?
> Ergebnis: Falscher Flash-Inhalt. :-(
Ja, die ersten beiden Bytes beider Pages sind falsch. Und ehrlich gesagt
sehe ich so auf Anhieb nicht, warum. Vielleicht ein merkwürdiger
Seiteneffekt des unnötigen boot_spm_busy_wait() nach jedem
boot_page_fill()? (kann ich mir aber eigentlich nicht vorstellen)
Es ist mir etwas unangehm, ja fast peinlich, dich zu bitten, nachdem Du
mir schon so viel Unterstützung gegeben hast, meinen Code einmal
"sauber" aufzuschreiben. Vielleicht gibt es ja schon eine vordefinierte
Konstante für die Page-Größe oder ähnliches.
Danke im Voraus,
der überaus dankbare Jacky
So ganz "sauber" ist das aber auch nicht, denn der Code geht davon aus,
dass data ein ganzzahliges Vielfaches der Page-Größe enthält,
ansonsten wird die letzte Page mit Müll aufgefüllt.
Daraufhin habe ich einen kleinen Fehler korrigiert, denn sizeof(data)
gibt ja die größe des Arrays in Byte zurück und habe die äußere
For-Schleife folgendermaßen modifiziert:
Aus
matze schrieb:
> Daraufhin habe ich einen kleinen Fehler korrigiert, denn sizeof(data)> gibt ja die größe des Arrays in Byte zurück und habe die äußere> For-Schleife folgendermaßen modifiziert:
Ups, sorry, als Korrektur solltest du aber einfach das *2 weglassen.
> Leider immernoch falsch. :-(
Ja.
data[i]
->
data[page_addr/2+i];
jacky schrieb:
> Sind da etwa alle Bytes in den Wörtern verdreht?
Natürlich, der AVR ist Little Endian.
> ich habe noch schnell ein paar Zeilen zum Drehen der Bytes eingefügt:
Wie wäre es statt dessen, data passend zu füllen? Oder das ganze auf
Byte-Basis zu machen, statt auf Word-Basis?
Wie gesagt, das ist ja erstmal zum testweise beschreiben des AVR. Jetzt
wird dann langsam ein "richtiger" Bootloader draus. :-)
Aber eine Frage noch: Warum funktioniert
Nochmal, diesmal korrekt formatiert:
------------------------------------
Wie gesagt, das ist ja erstmal zum testweise beschreiben des AVR. Jetzt
wird dann langsam ein "richtiger" Bootloader draus. :-)
Aber eine Frage noch: Warum funktioniert
1
void(*jump_to_app)(void)=0x0000;
2
3
voidwrite_app()
4
{
5
intdata[]=
6
{
7
// ...
8
};
9
10
cli();
11
12
for(...)
13
{
14
//...
15
}
16
17
jump_to_app();
18
sei();
19
}
nicht?
Das hat zur Folge, dass der Bootloader immer wieder neustartet. Wenn ich
dann allerdings das Fusebit BOOTRST lösche und den ATmega neustarte,
dann startet die Anwendung ganz normal. Es scheint, als würde er an den
Anfang des Bootloaders springen. Warum?
Hallo,
ich habe bei mir ebenfalls ein Problem mit dem schreiben der Seite. Ich
möchte ein Word-Muster (0x1234) eine Seite lang an den Anfang des Flashs
schreiben... wenn ich mir abschließend einen Hexdump vom Flash erstelle
(per AVR-Studio), dann kann ich dieses Word-Muster allerdings nicht
wiederfinden :-(
Mal abgesehen davon, dass bei mir wahrscheinlich auch das little-Endian
Problem zuschlägt, hätte ich zunächst mal gern irgend etwas in meinem
Flash stehen gesehen...
wo liegt mein Fehler?
Danke für Eure Hilfe,
Gruß Stephan