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

标签 c kernel-module task-queue spi

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

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

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

最佳答案

作为替代方案,您可以考虑使用 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,在即将发布的函数列表中进行了解释。

关于我可以设置工作队列的优先级吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15610680/

相关文章:

c - dev-c++ 上的异常标识符或 '(' 之前的 'for'

c - 从左到右移动字符数组

c - 我应该释放 setlocale 返回的指针吗?

c - 内存未满时Linux内核模块OOM

c - 如何通过 hook sys_exit_group 和 sys_kill 使进程无法退出

rabbitmq - 使用 RabbitMQ 创建动态队列

java - Google App Engine 上的推送队列与拉取队列

c - 提取部分文件路径的简单方法?

linux - 如何在不重命名传递给 insmod 的 .ko 的情况下重命名内核模块名称?

google-app-engine - Google应用程序引擎任务队列和用户服务