c - ISR 与主要 : what are the trade offs of running in one or the other?

标签 c program-entry-point isr

我知道这与时间和效率有关,以及 ISR 如何占用其他进程的时间,但我不清楚这是为什么。我总是被告知要保持 ISR 非常短。我有点困惑这是为什么。

最佳答案

通常,当硬件设备需要与 CPU 交互时,ISR 就会出现。它们发送一个中断信号,使 CPU 停止正在做的任何事情来为中断服务。这是 ISR 必须关心的。

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

因此,如果您的 ISR 花费太多时间来执行设备的特定操作,您的系统将作为一个整体受到影响,因为 CPU 可用于其余进程的时间百分比将比平时少。这在带有 PIO 硬盘的旧系统上非常值得注意,它会在每个要传输到 CPU 的磁盘扇区中断 CPU,而 ISR 必须进行实际传输。如果磁盘流量很大,您可能会注意到鼠标移动时出现抖动(因为鼠标设备发送给 CPU 的中断未被处理)

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

关于c - ISR 与主要 : what are the trade offs of running in one or the other?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30008797/

相关文章:

java - 从另一个类调用一个类而无需更改类类型(或返回)Java

c++ - char *argv[ ] 和 int argc C++ 的全局范围

c - 与 C 中的 main() 函数不同

c - 使用 printf() 时 Spi 中断处理程序起作用

arduino - 关注 Arduino 程序中 micros() 值的漂移

c++ - 将 HTTP 连接绑定(bind)到特定适配器(提示 : Metered Connection)

c - 由于大小分配导致的数组错误

c - 将 char 字符串解析为 INT C 编程

c - 可移植 ISR 安全数据传递

c++ - 如何在我的 .c 文件中只包含几行头文件(只读文件)