以前发过一个帖子,求助如何在进入中断后保护ARP的问题,一直没有解决,现在我找到了解决的方法,跟大家分享下我的经验。
我以前做中断保护是模仿C语言生成汇编的做法,把AR1做为栈指针,进入中断后这样保护
SST #0, *+ ;保护ST0
SACH *+
SACL *+ ;保护ACC
退出的时候再依次恢复,这样的话存在一个问题,如果在进入中断之前没用到其他辅助寄存器还好,一旦用到其他寄存器就有可能出错,比如我在进入中断之前在用AR2(AR2 = 0x80)也就是ARP = 2, 如果这时进入了中断,那ST0,ACC等要保护的信息就覆盖了0x80, 0x81,0x82这些位置,当退出中断时,0x80, 0x81,0x82这些位置的数据就被破坏了;如果进入中断时强制切换到AR1,保护也就没意义了,ARP已经保护不了。
现在我是这么做的,从0x60开始的一段地址做为栈区,把数据依次保存到0x60开始的内存中,程序上可以这么实现
;------------------------保存状态宏-------------------------------------
SAVE_STATUS .macro
SST #0, 60h ;save ST0
SST #1, 61h ;save ST1
LDP #0
SACH 62h
SACL 63h ;save ACC
SAR AR0, 64h
SAR AR1, 65h
SAR AR2, 66h
SAR AR3, 67h
SAR AR4, 68h
SAR AR5, 69h
SAR AR6, 6Ah
SAR AR7, 6Bh
.endm
;------------------------恢复状态宏-------------------------------------
RESET_STATUS .macro
LDP #0
LAR AR7, 6Bh
LAR AR6, 6Ah
LAR AR5, 69h
LAR AR4, 68h
LAR AR3, 67h
LAR AR2, 66h
LAR AR1, 65h
LAR AR0, 64h
LACL 63h
ADD 62h, 16
LST #1, 61h
LST #0, 60h
.endm
巧妙的地方就在于使用了SST这条指令,当使用这条指令时,DP会强制变成0, 但ST0中的DP不会变化,这样就不会破坏要保护的数据了,具体可以查看CCS的帮助。