ISR vs main:在一个或另一个中运行的权衡是什么?

时间:2015-05-02 23:57:05

标签: c main isr

我知道这与时间和效率有关,以及ISR如何从其他流程中抽出时间,但我不清楚为什么会这样。我总是被告知要保持ISR很短。我有点困惑,为什么会这样。

2 个答案:

答案 0 :(得分:1)

通常,当硬件设备需要与CPU交互时,ISR会进入场景。它们发送一个中断信号,使CPU不管它正在做什么来为中断服务。这就是ISR必须关心的问题。

现在,这取决于许多因素,因为硬件环境和中断的性质可能是最相关的因素,但通常会发生这样的情况,为了正确地服务中断,ISR会在禁用中断的情况下运行,因此它们不会被中断。这意味着在运行ISR代码时,CPU不能在其他进程之间共享,因为系统定时器中断用于运行调度程序(这是内核的一部分,它负责制造CPU可以执行的操作的错觉同时的任务)将无法运作。

因此,如果您的ISR花费太多时间对设备执行某项操作,则系统将受到整体影响,因为CPU可用于其余进程的时间百分比将比平时少。在具有PIO硬盘的旧系统上非常注意这一点,它会为要传输到CPU的每个磁盘扇区中断CPU,并且ISR必须进行实际传输。如果有很多磁盘流量,您可能会注意到鼠标移动不稳定(因为鼠标设备发送到CPU的中断没有参加)

像Linux这样的操作系统允许ISR将耗时的操作与硬件设备推迟到tasklet:一些内核线程可以与其他进程共享CPU时间,同时保持硬件设备操作的原子性质(操作系统确保不会不止一个tasklet函数 - 用于与系统中同时运行的ISR相关联的特定tasklet)。从磁盘到内核缓冲区的PIO传输就是这种操作的一个例子。

答案 1 :(得分:1)

w.r.t.接受的答案。

运行中断时不一定禁用中断,这不一定是内核在返回线程之前处理所有中断的原因。

存在中断优先级的概念。优先级较高的中断将抢占正在运行的ISR:如果定时器中断的优先级高于正在运行的ISR,则将运行。但是,内核此时不会处理上下文切换,而是推迟它们直到所有排队/挂起的ISR都运行。

此外,在某些处理器(例如ARM Cortex-M3)上,处理中断的概念是处理器本身的一种操作模式。在处理器退出中断模式之前,处理器无法返回运行线程。一旦发生这种情况,所有中断都会得到全面服务:您无法返回运行ISR。

但是所有ISR必须在返回线程之前完成的主要原因是内核没有ISR的类似线程的运行上下文的概念。因此的ISR无法挂起:它必须运行完成。因此,除了优先级较高的中断之外,ISR会占用CPU,直到完成其目的为止。