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

本文介绍了一种改进的中断保护ARP方法,通过将数据保存到特定内存区域,避免了寄存器冲突导致的数据破坏问题。该方法利用SST指令特性,确保DP不变,从而有效保护中断前的数据状态。

以前发过一个帖子,求助如何在进入中断后保护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的帮助。
### DSP28335 中断配置及进入中断的机制 DSP28335 的中断系统采用了三级中断机制,分别是外设级中断、PIE 级中断和 CPU 级中断。这种设计能够有效管理复杂的中断源,并确保中断响应的实时性与稳定性。以下是关于中断配置及进入中断的具体方法。 #### 1. 外设级中断 外设产生中断请求后,需要通过外设自身的中断使能寄存器进行允许。例如,如果使用 CAN 中断,则需要在 CAN 模块中配置中断使能位[^1]。只有当外设级中断被允许时,中断请求才会传递到下一级。 #### 2. PIE 级中断 PIE(Peripheral Interrupt Expansion)是 F28335 的关键组件之一,用于将多个外设中断映射到有限的 CPU 中断线上。PIE 支持多达 96 个外设中断,并将其分组为 12 组,每组最多支持 8 个中断源。配置 PIE 级中断的主要步骤包括: - 配置 PIE 中断向量表地址:默认情况下,PIE 中断向量表位于 `0x000D00` 到 `0x000E00` 地址范围内。 - 使能特定的 PIE 中断组和通道:通过设置对应的 PIE 控制寄存器来启用所需的中断组和通道。 - 清除 PIEACK 寄存器:在使能 PIE 后,需要写入 `0xFFFF` 来清除 PIEACK 寄存器中的状态位[^4]。 #### 3. CPU 级中断 CPU 级中断是最内核的部分,CPU 只能响应从 CPU 中断线上传来的中断请求。为了使能 CPU 级中断,需要执行以下操作: - 使用 `EINT` 指令使能全局中断标志位 INTM。 - 使用 `EALLOW` 指令提升特权级别,以便修改受保护的寄存器。 - 配置中断优先级和嵌套规则:F28335 支持中断嵌套,但需要合理配置优先级以避免冲突[^3]。 #### 4. 进入中断的过程 当中断条件满足时,中断请求会按照以下顺序传播并触发中断服务程序: 1. **外设级**:外设生成中断请求,并通过其内部逻辑判断是否允许该中断。 2. **PIE 级**:如果外设级允许,则中断请求传递到 PIE 级别,PIE 根据配置决定是否将中断请求发送到 CPU。 3. **CPU 级**:如果 PIE 允许,则中断请求到达 CPU,CPU 响应中断并跳转到对应的中断服务程序入口地址。 以下是使能中断的典型代码示例: ```c // 使能 PIE 和 CPU 中断 PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // 使能 PIE PieCtrlRegs.PIEACK.all = 0xFFFF; // 清除 PIEACK 寄存器 EINT; // 使能全局中断 ``` #### 注意事项 - 在多中断场景下,若多个中断服务子程序访问相同的共享资源,需使用临界区或信号量等机制保护资源,防止数据冲突。 - 尽量缩短中断服务子程序的执行时间,减少中断嵌套对系统性能的影响。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值