Hallo,
ich bin gerade dabei mir zu überlegen, welche Strategie für die Ablage von Daten im SRAM zu bevorzugen ist.
Zunächst erschien mir die zweite Variante sicherer, da ich dachte, daß meine Daten dort nicht von einem Stack-Overflow überschrieben werden könnten. Aber dann dachte ich, daß es ja durchaus sein kann, daß der SP bis auf 0 runter (durch den IO-Bereich und die Register) marschieren kann und dann wieder auf RAMEND hochgewrappt werden könnte. Zweites Problem: Ein Stack-Underflow.
Im Simulator passiert folgendes:
POP bei leerem Stack:
SP liegt anfangs bei $40FF (ATmega1284P:16K SRAM). Vermutung: Bei einem POP wird SP nicht nur inkrementiert, sondern auch auf 0 zurückgesetzt, zeigt dann auf R0, so daß R1 auf $80 gesetzt wird. Ergebnis: SP wird auf die ungültige Adresse $4100 gesetzt und R1 bekommt (behält) den Wert 0.
Der Versuch den Stack auf $FFFF zu initialisieren scheitert:
SP ist jetzt $7FFF (???), wird beim POP auf 0 gewrappt, aber R1 ist immer noch 0.
Stack auf 0 initialisieren:
R0 bleibt 0 (trotz PUSH von $80) und SP wird auf $7FFF gewrappt.
Bevor ich nun das ganze noch einmal mit dem realen Baustein ausprobiere, denn dem Simulator traue ich nicht so recht, hätte ich gerne Eure Erfahrungen gehört.
Gruß Wolfgang
ich bin gerade dabei mir zu überlegen, welche Strategie für die Ablage von Daten im SRAM zu bevorzugen ist.
- Stack auf RAMEND, Daten auf $0100.
- Stack auf RAMEND-DATASIZE,Daten auf RAMEND-DATASIZE+1
Zunächst erschien mir die zweite Variante sicherer, da ich dachte, daß meine Daten dort nicht von einem Stack-Overflow überschrieben werden könnten. Aber dann dachte ich, daß es ja durchaus sein kann, daß der SP bis auf 0 runter (durch den IO-Bereich und die Register) marschieren kann und dann wieder auf RAMEND hochgewrappt werden könnte. Zweites Problem: Ein Stack-Underflow.
Im Simulator passiert folgendes:
POP bei leerem Stack:
Code:
ldi R16,$80
mov R0,R16
pop R1
SP liegt anfangs bei $40FF (ATmega1284P:16K SRAM). Vermutung: Bei einem POP wird SP nicht nur inkrementiert, sondern auch auf 0 zurückgesetzt, zeigt dann auf R0, so daß R1 auf $80 gesetzt wird. Ergebnis: SP wird auf die ungültige Adresse $4100 gesetzt und R1 bekommt (behält) den Wert 0.
Der Versuch den Stack auf $FFFF zu initialisieren scheitert:
Code:
ldi R16,$ff
out SPL,R16
out SPH,R16
ldi R16,$80
mov R0,R16
pop R1
Stack auf 0 initialisieren:
Code:
ldi R16,0
out SPL,R16
out SPH,R16
mov R0, R16
ldi R16,$80
push R16
Bevor ich nun das ganze noch einmal mit dem realen Baustein ausprobiere, denn dem Simulator traue ich nicht so recht, hätte ich gerne Eure Erfahrungen gehört.
Gruß Wolfgang