不确定是否有类似的问题。我试图重新阅读但无法找到任何内容,所以就在这里。
在我使用ARM Cortex-A9(带有GIC的双核)的裸机应用程序中,一些中断源是4个FPGA中断(让我们说IRQ ID 58,59,60,61)同样的优先级和想法是所有同时在运行时连续触发。我可以说中断处理程序的资格可能很长,但不会很长。
所有中断都会触发并被GIC检测到,所有中断都被标记为PENDING。问题是,只有两个较高的ID中断(58,59)由CPU处理,使另外两个中断。完成58或59后,它们的源将再次触发并反复占用CPU。我的其他中断无限期地被饿死了。
我优先玩,将更高的中断分配到60和61.果然,60和61触发并由CPU处理,但58和59被饿了。所以这真的是一个饥饿问题。
有没有办法离开这里,以便其他两个仍然会根据其触发率进行处理?
答案 0 :(得分:1)
假设GIC实现是ARM的设计之一,那么相同优先级的多个中断的仲裁方案固定为“发送编号最小的一个”,所以如果你希望它可以改为某种圆形-robin scheme你可能运气不好。
那就是说,如果这些中断或多或少地永久断言并且你背对背,那么这表明你可能不需要使用中断,或者至少是你的代码设计不合适。根据任务的确切性质,以下是我要考虑的一些想法:
答案 1 :(得分:0)
在我的裸机应用程序中使用ARM Cortex-A9(双核与GIC)......
有没有办法离开这里,以便其他两个仍然会根据其触发率进行处理?
当然有很多方法。
我相信大多数这些解决方案都可以避免不必要的上下文保存/恢复,并且还应该更高效。
当然,如果你要求CPU做的工作超出其能力,那么优先事项并不重要。问题可能是您的代码效率不高;裸机中断基础设施或FPGA IRQ处理程序。 FPGA到CPU接口的设计很可能不是很好。您可能需要在FPGA中添加FIFO以缓冲数据,以便CPU可以一次处理更多数据。我和几位FPGA设计师合作过。它们具有很大的灵活性,通常如果你要求能使IRQ处理程序更有效的东西,它们就可以实现它。