如何避免嵌套中断系统中的中断饥饿?

时间:2018-05-23 05:54:36

标签: embedded interrupt scheduling interrupt-handling starvation

我正在学习中断,并且无法理解当中断太多而CPU无法处理前台循环或完成现有中断时会发生什么。我仔细阅读了这篇文章https://www.cs.utah.edu/~regehr/papers/interrupt_chapter.pdf,但是如果中断的次数过多,那么调度程序将不会完全理解?

如果不能错过中断,我们是否会切换到更快的CPU?

3 个答案:

答案 0 :(得分:1)

是的,你必须切换到更快的CPU! 你必须确保有足够的时间用于主循环。因此,尽可能缩短中断服务并执行一些CPU工作负载测试非常重要。

答案 1 :(得分:1)

事实上,任何时候对共享资源存在争议,都有可能导致饥饿。本文中讨论的调度程序限制了中断速率,从而确保了每个间隔期间的一些无中断处理时间。在高活动期间,中断处理被禁用,并且调度程序切换到轮询模式,其中它周期性地询问中断请求线的状态,有效地限制中断流。操作系统努力在每个中断处理程序中尽可能少地执行 - 任务通常只是排队,以便稍后可以在不同的阶段处理它们。任何调度算法都有许多考虑因素和权衡因素。

答案 2 :(得分:0)

总的来说,您需要了解程序每个部分消耗的时间。使用示波器实际测量非常容易。如果您在进入GPIO时激活GPIO并在离开中断时取消激活它,您不仅可以看到ISR消耗的时间,还可以查看它的频率。如果您为每个ISR执行此操作,您将获得好主意他们需要多少时间。然后,您可以在main()中执行类似的操作,以粗略估计程序的完整执行周期,主要+中断。

至于最佳解决方案,显然是减少中断量。如果可能,请使用轮询。使用DMA。使用硬件缓冲的串行外设(UART,CAN等)而不是中断密集型。使用硬件PWM而不是输出比较定时器。等等。当您为项目选择合适的MCU时,需要尽早考虑这些事情。如果您选错了MCU,那么您显然必须改变。扭动CPU时钟听起来像快速和脏修复。请改为设计。