DSP

DSP2407进入中断后的现场保护问题

2019-07-13 10:44发布

以前发过一个帖子,求助如何在进入中断后保护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的帮助。