在小型嵌入式系统上的IRQ中的自旋锁

时间:2012-12-24 08:13:26

标签: deadlock interrupt spinlock isr

我正在开发一个没有操作系统的ARM微控制器上的小型嵌入式系统。它有几种不同类型的中断(按钮按下,A到D转换,定时器等),只有一个线程在运行。

我希望有一个事件的FIFO队列来处理每个中断服务例程将其事件添加到队列的位置,而主(且唯一)线程将队列中的事件从队列中移除。清楚地访问中断服务例程中的队列数据结构是危险的,但是自旋锁将导致死锁,因为如果主线程具有锁定并且发生中断,则ISR将永远等待锁定。

当然,我已经知道我可以在主线程处理队列时禁用中断,但这并不理想。

这里最好的方法是什么?

由于 甲

1 个答案:

答案 0 :(得分:0)

如果你可以使用固定大小的环队列,你不需要任何复杂的东西(我假设在ISR中禁用了中断),因为只有一个读取器 - 你的内核线程 - 更新尾指针,和一个作家 - ISR - 更新头指针。否则,请使用Load Linked/Store Conditional说明来实施lock-free queue