底半部机制之work_struct(二)

工作队列

工作队列的实现和tasklet很相似,只是工作队列的执行上下文在内核线程,所以可以调度和睡眠。首先是定义一个工作队列和一个底半部执行函数

struct work_struct my_wq;  

Voidmy_wq_funcstruct work_struct *work

 

通过INIT_WORK()宏,可以初始化工作队列并将工作队列和处理函数进行绑定

INIT_WORK(&my_wq, my_wq_func);  

 

tasklet_schedule函数相对应的是schedule_work()函数,调度工作队列

Schedule_work(&my_wq)

 

工作队列的处理模型也是tasklet一样一样的,只是在初始化工作队列和关联处理函数的时候将他放在了模块初始化函数里面

//定义函数并关联他们

struct work_struct my_wq;  

Voidmy_wq_funcstruct work_struct *work

//中断处理函数

Void my_wq_func(unsignedlong){

}

//中断处理顶半部

Irqreturn_txxx_interrupt(intirq, void *dev_id){

Schedule_work(&my_wq)

}

//模块加载函数

Int __init xxx_init(){

    INIT_WORK(&my_wq, my_wq_func);//初始化最好放在前面

//申请中断

request_irq()

}

//模块卸载函数

Void __exit xxx_exit(){

//释放中断

Free_irq()

}

实际上,在一些驱动中经常看到的是work_struct和workqueue_struct一起使用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值