Ich versuche, einen einfachen Bootloader im High-End-Flash eines atmega8 zusammenzustellen. Der Loader kommuniziert mit minicom über das XMODEM-Protokoll, sucht nach Fehlern, schreibt die entsprechenden Flash-Seiten und verifiziert diese. All dies ist getestet und funktioniert.
Was nicht funktioniert, ist das Ausführen der Anwendung, nachdem sie geflasht wurde. Ich habe 4 Testfälle.
Wenn die Eingabedatei 1 KB mit 0x00- oder 0x01-Bytes ist, scheint die Programmausführung nach einem Kaltstart beim Bootloader zu beginnen, obwohl das BOOTSEL-Bit so eingestellt ist, dass es bei der Flash-Adresse 0x0000 beginnt und der Loader bei 0x1800 ist.
Wenn die Eingabedatei eine Binärdatei eines tatsächlichen Programms ist, hängt der Chip und es ist keine Kommunikation möglich. Ich habe es mit einer sehr einfachen und einer ziemlich komplexen Anwendung versucht, und das Ergebnis ist das gleiche.
avr-gcc app.c -o app.out
avr-objcopy -j .text -j .data -O binary app.out app.bin # doesn't work
avr-objcopy -j .text -j .data -O ihex app.out app.hex # works via an isp
.hex
Während beide Programme durch das Hochladen der Datei über einen systeminternen Programmierer auf Funktionsfähigkeit überprüft wurden , führt das Hochladen der .bin
Dateien zu dem erklärten Hängen.
Hier sind zum Beispiel die ersten paar Bytes der sehr einfachen Anwendung:
00000000 12 c0 24 c0 23 c0 22 c0 21 c0 20 c0 1f c0 1e c0 |..$.#.".!. .....|
Dies ist Big-Endian und wird vom Bootloader in Small-Endian konvertiert. Der Opticode eines RJMP ist 1100 kkkk kkkk kkkk
ein k
Offset von bis zu 2 kB. So 12 c0
wird c0 12
, was wird 1100 0000 0001 0010
. Die Vektortabelle ist also da.
Was könnte falsch sein? Mir gehen die Ideen aus. Und meine einzigen Debugging-Hilfen sind printf()
über uart und das Blinken einer LED - kein JTAG verfügbar. Wo soll ich nach der Lösung suchen?
In einer solchen Umgebung mit geringen Debugging-Ressourcen muss jedes Tool verwendet werden. In meinem Fall war dies der In-Circuit-Programmer . Ich habe es verwendet, um Bilder des Blitzes herunterzuladen.
sudo avrdude -p atmega8 -c usbasp -U flash:r:file_name:r
Dann dhex
wurde die Verwendung von Bytewertunterschieden offensichtlich, was zu dem Schluss führte, dass die Flash-Programmierfunktionen von avr-libc unsigned chars erwarten und ich signierte chars verwende.
Ja, mein allererster Bootloader funktioniert.
pjc50
John u
John u
Vorac
ihex
ist es auch ein für Menschen lesbares ASCII). Ich suche nach Überlauf des Bootsektors. Zu Ihrem zweiten Kommentar, dies ist ein sehr kleines Projekt, aber ein ausgeklügeltes Entwicklungsboard scheint der letzte Ausweg zu sein.Vorac
pjc50
John u