我想避免在基于 CortexM 的微 Controller 的中断入口处出现嵌套中断。
为了实现此目的,我有一个包含中断向量的汇编文件,每个向量的第一条指令是全局禁用中断的指令(CPSID I
)。
在每个单独的中断处理程序(用 C 编写)之后,执行返回到公共(public)汇编例程,该例程使用指令 CPSIE I 重新启用中断,并使用指令 BX 触发从中断/异常过程返回LR。
在中断入口处,CortexM 自动堆栈异常帧,其中包含 volatile 上下文(调用者保存的上下文)并跳转到异常/中断向量的第一条指令。
根据ARM Info Center完成入栈过程以及从NVIC(嵌套向量中断 Controller )获取目标向量第一条指令的地址至少需要12个周期。如果在入栈过程中另一个更高优先级的中断到达(属于迟到情况),则继续入栈过程,但会先服务更高优先级的进程。
我的第一个问题是,这种迟到情况是否被视为嵌套中断场景,即 LR
寄存器将为 0xFFFF FFF1
(仅考虑基本帧)?
第二,在入栈过程完成和CPSID I
执行之前是否可以接受异常?
最佳答案
避免嵌套的简单方法是让所有中断具有相同的优先级。
如果您愿意,您仍然可以使用子优先级来确定它们的优先级,但我不确定这会给您带来任何好处。
迟到有点像嵌套,只不过较高优先级中断将在较低优先级中断之前运行。较低优先级中断将尾链至较高优先级中断。
是的,在执行 CPSID I 之前可以接受更高优先级的中断。根据时间,您可能会遇到延迟到达或嵌套情况。
关于interrupt - 避免 CortexM 中断嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52886592/