【问题标题】:MSP430 execution banksMSP430 执行库
【发布时间】:2014-08-08 01:32:33
【问题描述】:

我是 MSP430 架构的新手,我正在将一个为 ARM Cortex M3 编写的 RTOS 移植到这个架构中。在 ARM Cortex 架构中,有 PSP 和 MSP 寄存器来保存执行模式的堆栈值。

据我了解,MSP430 架构只有一个堆栈指针寄存器 (SP)。

这是我的问题:

-在中断/执行上下文中是否只有一个用于 SP 的寄存器组?

-我可以像在 ARM Cortex 中一样在 MSP430 中使用常规 C 函数进行中断处理吗?

-MSP430 在中断执行期间如何处理(保存/恢复)寄存器(特别是 SP、SR 和 PC)?

【问题讨论】:

    标签: c interrupt-handling msp430 context-switch


    【解决方案1】:
    1. 就 MSP430 寄存器而言,没有 bank,它是上下文中唯一的一个 SP 寄存器。

    2. 是的,您可以使用 C 函数进行中断处理链接

    __interrupt void MyFuncISR(void)

    也可以像

    #pragma vector=TIMER0_A0_VECTOR    
    __interrupt void
    ta0cc0_isr (void)
    

    在这种情况下,编译器将通过您提供的定义/名称设置正确的中断向量

    3。 中断逻辑执行以下操作: 1. 任何当前正在执行的指令都已完成。 2. 指向下一条指令的 PC 被压入堆栈。 3. SR被压入堆栈 等等,见下文:

    【讨论】:

    • (answer 2) MSP430 架构不支持将 C 函数作为中断处理程序。因此,您正在使用 '__interrupt' 说明符来更改调用约定。在中断上下文中,您应该通过“reti”从处理程序返回,以便从堆栈中弹出 sr。另一方面,在常规 C 调用中,您应该使用“ret”指令。
    • 编译器会自动将reti 放入带有说明符__interrupt 的中断C 调用的返回中,不是吗?这就是提供 __interrupt 说明符的原因。
    • 问题从这里开始,如果你想在 ISR 中进行上下文切换(例如:定时器中断),你还应该考虑不保存/恢复 SR。这是由硬件处理的。相反,您应该在常规执行中保存/恢复 SR。简而言之,您不能对执行和 ISR 上下文使用统一的保存/恢复方案。在 ARM Cortex M 中,中断控制器符合 AAPCS(ARM 应用程序调用标准),因此,您可以使用常规 C 函数(无需使用特殊说明符,例如:__interrupt、__irq、__attribute__((interrupt(irq)))等)作为中断处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多