interrupt - 避免 CortexM 中断嵌套

标签 interrupt interrupt-handling cortex-m

我想避免在基于 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/

相关文章:

c - 使用 PIC32 微 Controller 上的扬声器生成 PWM 信号音

c++ - 当我使用这种 RAII 风格的模式时,对象本身是否被优化了?

c - 在STM32H7上接收IrDA消息

assembly - 在 16 位 x86 汇编中注册中断

arm - 如何完成低优先级中断?

java - 我想随时停止线程

c - 用于读取的原子 block 与 ARM SysTicks

linux - ISR 内的 PCIe 读写

c - malloc 使嵌入式系统崩溃

Arduino/Attiny85 : Delay in ISR and port manipuation