如何在原子上下文中创建内核线程并多次使用它[BUG:原子时调度]

时间:2013-10-02 20:32:33

标签: multithreading linux-kernel linux-device-driver embedded-linux atomic

我需要在驱动程序内核代码中使用kthread_run。该线程倾向于在设备传输数据的地方打开/关闭LED。所以基本上我不希望由于LED闪烁延迟时间而减慢传输速度。 我想在数据包传输代码的某处创建一个线程,这样线程就可以根据传输速率进行LED闪烁过程。 但显然创建一个线程需要与线程调度程序进行交互,这在中断/原子上下文中是不允许的,并且会生成BUG:在原子时调度。根据我的研究,一种方法可能是在其他地方创建内核线程,并将中断请求处理队列到它。有人可以再详细说明一下吗? 所以这不是我们有中断线程的情况。我基本上需要一个功能,它有自己的线程远离我的主线程。我会随时调用此函数!如果目前还不清楚,请告诉我。感谢。

1 个答案:

答案 0 :(得分:4)

您实际上并不想要内核线程。你想要一个工作队伍。您可以从上半部分中断工作函数,内核会在有时间的情况下在进程上下文中运行它。如果您可以避免睡眠,则可以通过函数schedule_work()schedule_delayed_work()使用共享队列。

为避免睡眠,请排列一个工作功能以打开LED。在该函数结束时,将延迟的工作函数排队以将其关闭。

如果你想要做一个简单的TURN_ON(); sleep(); TURN_OFF(),你需要在模块init创建自己的工作队列,并使用queue_work()queue_delayed_work()

提交给它

参考: http://www.makelinux.net/ldd3/chp-7-sect-6