根据C规范是一个信号中断吗?

问题描述 投票:2回答:1

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();
}

两个问题:

  1. 中断是信号吗?
  2. 上面的代码是未定义行为的示例,因为state不是volatile
c embedded language-lawyer interrupt c11
1个回答
0
投票
否,中断不是信号。 ISO C没有提到中断。如果中断处理程序更改了抽象机的行为,则实现不合格。为了避免这种情况,除了编写易失性原子变量之外,您还可以让处理程序不执行任何操作。

您的第二个问题超出了标准的范围。如果程序从未调用过这些函数,则优化器可以将所有这些函数删除为未使用。

© www.soinside.com 2019 - 2024. All rights reserved.