2017-05-29 61 views
0

我有一个队列,在不同的中断发生时调用队列的put和pull函数。有没有办法在这种情况下防止竞争状况? 虽然我们不能等待中断服务例程中的信号量,但创建类似功能的最佳方式是什么。 我们使用Zynq FPGA的ARM-Cortex A5处理器来开发代码。ISR(中断服务程序)中的信号量同步

+1

C不知道ISR,你应该更具体地了解平台并理想地展示一些可编译的示例代码。在一个非常简单的情况下,在ISR内部防止中断可能就足够了。 –

+0

@FelixPalmen感谢您的评论我会更新它 –

+1

注意 - 您可以肯定地从ISR POST信号量单元 - 这是发信号通知I/O已完成的线程的最常用方式。确实,你一定不要试图等待:) – ThingyWotsit

回答

1

假设每个中断都会导致处理器的“中断禁用”状态打开,并且假定您正在处理的中断具有相同的优先级(即不能中断另一中断的执行) ,那么已经不存在竞争条件,您的ISR可以访问共享队列。 (当发生中断时,处理器进入中断禁止模式,将所有寄存器压入堆栈,跳转到ISR入口点并继续执行,一旦ISR完成,“iret”指令执行反向操作这个简单的描述可以在不同的处理器和平台上以不同的方式实现)。

+0

请注意,无论从驱动程序处理程序线程正在进行的pop的哪个阶段,共享队列索引操作都必须能够使ISR可以安全地推送。 – ThingyWotsit

+0

@ThingyWotsit,你是对的。幸运的是,这个队列似乎只能在ISR中访问。否则,非ISR访问本身应执行中断禁用指令以进行安全访问。 –

相关问题