DSP2407進入中斷後的現場保護問題

以前發過一個帖子,求助如何在進入中斷後保護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的幫助。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章