2010-07-01 37 views
2

我是一个拥有硬件和设备驱动程序的老手,并且使用较早的Linux版本进行硬件控制。我最近回到了使用嵌入式处理的Linux和设备控制的游戏中,并且发现Linux世界发生了很多变化(为了更好)。然而,我正在为一个硬件控制问题而苦苦挣扎,这个问题涉及到一个非常快速的基于SPI的帧数据传输内核模块,它需要在短时间帧内(5毫秒)打开所有中断,以确保数据帧的正确数据传输时序。在Linux的'过去',人们会使用save_flags - cli() - sti()框架来禁用关键部分的中断。在新的(2.6.33和更新版本)Linux IRQ控制框架内完成此操作的最简单方法是什么?如何在短时间(5ms)帧数据传输期间阻塞所有IRQ's

斯科特

+0

巴士掌握任何人?现在大多数硬件应该能够在没有CPU干预的情况下将数据传输到RAM。这是做到这一点的正确方法。 IIRC,cli()/ sti()应该仍然是2.6的向后兼容性。 – Dummy00001 2010-07-02 10:18:43

+1

5ms不再是“短” - 这实际上是数百万*浪费的CPU周期...... – caf 2010-07-04 14:40:27

回答

1

现代当量是local_irq_disable(),,local_irq_save()local_irq_restore()。然而,如此长时间地这样做(并且毫无疑问,以现代CPU速度5ms是很长时间的)被认为是相当反社会的。

请注意,现代机器有SMI(系统管理中断),它们无法被屏蔽,并且可能会占用CPU很长的时间,所以你的代码可能需要处理这种情况。

这些日子的内核是可抢占的,并且具有内核代码的高分辨率计时器 - 您的代码也许可以使用它们(请参阅include/linux/hrtimer.h)。巴士掌握任何人吗?

+0

随着更多的RT补丁集被合并,这只会变得棘手。 – stsquad 2010-07-05 11:03:59

相关问题