`
fuerbosi
  • 浏览: 462982 次
文章分类
社区版块
存档分类
最新评论

定时器+工作队列 内核周期性任务的实现机制

 
阅读更多
1 /* 本程序结合了内核定时器 和 工作队列 用于实现 周期性任务
2 * 其工作原理是 在定时器处理函数中 做完相应的工作后 延后expires 并将定时器
3 * 再次添加到内核定时器链表 以便定时器能再次触发
4 */
5 #include<linux/kernel.h>
6 #include<linux/module.h>
7 #include<linux/init.h>
8 #include<linux/timer.h> /*timer*/
9 #include<asm/uaccess.h> /*jiffies*/
10
11 #define TIMER_OVER 3 /*调用时间间隔*/
12
13 MODULE_LICENSE("GPL");
14 MODULE_AUTHOR("wenhui");
15 MODULE_DESCRIPTION("Timer_worklist Module");
16
17 static struct timer_list xxx_timer; /*内核定时器*/
18 static struct work_struct xxx_work_q; /*工作队列(中断下半部方法中的1种)*/
19
20 static int counter = 0; /*进入中断次数统计*/
21
22 /*定时器中断服务程序*/
23 static void xxx_timer_function(int para)
24 {
25 //调度工作队列
26 if(schedule_work(&xxx_work_q) == 0){
27 printk("<0> cannot schedule work !!!\n");
28 }
29 counter++;
30 printk("<0> Timer Expired and para is %d s !!\n", para);
31 printk("<0> counter = %d\n\n",counter);
32 }
33
34 //注册一个内核定时器
35 static void xxx_timer_register(struct timer_list* ptimer, unsigned int timeo ver){
36 printk("<0> timer_register!\n");
37 init_timer(&xxx_timer);
38 xxx_timer.data = timeover;
39 xxx_timer.expires = jiffies + (5 * HZ);
40 xxx_timer.function = xxx_timer_function;
41 add_timer(&xxx_timer);
42 }
43
44 //定时器底半部处理函数
45 static void xxx_fectch_thread(struct work_struct *work)
46 {
47 printk("<0> xxx_fectch_thread\n");
48 xxx_timer_register(&xxx_timer, TIMER_OVER);
49 }
50
51 int __init xxx_init(void)
52 {
53 xxx_timer_register(&xxx_timer, TIMER_OVER);
54 //初始化工作队列并将工作队列与处理函数绑定
55 INIT_WORK(&xxx_work_q, xxx_fectch_thread);
56 printk("<0> xxx_init\n");
57 return 0;
58 }
59
60 void __exit xxx_exit()
61 {
62 del_timer(&xxx_timer);
63 printk("<0>xxx_exit!\n");
64 }
65
66 module_init(xxx_init);
67 module_exit(xxx_exit);
68


1 /* 本程序结合了内核定时器 和 工作队列 用于实现 周期性任务
2 * 其工作原理是 在定时器处理函数中 做完相应的工作后 延后expires 并将定时器
3 * 再次添加到内核定时器链表 以便定时器能再次触发
4 */
5 #include<linux/kernel.h>
6 #include<linux/module.h>
7 #include<linux/init.h>
8 #include<linux/timer.h> /*timer*/
9 #include<asm/uaccess.h> /*jiffies*/
10
11 #define TIMER_OVER 3 /*调用时间间隔*/
12
13 MODULE_LICENSE("GPL");
14 MODULE_AUTHOR("wenhui");
15 MODULE_DESCRIPTION("Timer_worklist Module");
16
17 static struct timer_list xxx_timer; /*内核定时器*/
18 static struct work_struct xxx_work_q; /*工作队列(中断下半部方法中的1种)*/
19
20 static int counter = 0; /*进入中断次数统计*/
21
22 /*定时器中断服务程序*/
23 static void xxx_timer_function(int para)
24 {
25 //调度工作队列
26 if(schedule_work(&xxx_work_q) == 0){
27 printk("<0> cannot schedule work !!!\n");
28 }
29 counter++;
30 printk("<0> Timer Expired and para is %d s !!\n", para);
31 printk("<0> counter = %d\n\n",counter);
32 }
33
34 //注册一个内核定时器
35 static void xxx_timer_register(struct timer_list* ptimer, unsigned int timeo ver){
36 printk("<0> timer_register!\n");
37 init_timer(&xxx_timer);
38 xxx_timer.data = timeover;
39 xxx_timer.expires = jiffies + (5 * HZ);
40 xxx_timer.function = xxx_timer_function;
41 add_timer(&xxx_timer);
42 }
43
44 //定时器底半部处理函数
45 static void xxx_fectch_thread(struct work_struct *work)
46 {
47 printk("<0> xxx_fectch_thread\n");
48 xxx_timer_register(&xxx_timer, TIMER_OVER);
49 }
50
51 int __init xxx_init(void)
52 {
53 xxx_timer_register(&xxx_timer, TIMER_OVER);
54 //初始化工作队列并将工作队列与处理函数绑定
55 INIT_WORK(&xxx_work_q, xxx_fectch_thread);
56 printk("<0> xxx_init\n");
57 return 0;
58 }
59
60 void __exit xxx_exit()
61 {
62 del_timer(&xxx_timer);
63 printk("<0>xxx_exit!\n");
64 }
65
66 module_init(xxx_init);
67 module_exit(xxx_exit);
68

分享到:
评论

相关推荐

    giCell zlg-gui

    在一系统(定时器服务)任务中实现内核定时器,用于超时等待内核对象、周期性定 时器、任务延迟、一次定时(此时需定义一超时后执行的过程);此服务任务的优先 级由其客户任务的最高优先级驱动,随之动态改变,...

    Windows内核安全与驱动开发光盘源码

    第1章 内核上机指导 2 1.1 下载和使用WDK 2 1.1.1 下载并安装WDK 2 1.1.2 编写第一个C文件 4 1.1.3 编译一个工程 5 1.2 安装与运行 6 1.2.1 下载一个安装工具 6 1.2.2 运行与查看输出信息 7 1.2.3 在虚拟机...

    Windows内核安全驱动开发(随书光盘)

    第1章 内核上机指导 2 1.1 下载和使用WDK 2 1.1.1 下载并安装WDK 2 1.1.2 编写第一个C文件 4 1.1.3 编译一个工程 5 1.2 安装与运行 6 1.2.1 下载一个安装工具 6 1.2.2 运行与查看输出信息 7 1.2.3 在虚拟机...

    LINUX编程白皮书 (全集)

    第9章 内核机制与模块 107 9.1 内核机制 107 9.1.1 Bottom Half控制 107 9.1.2 任务队列 108 9.1.3 定时器 109 9.1.4 等待队列 110 9.1.5 自旋锁 110 9.1.6 信号量 110 9.2 模块 111 9.2.1 模块载入 112 9.2.2 模块...

    先进简约高速的服务器内核:ServerCore 项目

    1〉定时器部分,定时系统支持无限时间运行,单位定时器时限 天。 2〉数据库部分,采用封装ADO组件接口,仿真db server。 3〉网络部分,采用封装IOCP接口,Accepter支持TCP链接。 4〉消息队列部分,静态内存缓冲策略...

    嵌入式\(高校应用案例)北航软件学院

    下半部和工作队列;内核同步方法;定时器和时间管理;内存管理;进程地址空间;内核调试技术;内核可移植性概述。 ZKQ090208 嵌入式Linux驱动开发 设备驱动及内核模块概述;构造和运行模块;编写字符设备驱动程序I...

    Linux编程从入门到精通

    linux内核编程 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 ...

    LINUX编程白皮书

    对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究Linux下的编程有很大的帮助。 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分...

    linux编程白皮书

    对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究Linux下的编程有很大的帮助。 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分...

    Linux编程白皮书

    第9章 内核机制与模块 107 9.1 内核机制 107 9.1.1 Bottom Half控制 107 9.1.2 任务队列 108 9.1.3 定时器 109 9.1.4 等待队列 110 9.1.5 自旋锁 110 9.1.6 信号量 110 9.2 模块 111 9.2.1 模块载入 112 9.2.2 模块...

    Linux编程资料

    第9章 内核机制与模块 107 9.1 内核机制 107 9.1.1 Bottom Half控制 107 9.1.2 任务队列 108 9.1.3 定时器 109 9.1.4 等待队列 110 9.1.5 自旋锁 110 9.1.6 信号量 110 9.2 模块 111 9.2.1 模块载入 112 9.2.2 模块...

    windows驱动开发技术详解-part2

     目前,电子系统设计广泛采用通用操作系统,达到降低系统的设计难度和缩短研发周期。实现操作 系统与硬件快速信息交换是电子系统设计的关键。  通用操作系统硬件驱动程序的开发,编写者不仅需要精通硬件设备、...

    Windows驱动开发技术详解的光盘-part1

    这是书的光盘。共分为两部分,这是第二部分。 本书由浅入深、循序渐进地介绍了Windows驱动程序的开发方法与调试技巧。本书共分23章,内容涵盖... 10.2 定时器实现方式二  10.2.1 DPC定时器  10.2.2 示例代码  ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    05 迭代器协议和for循环工作机制 06 迭代器补充 07 三元运算,列表解析,生成器表达式 第19章 01 生成器函数 02 生成器函数的好处 03 母鸡下蛋的传说 04 生成器特性阐释 05 生产者消费者模型 06 第三次作业讲解 ...

    【RT-Thread作品秀】智能路灯-电路方案

    data_thread线程可以上传数据了,这里会做循环处理,周期性的检查onenet_mqtt的状态,如果已经断线,就进行再次连接。 onenet_upload_data_entry:take信号量的方式,获取到信号量之后,通过邮箱获取到的内存池首地址...

Global site tag (gtag.js) - Google Analytics