使用全局变量标记ISR中的执行是否安全

时间:2016-03-26 10:34:46

标签: c embedded interrupt isr

我知道不同的架构可能会提供不同的方法让开发人员检测cpu现在是否在ISR中运行,例如读一个寄存器。

但我确实发现在一些BSP代码中,它们使用全局变量,它被称为/Users/myname/.m2,作为指示cpu是否在ISR中运行的标志。发生中断时,中断处理程序将对entery执行g_in_isr操作,并在退出时执行g_in_isr++

我想知道这种方式对于允许嵌套中断的体系结构是否安全。在大多数体系结构中,g_in_isr--g_in_isr++不是原子操作(我是对的吗?),如果在现有中断处理程序执行g_in_isr--操作时出现高优先级中断怎么办?它不会导致问题吗?

更新(2016-03-27)

是的,我知道它取决于架构,但我想知道一般情况。让我们假设g_in_isr++不是原子的,它在大多数架构上确实不是原子的,对吗?当然,我们也不会使用任何编译器魔法使其成为原子。

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

1 个答案:

答案 0 :(得分:0)

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

  

2定义的类型是

sig_atomic_t
     

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

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

在C11语言中,您可以使用_Atomic int来实现此目的。此类操作按预期工作。