4

我可以设置工作队列的优先级吗?

我正在修改 SPI 内核模块“spidev”,以便它可以更快地与我的硬件通信。外部硬件是一个带有非常小的缓冲区的 CAN 控制器,因此我必须快速读取任何传入数据以避免丢失数据。我已经配置了一个 GPIO 中断来通知我新数据,但我无法在中断处理程序中读取 SPI 硬件。我的中断处理程序基本上设置了一个将读取 SPI 数据的工作队列。当内核中只有一个活动进程时,它可以正常工作。一旦我同时打开任何其他进程(甚至是进程查看器顶部),我就会开始丢失成串的数据,也就是说,我可能会毫无问题地收到 1000 个数据包,然后连续丢失 15 个数据包,依此类推. 我怀疑我的问题的原因是当其他进程(顶部,在这种情况下)可以控制中断处理程序运行的 cpu,但工作队列中的工作直到再次调用调度程序才开始。我试图提高我的流程的优先级,但没有成功。

我想知道是否有办法告诉内核在中断处理函数之后立即执行工作队列中的工作。欢迎提出建议。

4

1 回答 1

1

作为替代方案,您可以考虑使用 tasklet,它会告诉内核执行得更快,但请注意您无法在 tasklet 中休眠

一篇关于在内核中延迟工作的好 ibm 文章

http://www.ibm.com/developerworks/linux/library/l-tasklets/

http://www.makelinux.net/ldd3/chp-7-sect-5

只要 CPU 忙于运行进程,tasklet 就会在下一个计时器滴答时运行,但当 CPU 空闲时它会立即运行。内核提供了一组 ksoftirqd 内核线程,每个 CPU 一个,只是为了运行“软中断”处理程序,例如 tasklet_action 函数。因此,tasklet 的最后三个运行发生在与 CPU 0 关联的 ksoftirqd 内核线程的上下文中。jitasklethi 实现使用高优先级的 tasklet,在即将发布的函数列表中进行了解释。

于 2013-05-02T12:00:58.873 回答