assembly - 如何检查 Cortex M3 是否启用了中断?

标签 assembly embedded arm interrupt cortex-m3

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

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

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

此外,我想知道 I 标志在执行中断时的行为方式。中断的执行是否会设置 I 标志,以防止嵌套?默认情况下是否启用中断嵌套,如何防止嵌套?

最佳答案

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

关于assembly - 如何检查 Cortex M3 是否启用了中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20081929/

相关文章:

c - 有没有办法使用 C 宏在 .S 文件中生成 asm 代码?

windows - 在 DLL 中,函数表的结构是怎样的?

为嵌入式软件构建 (CI) 服务器

c - 将现有的 C 代码移植到 ARMv7

linux - 谁初始化flash?

assembly - 使用汇编语言除奇数

assembly - 如何使用循环绘制正方形(int 10h)?

c - 查找多核核心包上竞争条件的原因

linux - 在 libc 的 ARM 程序集中收到 SIGSTOP 信号?

armv7:stmb 不占用 pc