避免CortexM中断嵌套

时间:2018-10-19 05:55:28

标签: interrupt interrupt-handling cortex-m

我想避免在基于CortexM的微控制器的中断入口处嵌套中断。

要实现此目的,我有一个包含中断向量的汇编文件,每个向量的第一条指令是用于全局禁用中断的指令(CPSID I)。 在每个单独的中断处理程序(用C编写)之后,执行返回到公共汇编例程,该例程使用指令CPSIE I重新启用中断,并通过指令BX LR触发从中断/异常过程返回。

在中断入口上,CortexM会自动堆叠包含易失性上下文(调用者保存的上下文)的异常帧,并跳转到异常/中断向量的第一条指令。

根据ARM Info Center,至少需要12个周期才能完成堆栈过程并从NVIC(嵌套矢量中断控制器)中提取目标向量的第一条指令的地址。如果在堆叠过程中又有一个较高优先级的中断到达(这是“延迟到达”的情况),则将继续堆叠过程,但将首先为较高优先级的进程提供服务。

我的第一个问题是,是否将这种迟到情况视为嵌套中断方案,即LR寄存器将为0xFFFF FFF1(仅考虑基本框架)?

第二,是否有可能在完成堆叠过程和执行beofre CPSID I之间接受异常?

1 个答案:

答案 0 :(得分:2)

避免嵌套的简单方法是使所有中断都具有相同的优先级。

如果愿意,您仍然可以使用子优先级对它们进行优先级排序,但是我不确定这会给您带来任何好处。

延迟到达有点像嵌套,只是较高优先级的中断将在较低优先级的中断之前运行。优先级较低的中断会拖到优先级较高的中断上。

是的,可以在执行CPSID I之前接受更高优先级的中断。根据时间的不同,您可能会遇到延迟到达或嵌套的情况。