Hallo,
das Problem mit der scheinbaren Wirkungslosigkeit der BOOTRST-Fuse, ist
hier im Forum schon für andere ATmega-Typen beschrieben worden. Leider
hat bisher niemand eine Erklärung dafür gefunden.
Folgendes: Ich habe ein ganz kleines Programm geschrieben, dass jeweils
eine LED einschaltet und dann in eine Endlosschleife geht. Interrupts
werden nicht benutzt.
Dieses Programm habe ich nun in jeweils zwei Versionen compiliert. Eine
startet bei Adresse 0x0000 und die andere bei 0xfc00. Beide schalten
weiterhin jeweils eine andere LED an. Man kann daher genau sagen,
welches Programm ausgeführt wird. Die Endlosschleife nach dem
LED-Einschalten verhindert weiterhin, dass die CPU die ff's als NOPs
interpretiert und durch den Speicher läuft, bis es ein Programm gefunden
hat.
So weit, so gut. Diese beiden Programme habe ich nun in den ATmega
geladen. Anschließend habe ich den Flash ausgelesen, und kontrolliert,
dass beide Programme an der richtigen Stelle liegen.
Durch Ändern der BOOTRST-Fuse sollte nun einmal die eine, und dann die
andere LED leuchten. Tut es aber nicht. Es läuft immer das Programm,
welches bei Adresse 0x0000 steht. Offenbar lässt sich der Reset-Vektor
durch den Wert der BOOTRST-Fuse nicht beeindrucken.
BOOTSZ ist dabei auf 0xfc00 eingestellt. Ich benutze AVR-Studio.
Hat jemand irgend eine Ahnung was das sein kann??
Viele Grüße
Steffen
Steffen schrieb:
> Durch Ändern der BOOTRST-Fuse sollte nun einmal die eine, und dann die> andere LED leuchten. Tut es aber nicht. Es läuft immer das Programm,> welches bei Adresse 0x0000 steht. Offenbar lässt sich der Reset-Vektor> durch den Wert der BOOTRST-Fuse nicht beeindrucken.
Nö, sehr wahrscheinlich liegt das eine Programm nur nicht an der
Adresse, wo es sein sollte, weil du beim Verschieben nicht an die
Word/Byte-Adressen-Sache gedacht hast.
Hallo Stefan,
danke für die Antwort! Das mit der Word/Byte-Sache hatte ich schon in
einem anderen Thread gelesen, aber nicht verstanden. Ich habe gerade das
Datenblatt vor der Nase, aber etwas in der Art finde ich da nicht.
Kannst Du es kurz erklären?
Viele Grüße
Steffen
Hallo Jörg,
das Überschreiben kann ich ausschließen, da im ausgelesenen File beide
Programme an der entsprechenden Adresse zu sehen sind.
Grüße
Steffen
Im Datenblatt stehen die Word-Adressen (0xfc00), der GCC-Linker arbeitet
aber mit Byte-Adressen (0x1f800). Also, wie sieht die
Linker-Kommandozeilenoption zum Verschieben bei dir aus?
Steffen schrieb:
> sie lautet -Wl,-Ttext,0xfc00. Ist das falsch?
Für den ATmega1281 ist das falsch, ja. Die GNU-Tools zählen in
Bytes (für alle CPUs, egal ob sie 8-, 16-, 32- oder 64-bittig
sind), die Atmel-Datenblätter meistens in 16-bit-Worten (Ausnahme:
LPM).
Mit anderen Worten, ich habe das zweite Programm an die Adresse 0x7e00
gelegt. Da dahinter NOPs kommen, loopt der Prozessor bis er wieder an
Adresse 0x0000 ankommt. Daher startet es immer dort.
Gut dann probiere ich mal -Wl,-Ttext,0x1f800 aus.
Danke Euch beiden.
Steffen schrieb:
> Gut dann probiere ich mal -Wl,-Ttext,0x1f800 aus.
Alternativ kannst du auch AVR-Studio die Option automatisch generieren
lassen. Dazu in den "Configuration Options" unter "Memory Settings" für
.text eine neue Adresse angeben, und zwar die Word-Adresse, wie sie auch
im Datenblatt steht.