C ISR(中断服务例程)中类似信号量的同步

C ISR(中断服务例程)中类似信号量的同步,c,semaphore,interrupt,C,Semaphore,Interrupt,我有一个队列,当不同的中断发生时,调用队列的put和pull函数。在这种情况下,有没有办法防止竞争状况? 虽然我们不能在中断服务例程中等待信号量,但创建类似功能的最佳方法是什么。 我们正在使用Zynq FPGA的ARM Cortex A5处理器来开发代码。假设每个中断都会导致处理器的“中断禁用”状态打开,并且假设您处理的中断具有相同的优先级(即,一个中断不能中断另一个中断的执行),这样就不可能存在竞争条件,您的ISR只能访问共享队列 (当中断发生时,处理器进入中断禁用模式,将所有寄存器推送到堆栈

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

假设每个中断都会导致处理器的“中断禁用”状态打开,并且假设您处理的中断具有相同的优先级(即,一个中断不能中断另一个中断的执行),这样就不可能存在竞争条件,您的ISR只能访问共享队列


(当中断发生时,处理器进入中断禁用模式,将所有寄存器推送到堆栈上,跳转到ISR入口点并在那里继续执行。一旦ISR完成,“iret”指令执行与入口相反的操作。这个简单的描述可以在不同的处理器和平台上以不同的方式实现。)

C不了解ISR,您应该更具体地了解该平台,最好展示一些可编译的示例代码。在一个非常简单的场景中,这足以防止ISR内部的中断。@FelixPalmen感谢您的评论,我将更新itNote-您当然可以从ISR发布信号量单元-这是发送I/O已完成线程信号的最常见方式。确实,您不能尝试等待:)请注意,共享队列索引操作必须确保ISR可以安全地推送,无论pop的哪个阶段可能正在从驱动程序处理程序线程进行。@ThingyWhat,您完全正确。幸运的是,这里的队列似乎只在ISR中访问。否则,非ISR访问本身应执行中断禁用指令以实现安全访问。