Hallo, wenn ich einen Bootloader mit avrdude in den atmega1281 flashe dauert es immer lange, weil ich es bislang nicht geschafft habe, avrdude mitzuteilen, dass es nur den benutzten Bereich loeschen und flashen soll. Mein BL liegt in den oberen 4k und der Befehl avrdude -c usbasp -p m1281 -U flash:w:bootloader.hex flasht den gesamten Chip also 128k in etwa 50s. Kann ich dem avrdude irgendwie mitteilen, das nur die im hex file angegebenen 4k geflasht werden sollen?
Hallo MintUser. Normalerweise macht avrdude vor jeder Programmierung ein Chiperase, welches alle Seiten auf 0xff ruecksetzt. Dieses erase muss durchgefuehrt werden, da der eigentliche ISP-Vorgang nur 1->0 setzten kann. (0->1 kann nicht programmiert werden --> Aus diesem Grund faellt die AVRDUDE Option "-D" schoneinmal aus.) Im Zusammenhang mit USBaspLoader (https://github.com/baerwolf/USBaspLoader) entfaellt die Notwendigkeit des Chiperase (da der bootloader sich kuemmert etwaige Seiten ggf. vorher zu loesen). Somit werden immer nur die Seiten geloescht (und "verschleissen" daher), welche tatsaechlich von AVRDUDE angefasst werden. Um bei meinen MCUs die Flashlebensdauer zu verlaengern schreibe ich meist eine default-firmware (http://matrixstorm.com/avr/tinyusbboard/examples/empty.hex) an den Anfang des Speichers, welche per RJUMPS die Interrupts spaeterer Speicherstellen "verschiebt". Nun muss ich nur noch verhindern, das bei "gewoehnlichen" Programmiervorgaengen AVRDUDE "die zu schonenden Flashstellen" benutzt, sondern stattdessen "ueberspringt". Dies bringt mich schliesslich zum gleichen Problem, was du hast: AVRDUDE muss gepatcht werden. Da ich nicht zu oft die Sprunggroesse anendern muss ist demzufolge meine Loesung ein uebler HACK: Ich hinterlege zuerst in der Datei ac_cfg.h das Makro "#define STEPHAN_SKIPBYTES 0xC00" und patche, da ich USBasp als Protokoll verwende, usbasp.c: --- ../build/usbasp.c 2011-09-15 16:37:05.000000000 +0200 +++ usbasp.c 2012-07-24 17:21:23.318096473 +0200 @@ -676,6 +676,13 @@ if (strcmp(m->desc, "flash") == 0) { function = USBASP_FUNC_WRITEFLASH; + // Stephan Patch + wbytes -= STEPHAN_SKIPBYTES; + buffer += STEPHAN_SKIPBYTES; + address += STEPHAN_SKIPBYTES; + fprintf(stderr,"\n\n SKIPPING %i bytes, only writing %i bytes\n\n\n",(int)STEPHAN_SKIPBYTES,(int)wbytes); + fflush(stderr); + sleep(1); } else if (strcmp(m->desc, "eeprom") == 0) { function = USBASP_FUNC_WRITEEEPROM; } else { Der verify Prozess muesste theoretisch auch angepasst werden, aber fuer den eigentlichen Zweck reicht das bereits. Ich hoffe ich konnte helfen, mfG Stephan
Danke erstmal fuer die Muehe. Ich habe es fuer mich hiermit geloest: Beitrag "avrdude: doofes 0xFF schreiben unterdrücken? (beim Bootloader brennen)"
Ah, Danke. Die neue (SVN)Version vom avrdude scheint meinen "Hack" ueberfluessig zu machen. Sehr angenehm - Danke. MfG Stephan
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.