我知道不同的架构可能会提供不同的方法让开发人员检测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++
不是原子的,它在大多数架构上确实不是原子的,对吗?当然,我们也不会使用任何编译器魔法使其成为原子。
现在在这种情况下,会引起问题吗?
答案 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
来实现此目的。此类操作按预期工作。