Kann mir bitte jemand erklären, warum das unten stehende Programm nicht funktioniert? Das Programm ist für einen M8 und ich benutze die neuste Version von WinAVR. Ich will mir einen Boot Loader für den M8 schreiben und habe dazu dieses kleine Testprogramm verfasst. Das Programm wird an die Adresse 0x0c00 gelinkt und funktioniert auch soweit (Toggle Bit am Programmende für einen Frequenzmesser und .lss-Datei überprüft). Wenn ich das Flash mit PonyProg auslese nachdem das Programm gestartet wurde, stehen an Adresse 0x0100 nur FF's. Ich habe mal manuell einige Werte ab Adresse 0x0100 eingegeben, mit PonyProg ins Flash zurückgeschrieben, dass Programm gestartet und danach das Flash wieder ausgelesen. Es standen immer noch die Werte ab der Adresse 0x0100 die ich zuvor dort manuell eingegeben habe. D.h. die Löschfunktion boot_page_erase( address ); wird schon nicht ausgeführt! Gruß Jürgen #include <avr/io.h> #include <avr/boot.h> #include <avr/pgmspace.h> #include <avr/interrupt.h> unsigned char buffer[64]; int main(void) { unsigned char c, *p; unsigned int i; unsigned long address = 0x100L; p = buffer; for(c=0;c<64;c++) *p++ = c; cli(); eeprom_busy_wait(); boot_page_erase( address ); boot_spm_busy_wait(); for( c=0, p=buffer; c<SPM_PAGESIZE; c+=2 ) { i = (unsigned int)*p++; i += (unsigned int)(*p++ << 8); boot_page_fill( address+c, i ); } boot_page_write( address ); boot_spm_busy_wait(); DDRB |= PB2; for(;;) { PORTB |= PB2; PORTB &= (~(PB2)); } return(0); }
> Das Programm wird an > die Adresse 0x0c00 gelinkt. Die boot loader section beginnt aber frühestens bei 2 * 0xc00 (= 0x1800). Das Datenblatt nennt Wortadressen, die GNU Toolchain arbeitet mit Byteadressen.
Ja, stimmt! Danke @Jörg, die Linkadresse mus 0x1800 sein! Gruß Jürgen
Ich frage gleich kurz hier, dafür einen neuen Thread zu erstellen wäre einfach nicht sinnvoll; daher: Heisst das "1024words" im Datenblatt für den mega8 nun, dass ich maximal 2048 bytes in die Bootsection quetschen kann? Angenommen GCC sagt mir section .text 1838, passt das dann noch, oder wie kann ich das verstehen? Nik
> Heisst das "1024words" im Datenblatt für den mega8 nun, dass ich > maximal 2048 bytes in die Bootsection quetschen kann? Ja, die AVR-Datenblätter bezeichnen die Codegrößen immer in 16-bit-Worten. > Angenommen GCC sagt mir section .text 1838, passt das dann noch, > oder wie kann ich das verstehen? Da ist noch reichlich Platz (allerding musst du noch .data addieren, das braucht auch ROM -- für die Initialwerte). Die GNU-Tools nehmen immer Bytes als Maß, sie laufen nämlich auf Maschinen mit Wortbreiten von 8, 16, 32 oder 64 bits, da wäre sonst die Verwirrung unendlich groß.
Ahhaa, danke für die Aufklärung :-) Ich finds zwar ein bisschen witzlos, da ich dann den UDP stack im bootloader wie auch im eigentlich Programm hätte, aber theoretisch hätte das ganze platz, ein Netzwerk Bootloader für den AVR...
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.