首页 > 解决方案 > 当我在进入中断处理程序之前清除中断标志时发生了什么?

问题描述

假设一个中断(中断 1)发生在我处于另一个具有相同或更高优先级的中断(中断 2)的 ISR 中。那么在退出当前的ISR之前,我清除了中断1的中断标志,请问中断1的中断处理程序还是会被执行还是会忽略中断1呢?

对于上下文,我使用的是 STM32 微控制器。

谢谢

标签: armstm32interruptinterrupt-handling

解决方案


AFAIK 从其他 CPU 的过去经验来看,你失去了中断。

在这种情况下,在清除中断 1 标志之前:

  • 只需读取中断 1 标志位并临时存储
  • 清除中断标志(在某些读取它的 CPU 中,会自动清除它)
  • 在中断 2 结束时检查存储的位
    • 如果未设置,则离开中断 2 例程
    • 如果它被设置并且两个中断具有相同的优先级(或者没关系!):
      • 只是跳转/调用另一个中断 1 例程(“停留”在中断 2 例程执行中)
    • 如果它已设置并且中断 1 的优先级不同,那么您确实必须为其分配正确的优先级:
      • 然后它变得困难,这里有一些选择:
        • 一旦我强迫cpu触发另一个与中断1相同优先级的未使用中断3,所以使用中断3执行“中断1”例程
        • 根据您的需要和可以在代码中构建中断优先级处理,使用上述技巧等等......

PS:这应该在处理器的手册中描述,清除中断位是否会失去其执行 - 大多数是的,中断位只是一个“中断挂起”位。有时不容易找到描述,而是日常业务。


推荐阅读