处理linux驱动程序中的IRQ延迟

时间:2014-08-23 13:41:16

标签: linux driver device

我为SPI设备构建了一个linux驱动程序。 当准备好读取新数据时,SPI器件将IRQ发送到处理器。

IRQ大约每3 ms触发一次,然后驱动程序用SPI读取2个字节。

我遇到的问题是,有时,IRQ被触发和SPI传输开始之间的时间超过6 ms,这意味着我丢失了2个字节的SPI设备。

此外,2个字节之间存在不确定的延迟;有时它接近0,有时它高达300us ..

然后我的问题是:如何减少IRQ和SPI读数之间的延迟?

如何避免2个字节之间的延迟?

我尝试使用premptive选项编译内核,它不会改变那么多东西。

至于硬件,我使用的是运行频率为400 MHz的mini2440板,使用硬件SPI端口(非i / o模拟SPI)。

感谢您的帮助。

BR, 文森特。

2 个答案:

答案 0 :(得分:2)

brochure of the Samsung S3C2440A CPU开始,SPI接口硬件支持中断和基于DMA的操作。查看actual datasheet表明硬件还支持轮询模式。

如果您想要可靠地实现高数据速率,那么基于DMA的方法就是您所需要的。配置DMA操作后,硬件将自己将数据移动到RAM,而无需低延迟中断处理。

那就是说,我不知道你的CPU的Linux SPI驱动程序的状态。这可能是缺少对DMA,特定系统设置或甚至是如何使用您自己的代码中的驱动程序的支持的问题。细节w.r.t. SPI通常高度依赖于特定的实现......

答案 1 :(得分:0)

Linux SPI堆栈使用队列来传输消息。

这意味着无法保证您要求发送SPI消息的时刻与发送SPI消息的时刻之间的延迟。

最后,为了满足每条SPI消息之间的3ms要求,我不得不停止使用Linux SPI栈,并直接写入我自己的IRQ内的CPU寄存器。

这非常脏,但这是让它以小延迟工作的唯一方法。