C11 5.1.2.3/5:
当抽象机的处理被收据中断时信号,既不是无锁原子的对象的值未指定对象或类型为volatile sig_atomic_t的对象,也未指定浮点环境的状态。任何对象的价值由既不是无锁原子对象也不是处理器的处理程序修改处理程序时,类型volatile sig_atomic_t的类型变得不确定退出,浮点环境的状态也会退出由处理程序修改且未还原到原始状态。
此问题专门针对嵌入式系统,在没有类似操作系统的设置的情况下。
在嵌入式系统上,经典信号(POSIX样式)不存在。假设我们有一个中断,该中断调用多个函数,所有这些函数都在同一个((半)全局)变量上工作,但是在中断外的上下文中不使用该变量。有点像
static enum State state;
static void setStateTo1(void)
{
state = stateOne;
}
static void setStateTo2(void)
{
state = stateTwo;
}
void ISR(void)
{
if (state == stateOne)
setStateTo2();
else
setStateTo1();
}
两个问题:
state
不是volatile
?您的第二个问题超出了标准的范围。如果程序从未调用过这些函数,则优化器可以将所有这些函数删除为未使用。