2013-03-25 145 views
3

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

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

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

+2

那么,为什么你不能从ISR内部存储输入数据呢? – 2013-03-25 08:47:27

+0

http://lkml.indiana.edu/hypermail/linux/kernel/0510.2/1027.html – cnicutar 2013-03-25 08:47:59

+0

看起来你需要RT操作系统,checkout RT Linux。 – stdcall 2013-03-25 09:36:33

回答

1

正如你可以考虑使用一个tasklet或者,它会告诉内核执行更直接,但要知道,你是无法在任务蕾

在内核deffering工作提供了良好的IBM文章睡觉

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

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

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