Linux驱动中delayed_workqueue使用
2011-08-26 18:14
302 查看
Linux驱动中delayed_workqueue使用:
在驱动中,有时不能使用中断(这种情况很少遇到), 此时delayed_workqueue就可以发挥其巨大的功效了。也可以用其它同类的内核API实现:如timer。
delayed_workqueue的使用过程如下:
--> 定义workqueue: struct workqueue_struct *test_workqueue; // 定义在: kernel/workqueue.c
--> 定义workqueue要做的delayed工作:struct delayed_work test_delayed_work; // 定义在: include/linux/workqueue.h
--> 初始化workqueue:INIT_DELAYED_WORK(&test_delayed_work, test_workqueue_func); // 定义在:include/linux/workqueue.h
--> 创建线程queue并加以名字:test_workqueue = create_singlethread_workqueue("name_of_this_queue");
--> 运行queue:queue_delayed_work(test_workqueue, &test_delayed_work, delay_time); // 定义在:kernel/workqueue.c, 其中delay_time是延迟多少时间来运行queue。
注: 在test_workqueu_func中一定要再次将delayed_workqueue加入queue中,即再次运行queue_delayed_work。否则,此queue只运行一次。
下面详细讲解每个函数。
初始化entry链表;
将_func传给work的_func。
init_timer_key((timer), NULL, NULL) --> debug_time_init [ NOP]
使用delayed workqueue最主要的是调用queue_delayed_work。
如果delay = 0,则直接调用:queue_work
其具体实现过程:queue_work --> queue_work_on --> __queue_work --> insert_work
如果delay !=0,则调用:queue_delayed_work_on
其具体实现过程:queue_delayed_work_on 此函数是通过timer来完成最后的延时工作。
在驱动中,有时不能使用中断(这种情况很少遇到), 此时delayed_workqueue就可以发挥其巨大的功效了。也可以用其它同类的内核API实现:如timer。
delayed_workqueue的使用过程如下:
--> 定义workqueue: struct workqueue_struct *test_workqueue; // 定义在: kernel/workqueue.c
--> 定义workqueue要做的delayed工作:struct delayed_work test_delayed_work; // 定义在: include/linux/workqueue.h
--> 初始化workqueue:INIT_DELAYED_WORK(&test_delayed_work, test_workqueue_func); // 定义在:include/linux/workqueue.h
--> 创建线程queue并加以名字:test_workqueue = create_singlethread_workqueue("name_of_this_queue");
--> 运行queue:queue_delayed_work(test_workqueue, &test_delayed_work, delay_time); // 定义在:kernel/workqueue.c, 其中delay_time是延迟多少时间来运行queue。
注: 在test_workqueu_func中一定要再次将delayed_workqueue加入queue中,即再次运行queue_delayed_work。否则,此queue只运行一次。
下面详细讲解每个函数。
#define INIT_DELAYED_WORK(_work, _func) \ do { \ INIT_WORK(&(_work)->work, (_func)); \ init_timer(&(_work)->timer); \ } while (0)
#define INIT_WORK(_work, _func) \ do { \ (_work)->data = (atomic_long_t) WORK_DATA_INIT(); \ INIT_LIST_HEAD(&(_work)->entry); \ PREPARE_WORK((_work), (_func)); \ } while (0) #endif // WORK_DATA_INIT() == 0; // PREPARE_WORK((_work), (_func)) == (_work)->func = (_func); struct delayed_work { struct work_struct work; struct timer_list timer; };INIT_WORK的主要工作是data赋值为0;
初始化entry链表;
将_func传给work的_func。
#define init_timer(timer) init_timer_key((timer), NULL, NULL)
init_timer_key((timer), NULL, NULL) --> debug_time_init [ NOP]
使用delayed workqueue最主要的是调用queue_delayed_work。
如果delay = 0,则直接调用:queue_work
其具体实现过程:queue_work --> queue_work_on --> __queue_work --> insert_work
如果delay !=0,则调用:queue_delayed_work_on
其具体实现过程:queue_delayed_work_on 此函数是通过timer来完成最后的延时工作。
相关文章推荐
- Linux驱动中delayed_workqueue使用:
- 关于 VM Linux操作系统使用 360随身wifi的驱动安装问题
- cancel_rearming_delayed_workqueue 函数使用的一个小备注
- Linux 字符类驱动使用rmmod卸载驱动出现问题
- beaglebone black上使用TI sdk中的linux系统来编写spi驱动
- Linux视频设备驱动常用控制命令使用说明
- Linux 设备驱动开发 —— 设备树在platform设备驱动中的使用
- Linux视频设备驱动常用控制命令使用说明
- Linux设备驱动之中断---work_queue使用示例
- Linux 设备驱动--- 并发 之- 信号量 --- semaphore --- down_interruptible --- 按键信号量使用
- Linux内核驱动之GPIO子系统(一)GPIO的使用
- Linux视频设备驱动常用控制命令使用说明
- linux使用open无法打开驱动解决方式
- Linux内核驱动之GPIO子系统(一)GPIO的使用
- linux驱动中使用定时器的设置
- Linux驱动模型学习(一)---字符设备驱动模型之一---使用字符设备驱动
- FS4412开发板使用Linux IIO驱动框架实现ADC驱动
- 在Zynq 7000平台上使用Linux spidev.c驱动,调试spi设备
- 基于linux-2.6.38.8内核的SDIO/wifi驱动分析&&android 平台USB wifi驱动移植及使用 SDIOwifi
- Linux驱动调试中的Debugfs的使用简介