Gast
#285341
Hallo,
ich habe einen merkwürdigen Fehler, den ich mir nicht erklären kann und
auch nicht weiss wie ich dahinter komme.
Mein Programm besteht aus einem C-Modul und einem Assembler-Modul.
Im Assembler-Modul gibt es eine Interrupt-Routine. Hier würde ich gerne
alle benutzten Register sichern. Dabei entsteht aber das Problem.
Es lassen sich nur eine bestimmte Anzahl Register sichern. Sobald ich
auch nur einen einzigen push/pop-Befehl ausführe funktioniert es nicht
mehr.
So sieht die noch funktionierende Interrupt-Routine aus:
SIG_OVERFLOW0:
push r2 ; Timer/Counter0 Overflow
push r30
; push r31
; push r17
; push r16
; push r5
in r2, SREG
in r16, TCNT0
subi r16, 0x50
out TCNT0, r16
andi r17, -0x11
sbic PIND, PIND2
ori r17, 0x10
lds r5, unk_200082
or r5, r16
sts unk_200082, r5
; pop r5
; pop r16
; pop r17
; pop r31
pop r30
out SREG, r2
pop r2
reti
Wird jetzt ein push und der zugehörige pop-Befehl auskommentiert,
klappt es nicht mehr.
avr-nm gibt mir an, dass 8% des Datenspeichers belegt ist. Das kann gut
sein, ich habe kaum Variablen im Programm.
Als Controller wird der AT90S8515 verwendet.
Die Hex-Datei habe ich auch disassembliert. Die Ensprungadressen
stimmen.
Kann mir hier jemand mal einen Tip geben wie ich den Fehler eingrenzen
kann.
Danke
Andreas