|
 |
 |
 |
|
|
c't Projekte - c't-Bot und c't-Sim -
Mailinglisten
[Voriger (Datum)]
[Nächster (Datum)]
[Voriger (Thread)]
[Nächster (Thread)]
[Nach Datum][Nach Thread]
Absender: Timo Sandmann
Datum: Fr, 19.10.2007 01:09:07
In-reply-to:
<4717C8C2.2030701@xxxxxxx>
References:
<46F96285.8020005@xxxxxx> <2CD3D281-AE62-4FBB-8419-C3EBB7DAFCE9@xxxxxxxxxxxxxxx> <4717C8C2.2030701@xxxxxxx>
Hallo,
Am 18.10.2007 um 22:57 schrieb Thomas Kregelin:
Hallo Werner.
ich kenne dieses Problem
Mir hat folgendes geholfen:
Suche die Funktion *jump_to_app* in *bootloader.c*
und ersetze diese Funktion durch:
*static void __attribute__ ((always_inline)) jump_to_app(void){
// setze Interrupt Vector Start address auf 0x0002
#ifdef __AVR_ATmega644__
MCUCR = 0x01;
MCUCR = 0x00;
#else
GICR = 0x01;
GICR = 0x00;
#endif
asm("jmp 0x0000"); // Run application code
}*
Mit dieser Modifikation wird sichergestellt, dass der
Interruptvektor auf Adresse 0x0002 gesetzt wird.
das stimmt so aber nicht.
GICR = 0x01;
setzt das IVCE-Bit im GICR-Register, was nichts anderes tut, als für
4 CPU-Zyklen die Veränderung des IVSEL-Bits zu erlauben und außerdem
Interrupts zu deaktivieren. Um die Vektor-Start-Adresse zu ändern,
müsste man zunächst GICR auf 1 setzen und anschließen (innerhalb von
4 Zyklen) auf 2. Das Rücksetzen auf 0 ist außerdem eine No-Operation,
weil das nach 4 Zyklen automatisch passiert.
Abgesehen davon gibt es auch nichts im Code, das die Vektor-Start-
Adresse verschiebt und per default liegt sie bei $0002, wie es sein
muss. Das Einzige, was der o.a. Code bewirkt, ist das deaktivieren
der Interrupts und ein leicht geändertes Timing (weil die Befehle
noch ausgeführt werden).
Wie kommst du denn auf diesen Code?
Ich vermute, dass es sonst zu einer Endlosschleife kommen kann, in
der sich der Bootloader ständig selbst aufruft.
Dass sich der Bootloader selbst aufruft, kann nicht sein, es wird ja
explizit an Adresse 0 gesprungen, der Bootloader hingegen liegt ganz
am Ende des Flash-Speichers. Vermutlich ist das eher ein Compiler-
Problem, das so irgendwie umgangen wird. Oder das Int-Deaktivieren
hat einen positiven Nebeneffekt, den ich gerade nicht sehe.
Viele Grüße,
Timo
|
|
|