【问题标题】:What all cant be there in an Interrupt service routine?中断服务程序中不能有什么?
【发布时间】:2012-03-15 14:16:09
【问题描述】:

我知道 ISR 需要非常快,并且应该非常快地处理中断。但我不明白同样的原因。为什么要满足这个条件?此外,为了做到这一点,对 ISR 代码的所有内容是否有任何限制?通常,ISR 的代码中不应包含哪些内容?

谢谢

【问题讨论】:

    标签: operating-system linux-kernel interrupt


    【解决方案1】:

    当一个 ISR 执行时,没有线程可以在同一个 CPU 上执行,所以线程调度会受到影响,执行的时间越长,影响越大。根据实现(软件和硬件),所有中断(或较低优先级的中断)可能在 ISR 执行时被禁用,这意味着如果 ISR 需要很长时间才能完成,其他中断可能无法足够快地处理,这意味着存在将是延迟甚至错过中断。

    还有一些其他的事情需要考虑:

    1. 在 ISR 中使用锁
    2. 在 ISR 中触摸分页内存

    如果您在 ISR 中获得了一个已经可以锁定的锁,如果没有其他 ISR 或 CPU 来释放该锁,您可能会进入无限循环。

    如果您触摸已交换到磁盘的内存页面,您可能会遇到类似的情况,因为如果页面错误处理程序在线程中执行此操作,则可能无法将该页面从磁盘带到内存中并且该线程无法执行,因为与 ISR 相比优先级较低且从未被调度。

    【讨论】:

    • 谢谢亚历克斯,我希望我可以将多个答案标记为正确。
    【解决方案2】:

    我知道 ISR 需要非常快速并且应该处理 中断非常快。但我不明白原因 一样的

    最严格的要求是ISR 不能阻塞——它不能休眠。所以你不能使用信号量。

    每个中断都与硬件有关。想想网络设备。它有一个非常小的内存,但它可以高速接收帧。您最好将其中的内容快速复制到主内存中,否则帧会淹没设备并且会溢出帧。

    【讨论】:

    • 所以我可以将其想象为中断处理程序以非常快的速度从 I/O 设备接收数据,因此它必须将其写入内存,否则我们可能会丢失一些数据。正确的?如果是这样,我们如何确保我们的 ISR 足够快以至于帧不会溢出?
    • @DeeptiJain 你不能。只要确保它尽可能快。
    猜你喜欢
    • 2020-12-09
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2015-03-02
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多