我知道不同的架构可能会提供不同的方法让开发人员检测 CPU 现在是否在 ISR 中运行,例如读取寄存器。
但是我确实发现在一些 BSP 代码中,他们使用了一个全局变量,它被称为g_in_isr
,作为指示 cpu 是否在 ISR 中运行的标志。当发生中断时,中断处理程序将在进入和退出时执行g_in_isr++
操作。g_in_isr--
我想知道这种方式在允许嵌套中断的架构上是否安全。在大多数架构中,g_in_isr++
或者g_in_isr--
不是原子操作(对吗?),如果现有中断处理程序正在执行g_in_isr++
操作时出现高优先级中断怎么办?它不会引起问题吗?
更新 (2016-03-27)
是的,我知道它依赖于架构,但我想知道一般情况。让我们假设它g_in_isr++
不是原子的,在大多数架构上它确实不是原子的,对吗?当然,我们也没有使用任何编译器魔法来使其具有原子性。
现在在这种情况下,它会引起问题吗?