Linux 驱动开发基础---中断下半部处理---工作队列
作者:
也许
,
2022-05-15 20:07:28
,
所有人可见
,
阅读 269
工作队列引入
前面讲的定时器、下半部tasklet,它们都是在中断上下文中执行,它们无法休眠(不能被调度)。当要处理更复杂的事情
时,往往更耗时这些更耗时的工作放在定时器或是下半部中,会使得系统很卡;并且循环等待某件事情完成也太浪费CPU资
源了。
如果使用线程来处理这些耗时的工作,那就可以解决系统卡顿的问题:因为线程可以休眠。
在内核中,我们并不需要自己去创建线程,可以使用“工作队列”(workqueue)。内核初始化工作队列就为它创建了内核线程
常用函数
初始化工作队列:#define INIT_WORK(_work, _func)
调用schedule_work
就会把work_struct结构体放入队列中,并唤醒对应的内核线程。内核线程就会从队列里把work_struct结构体取出来,
执行里面的函数。
编程
probe 函数中初始化work_queue
中断服务程序中调度work_queue(创建内核线程)
任务处理函数中打印key值