Merhaba Arkadaşlar,
C18 ile interrupt girişlerde context saving için hangi registerları kaydetmem gerekiyor, Ben aşağıdaki gibi yaptım. Ama program çalışırken garip davranıyor. Pointer içeren fonksiyonların icraası sırasında sapıtyor.
Yedeklemediğim register var mı?
Alıntı Yap
HighIsrContextSave:
movff WREG,SaveHIWREG
movff BSR,SaveHIBSR
movff STATUS,SaveHISTATUS
movff PRODH,SaveHIPRODH
movff PRODL,SaveHIPRODL
movff TABLAT,SaveHITABLAT
movff TBLPTRL,SaveHITBLPTRL
movff TBLPTRH,SaveHITBLPTRH
movff TBLPTRU,SaveHITBLPTRU
movff FSR0H,SaveHIFSR0H
movff FSR0L,SaveHIFSR0L
movff FSR1H,SaveHIFSR1H
movff FSR1L,SaveHIFSR1L
movff FSR2H,SaveHIFSR2H
movff FSR2L,SaveHIFSR2L
call HighISR
C18'in #pragma interrupt HighISR ve #pragma interrupt LowISR komutlarıyla yaptım ilk önce. Dissambly yapınca gördüm ki, LowISR'de context saving yapmış, HighISR fonksiyonunda direk fonksiyona girmiş. Bu yüzden interrupta giriş ve çıkışları tamamen assembly ile yazıyorum.
İnterrupta girerken aşağıdaki registerların dışında yedeğini almam gereken başka register var mı ?
Cevap veren yok mu
WREG,
BSR,
STATUS,
PRODH,
PRODL,
TABLAT,
TBLPTRL,
TBLPTRH,
TBLPTRU,
FSR0H,
FSR0L,
FSR1H,
FSR1L,
FSR2H,
FSR2L,
Islemcini tanimiyorum. Ancak bu tip soruya verilecek genel cevap su sekilde.
Int rutinine girdiginde isteyerek yada istemeden iceriklerini degistirdigin register ve flaglarin orjinal degerlerini saklamalisin.
Icerigi degismeyen registerleri saklamaya gerek kalmayacagindan hiz kaybindan da kurtulursun.