 
- UID
- 1029342
- 性别
- 男
|

在需要调度的时候引用类似tasklet_schedule()函数的相应调度工作队列执行的函数schedule_work(),如:schedule_work(&work);/*调度工作队列执行*/如果有时候并不希望工作马上就被执行,而是希望它经过一段延迟以后再执行。在这种情况下,可以调度指定的时间后执行函数:schedule_delayed_work(&work,delay);函数原型为:int schedule_delayed_work(struct delayed_work *work, unsigned long delay);其中是以delayed_work为结构体的指针,而这个结构体的定义是在work_struct结构体的基础上增加了一项timer_list结构体。struct delayed_work { struct work_struct work; struct timer_list timer; /* 延迟的工作队列所用到的定时器,当不需要延迟时初始化为NULL*/};这样,便使预设的工作队列直到delay指定的时钟节拍用完以后才会执行。使用工作队列处理中断下半部的设备驱动程序模板如下:/*定义工作队列和下半部函数并关联*/struct work_struct my_wq;void my_do_work(unsigned long);/*中断处理下半部*/void my_do_work(unsigned long){ ……/*编写自己的处理事件内容*/}/*中断处理上半部*/irpreturn_t my_interrupt(unsigned int irq,void *dev_id){ …… schedule_work(&my_wq)/*调度my_wq函数,根据工作队列初始化函数将去执行my_do_work函数*/ ……}/*设备驱动的加载函数*/int __init xxx_init(void){ …… /*申请中断,转去执行my_interrupt函数并传入参数*/ result=request_irq(my_irq,my_interrupt,IRQF_DISABLED,"xxx",NULL); …… /*初始化工作队列函数,并与自定义处理函数关联*/ INIT_WORK(&my_irq,(void (*)(void *))my_do_work); ……}/*设备驱动模块的卸载函数*/void __exit xxx_exit(void){……/*释放中断*/free_irq(my_irq,my_interrupt);……} |
|