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

根据C规范,中断是一种信号吗?,c,embedded,language-lawyer,interrupt,c11,C,Embedded,Language Lawyer,Interrupt,C11,C115.1.2.3/5: 当抽象机器的处理被接收中断时 在信号中,既不是无锁原子的对象的值 类型为volatile sig_atomic__t的对象nor是未指定的,因为 浮点环境的状态。任何对象的值 由既不是无锁原子对象也不是 当处理程序 退出,以及浮点环境的状态(如果是) 由处理程序修改,但未恢复到其原始状态 这个问题是关于嵌入式系统的,在这种情况下,没有像设置这样的操作系统 在嵌入式系统上,经典信号(POSIX样式)不存在。假设我们有一个调用多个函数的中断,所有函数都在同一个((半)全局

C115.1.2.3/5:

当抽象机器的处理被接收中断时 在信号中,既不是无锁原子的对象的值 类型为volatile sig_atomic__t的对象nor是未指定的,因为 浮点环境的状态。任何对象的值 由既不是无锁原子对象也不是 当处理程序 退出,以及浮点环境的状态(如果是) 由处理程序修改,但未恢复到其原始状态

这个问题是关于嵌入式系统的,在这种情况下,没有像设置这样的操作系统

在嵌入式系统上,经典信号(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();
}
两个问题:

  • 中断是一种信号吗
  • 上述代码是否为未定义行为的示例,因为
    状态
    不是
    易失性
  • 术语“信号”是指其行为由标准定义的特定事物(C117.14“信号处理”);该定义包括信号有一个数字,可以通过跳转到
    信号
    函数安装的处理程序来中断执行,等等

    该标准不包括信号和线程之外的任何其他类型的异步代码执行

    如果您的实现提供了不符合信号规范的任何其他类型的中断,并且中断处理程序更改了抽象机器的行为,那么我们可以说该实现是不一致的,或者安装信号处理程序的代码导致了未定义的行为

    为了得到良好的定义,您可以让处理程序除了编写易失性原子变量之外什么都不做

    所以,你的第二个问题超出了标准的范围。在标准C中,如果程序从未调用这些函数,那么优化器可以将它们作为未使用的函数删除


    在实际中,提供非标准中断的实现将在其权限范围内定义它自己的行为,并且可以认为它是具有附加功能的C语言的扩展方言。

    < P>标准的作者将许多事物视为其管辖范围之外的事物。如果一个实现使用堆栈的方式在程序执行期间发生中断时会出现不可预测的故障,并且因此要求它生成的代码只能在不可能发生中断的情况下运行,那么这种限制不会使该实现不符合要求,尽管这会使它不适合于许多用途


    适用于特定平台上的低级编程的高质量实现应扩展C标准中给出的框架抽象模型,以包括平台抽象模型中对该目的有用的任何部分,或者记录一个不这样做的合理理由,但实施质量问题不在标准的管辖范围内。在超出本标准预期的情况下,是否应期望特定实现有效工作取决于其设计者是否有兴趣使其适用于广泛的低级编程任务,或仅对本标准预期的用途感兴趣。

    如何安装这些功能“中断处理程序"? 如果您使用
    signal
    进行此操作,则这些是标准意义上的信号处理程序,是的,您应该仅使用
    volatile sigu\t
    进行通信。如果这是一组特定于系统的函数,那么您也必须查阅该文档,C标准不能告诉您任何关于这一点的信息。如问题中所述,这是关于嵌入式系统的(我将添加标签以使其更清楚),这实际上是处理器决定我们现在要运行这个函数,因为发生了一些事件。我们只能假设C语言是在一个没有操作码指令、汇编语言或中断的特殊设备上运行的。否则,该语言将具有对计算机的标准支持。即使C++支持内联汇编程序,但C语言从纯实用的观点来看:由于所示代码只从一个线程访问变量(并且ISR及其调用的函数是一种线程),所以我不认为有必要使它<代码>易失性< /代码>或原子。话虽如此,您需要确保在ISR或任何被调用函数运行时,不能再次调用它。这是大多数嵌入式系统的标准配置,但您可以做到这一点。您需要确保没有其他线程(如
    main()
    及其调用的函数)访问此变量。那么,根据标准,信号是什么?它确实提到
    5.2.3信号和中断
    @P_uj_uu。如果您提到5.2.3“信号和中断”,它指的是执行被信号中断。本标准不包括信号以外的任何其他类型的中断。
    功能的实现应使其随时被信号中断
    任何中断源都是信号。@Cheiron实际上没有正式的定义。C语言中的“信号”是利用抽象库信号的东西。“一致性独立实现”(读:嵌入式系统编译器)不需要提供对signal.h的支持,它是可选的。