1

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

4

1 回答 1

4

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

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

如果你想做一个简单的TURN_ON(); sleep(); TURN_OFF(),你需要在模块初始化时创建你自己的工作队列,并使用和提交给queue_work()queue_delayed_work()

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

于 2013-10-03T15:49:23.740 回答