事件和中断之间的区别

Posted

技术标签:

【中文标题】事件和中断之间的区别【英文标题】:Difference between events and interruptions 【发布时间】:2021-07-15 07:22:45 【问题描述】:

我知道这个话题很久以前就已经讨论过了(链接:Difference between interrupt and event),尽管我认为答案不够充分。原因是下一个:当人们谈论事件与中断时,事件一词表示硬件而不是软件。而且,根据那个解释,事件是可以预测的,不是突然发生的事情,但是,在唤醒事件的情况下,这不可能是真的,因为这个事件不是“预期的”,它是自发的。例如,可以查看 stm32 数据表并注意到有一个所谓的唤醒事件启用寄存器。这个“事件”既不涉及要执行的特定代码,也不涉及与软件相关的东西。

【问题讨论】:

我认为今天提出的原始问题将作为意见问题关闭,因此偏离主题。答案,或者至少您对这里报告的解释似乎不充分,而且 IMO 不正确。 事件 是在系统存在的现实世界/环境中发生的事情。如何检测此类事件包括但不限于中断。例如,按下按钮可能是一个事件,该事件可能会导致中断或被轮询。 那为什么stm32有>的使能寄存器而不是唤醒中断的使能寄存器,即使其他使能寄存器专用于中断,而不是用于醒来? “事件”一词具有一般含义。如果您关心特定上下文,则应在问题中指定该上下文。而且,唤醒信号在任何情况下都不是中断。它唤醒处理器并重新启动处理器,就像发生了重置一样。 【参考方案1】:

事件是一个更高抽象层的概念,通常出现在系统或应用程序编程中。它们不一定基于硬件,但可以纯粹由软件触发。这个词没有单一的定义,它相当宽泛。

另一方面,中断总是由最低级别的硬件触发。另一个术语是硬件异常,上层内核和微控制器通常将它们分离为内核抛出的东西,或者当一些异常情况发生时(无效指令、被零除、内存访问错误等)。而中断源可能是预期的硬件行为或某些错误条件。

中断和硬件异常需要将处理函数注册到通常称为中断向量表的硬件查找表中。当中断发生时,硬件会到这个表中找到要调用的函数的地址——这些函数被命名为中断服务例程(ISR)。中断将有一个特殊的调用约定,在调用 ISR 之前,硬件会堆叠某些寄存器,并在 ISR 完成时使用特殊的返回指令来恢复寄存器。

然而,事件使用软件回调函数,通常由应用程序在事件创建时传递函数指针。这就是它们在应用程序编程和快速应用程序开发 (RAD) 工具中的典型使用方式。在嵌入式系统中,可以通过让应用程序为驱动程序内部发生的某些事情注册许多回调,然后让驱动程序调用回调来创建类似的东西。但是,即使驱动程序是硬件之上的最低级代码,它仍然是软件并执行由软件设计的调用。

但由于“事件”是一个如此广泛的术语,因此在某些情况下,事件是可以与更广泛的 API 函数一起使用的对象。然后它们不一定有回调函数——它们本质上只是标志。例如,在 Windows 操作系统中,应用程序程序员可以创建一个事件来向正在运行的线程发出信号,之后该线程可以利用 CPU 有效的睡眠功能并等待直到接收到事件。这是通过让线程自己优雅地结束来正确停止线程的正常方法之一。

中断和事件的共同点是它们都会导致有效但不确定的执行。当中断/事件没有被触发并且它不需要使用某个标志的 polling 时,程序可以做其他事情,这是中断的替代方案。但是当它触发时,它会中止当前的执行并通过执行其他操作来中断它。此外,除了当前调用堆栈之外,它还会在堆栈上推送一些额外的调用,因此如果在程序处于最深调用级别时发生这种情况,您可能会遇到非常微妙的错误,例如间歇性堆栈溢出。

中断和事件的另一个问题是,它们通常充当单独的线程,伴随着所有线程安全问题。您需要通过信号量或保证原子访问来保护与 ISR/回调共享的变量免受竞争条件错误的影响。如果不这样做,我会说迄今为止嵌入式系统中最常见的错误。这也会产生非常微妙的错误。

【讨论】:

They are not necessarily based on hardware, but could be purely triggered by software. 中断也可能是基于软件的。 Interrupts on the other hand are always triggered by hardware, on the lowest level.这就是我之前说过的。 Interrupts and hardware exceptions require the handler function to be registered in a hardware lookup table often called interrupt vector table.所谓的>还有别的名字吗? Events however use software callback functions, typically by the application passing on a function pointer upon event creation. ... But even though a driver is the lowest-level code on top of the hardware, it is still software and performing a call designed by software. 好吧,这里我可以提一下唤醒事件,它既不需要执行指令,也不需要软件参与。 But since "event" is such a broad term, in some cases events are objects that can be used together with broader API functions. 这是另一种事件。我说的是硬件事件。

以上是关于事件和中断之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

STM32之中断与事件---中断与事件的区别

PHP - 在切换情况下中断和继续之间的区别

转载STM32之中断与事件---中断与事件的区别

Linux几种中断信号的区别:HUP,INT,KILL,TERM,TSTP

清详细描述一下啥是软中断,啥是硬中断?

中断指令的数据范围