【问题标题】:How to check if interrupts are enabled in Cortex M3?如何检查 Cortex M3 中是否启用了中断?
【发布时间】:2013-12-03 14:50:46
【问题描述】:

在Cortex M3上,一段代码如何判断是否开启了中断,即程序状态寄存器中I位的状态(由cpsidcpsie操作)?在较旧的 ARM 上,我能够读取 cpsr 寄存器,但这似乎不再可能。

我需要这些信息,因为我有一个从主函数和中断调用的函数,它需要原子地执行某个操作,同时禁用中断。本质上:

bool interrupts_enabled = InterruptsEnabled();
if (interrupts_enabled) {
    __disable_irq();
}
Critical Code;
if (interrupts_enabled) {
    __enable_irq();
}

另外,我想知道在执行中断时I 标志的行为。是否执行中断会设置I 标志,例如防止嵌套?是否默认启用中断嵌套,如何防止嵌套?

【问题讨论】:

    标签: assembly embedded arm interrupt cortex-m3


    【解决方案1】:

    M3 的异常架构略有不同。使用 PRIMASK、FAULTMASK 和 BASEPRI 寄存器控制中断。这些可以使用 MRS 和 MSR 指令访问,并且不属于 CPSR 的一部分,就像您在旧 ARM 架构上可能发现的那样。在最简单的情况下,通过向 PRIMASK 写入 1 来屏蔽中断,通过向 PRIMASK 写入 0 来取消屏蔽。可以读取 PRIMASK 以确定其状态。如果您需要控制 NMI 或硬故障,那么 FAULTMASK 就会发挥作用。如果您想使用优先级进行更精细的控制,则使用 BASEPRI。您将需要阅读一些内容来确定您的使用需求以及优先级在是否允许嵌套中断执行中的作用。

    【讨论】:

    • 谢谢。我发现我的芯片 (AT91SAM3X8E) 的数据表在这方面很有帮助,因为它记录了一些标准 ARM 的东西,比如 NVIC 和指令集。
    • @AmbrozBizjak:文档应该是第一个查看的地方!请注意,Cortex-M3 内核本身在ARM's documentation 中进行了描述。有些部件是可选的或供应商定义的,您需要 Atmel 用户手册。
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    相关资源
    最近更新 更多