定期hid_hw_raw_request内核模块,如何?



我正在编写一个内核模块,需要定期询问隐藏的原始设备。 我尝试了 hrtimer 和一个简单的计时器,每次我打电话给hid_hw_raw_request我都会得到一个"BUG: scheduling while atomic".

如果我在我的计时器函数之外尝试相同的功能(例如在init中),它工作正常(没有错误)。

如何定期调用此函数而不会产生任何错误?

您需要使用工作队列将hid_hw_raw_request作为延迟工作发出。这可以如以下示例模块中所示完成:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/workqueue.h>
static void hid_work_handler(struct work_struct *hid_work);
static struct workqueue_struct *hid_workqueue;
static DECLARE_WORK(hid_work, hid_work_handler);
static void hid_work_handler(struct work_struct *hid_work)
{
...
hid_hw_raw_request(...);
...
}
static int __init hid_work_init(void)
{
if (!hid_workqueue)
hid_workqueue = create_singlethread_workqueue("hid_workqueue");
if (hid_workqueue)
queue_work(hid_workqueue, &hid_work);
return 0;
}
static void __exit hid_work_exit(void)
{
if (hid_workqueue) {
flush_workqueue(hid_workqueue);
destroy_workqueue(hid_workqueue);
}
}
module_init(hid_work_init);
module_exit(hid_work_exit);
MODULE_DESCRIPTION("hid_work_test");
MODULE_LICENSE("GPL");

请注意,对于实际实现,您需要创建自己的数据结构,其中包含要排队的结构work_struct。此数据结构可能包含hid_work_handler执行实际传输所需的 hiddev、缓冲区等。有关更多详细信息,请参阅 LDD3 第 7 章(尽管调用的语法已过时,但基本解释仍然适用)。

相关内容

  • 没有找到相关文章

最新更新