3

我知道不同的架构可能会提供不同的方法让开发人员检测 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++不是原子的,在大多数架构上它确实不是原子的,对吗?当然,我们也没有使用任何编译器魔法来使其具有原子性。

现在在这种情况下,它会引起问题吗?

4

1 回答 1

0

C 语言在 C11 之前没有指定有用的原子语义,但有一件事是存在的。类型sig_atomic_t是保证原子访问的整数,参见。ISO 9899:1999 §7.14 ¶2:

2 定义的类型是

sig_atomic_t

它是可以作为原子实体访问的对象的(可能是 volatile 限定的)整数类型,即使在存在异步中断的情况下也是如此。

如果您使用类型的全局变量sig_atomic_t来指示已传递信号,那是安全的。但是,没有像C99 中定义的原子增量这样的操作。

在 C11 语言中,您可以将 an_Atomic int用于此目的。此类型的操作按预期工作。

于 2016-03-26T11:27:27.407 回答