Amb*_*jak 3 embedded assembly arm interrupt cortex-m3
在Cortex M3上,一段代码如何确定是否启用了中断,即I程序状态寄存器中的位状态(由cpsid和操纵cpsie)?在较旧的ARM上,我能够读取cpsr寄存器,但似乎不再可能.
我需要这些信息,因为我有一个从main和中断调用的函数,它需要以原子方式执行某个操作,而中断则被禁用.实质上:
bool interrupts_enabled = InterruptsEnabled();
if (interrupts_enabled) {
    __disable_irq();
}
Critical Code;
if (interrupts_enabled) {
    __enable_irq();
}
另外,我想知道I执行中断时标志的行为.执行中断是否会设置I标志,以防止嵌套?默认情况下是否启用了中断嵌套,如何防止嵌套?
M3的异常架构略有不同.使用PRIMASK,FAULTMASK和BASEPRI寄存器控制中断.这些可以使用MRS和MSR指令访问,并且不像旧版ARM体系结构中那样是CPSR的一部分.在最简单的情况下,通过将1写入PRIMASK来屏蔽中断,并通过将0写入PRIMASK来屏蔽中断.可以读取PRIMASK以确定其状态.如果您需要控制NMI或硬故障,那么FAULTMASK就会发挥作用.如果您希望使用优先级进行更精细的控制,则使用BASEPRI.您将不得不进行一些读取以确定您的使用需求以及优先级在是否允许嵌套中断执行中的作用.