我想避免在基于CortexM的微控制器的中断入口处嵌套中断。
要实现此目的,我有一个包含中断向量的汇编文件,每个向量的第一条指令是用于全局禁用中断的指令(CPSID I
)。
在每个单独的中断处理程序(用C编写)之后,执行返回到公共汇编例程,该例程使用指令CPSIE I
重新启用中断,并通过指令BX LR
触发从中断/异常过程返回。
在中断入口上,CortexM会自动堆叠包含易失性上下文(调用者保存的上下文)的异常帧,并跳转到异常/中断向量的第一条指令。
根据ARM Info Center,至少需要12个周期才能完成堆栈过程并从NVIC
(嵌套矢量中断控制器)中提取目标向量的第一条指令的地址。如果在堆叠过程中又有一个较高优先级的中断到达(这是“延迟到达”的情况),则将继续堆叠过程,但将首先为较高优先级的进程提供服务。
我的第一个问题是,是否将这种迟到情况视为嵌套中断方案,即LR
寄存器将为0xFFFF FFF1
(仅考虑基本框架)?
第二,是否有可能在完成堆叠过程和执行beofre CPSID I
之间接受异常?
答案 0 :(得分:2)
避免嵌套的简单方法是使所有中断都具有相同的优先级。
如果愿意,您仍然可以使用子优先级对它们进行优先级排序,但是我不确定这会给您带来任何好处。
延迟到达有点像嵌套,只是较高优先级的中断将在较低优先级的中断之前运行。优先级较低的中断会拖到优先级较高的中断上。
是的,可以在执行CPSID I之前接受更高优先级的中断。根据时间的不同,您可能会遇到延迟到达或嵌套的情况。