我可以设置工作队列的优先级吗?
我正在修改SPI内核模块“spidev”,以便它可以更快地与我的硬件通信。 外部硬件是一个CAN控制器,具有非常小的缓冲区,因此我必须快速读取任何传入数据以避免丢失数据。 我已配置GPIO中断以通知我新数据,但我无法读取中断处理程序中的SPI硬件。 我的中断处理程序基本上设置了一个读取SPI数据的工作队列。 当内核中只有一个活动进程时,它工作正常。 一旦我同时打开任何其他进程(甚至进程查看器顶部),我就开始丢失数据,即,我可能会收到1000个数据包没有问题,然后连续丢失15个数据包,依此类推。 我怀疑我的问题的原因是,当另一个进程(在这种情况下,顶部)控制cpu时,中断处理程序运行,但工作队列中的工作不会再次调用调度程序。 我试图提高流程的优先级但没有成功。
我想知道是否有办法告诉内核在中断处理函数之后立即执行workqueue中的工作。 欢迎提出建议。
答案 0 :(得分: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,在即将发布的函数列表中进行了解释。