《Linux驱动基础篇》- Linux内核定时器
来源:互联网 发布:网络管理考试题 编辑:程序博客网 时间:2024/05/21 09:34
Linux内核定时器子系统比较复杂,这里先给出动态定时器的使用。
动态定时器的使用很简单,你只需要执行一些初始化工作,设置一个超时事件,指定超时发生后执行的函数,然后激活定时器就可以了。指定的函数将在定时器到期时执行。动态定时器并不像系统定时器那样周期性的运行,它在超时后就自动撤销,之后还可以继续创建,因此这种定时器才被称为动态定时器。
动态定时器可以不断的被创建和销毁,而且它的运行次数也不受限制,因此在内核中应用得非常普遍。
定时器由结构timer_list表示,定义在文件<linux/timer.h>中
struct timer_list { struct list_head entry; //定时器链表的入口 unsigned long expires; //单位与jiffies相同,指超时时间 void (*function) (unsigned long); //定时器处理函数 unsigned long data; //传给处理函数的参数 struct tvec_t_base_s *base; //定时器内部值,用户不需要使用}1.创建定时器需要先定义: struct timer_list m_timer;
2.使用辅助函数来初始化定时器内部值:init_timer(&m_timer);
3.填充timer结构中需要的值:
m_timer.expires = jiffies + delay; //定时器超时值m_timer.function = timer_handler; //定时器处理函数 m_timer.data = 0; //定时器处理函数参数定时器处理函数原型:void timer_handler(unsigned long data);
其中多个动态定时器可以复用一个定时器处理函数,处理内部可以使用data对不同定时器做区分。
4.最后需要激活定时器:add_timer(&m_timer);
这里需要注意,动态定时器是用软件实现的,在执行定时器中断函数时可能会有一定的延时,因此不能使用动态定时器来实现任何硬实时要求。
5.同时还可以通过mod_timer(&m_timer, jiffies + new_delay); 来实现修改已激活的定时器超时时间,并激活该定时器。
注意:定时器已超时,会自动被删除就不要再使用用mod_timer;一个定时器处理函数正在被其它处理器运行,这时候要等运行完才能删除,所以可以使用del_timer_sysc(&m_timer);来删除工作。
到此为止,timer的用法介绍完了,使用起来也比较简单。从timer_list结构来看,这是一个用软件链表来维护的定时器,下面研究一下它的实现。
- 《Linux驱动基础篇》- Linux内核定时器
- Linux内核定时器基础
- Linux设备驱动---内核定时器
- linux驱动开发--内核定时器
- Linux 驱动之内核定时器
- linux内核驱动之定时器
- Linux定时器的使用-内核驱动定时器
- Linux定时器的使用-内核驱动定时器
- Linux驱动之内核定时器驱动设计
- linux驱动之内核定时器驱动设计
- linux内核驱动基础
- linux驱动学习之内核定时器使用
- 《Linux设备驱动开发详解》-- 内核定时器
- linux内核定时器驱动一个简单例子
- [Linux驱动入门]内核基础
- Linux驱动基础 内核模块
- linux-内核-内核定时器
- 《Linux驱动基础篇》- Linux内核并发问题
- ExpandableListview中 解决ImageButton冲突的问题。
- OCP 1Z0 052 63
- 兼容各个浏览器的H.264播放: H.264+HTML5+FLOWPLAYER+WOWZA+RMTP
- android中调试Service的方法
- error code [1260]; %d line(s) were cut by GROUP_CONCAT();
- 《Linux驱动基础篇》- Linux内核定时器
- JAVA的四大组成部分
- 抓住一切机会从小事做起 优秀营销人死守的5个秘密
- C++ Primer学习之(11)——泛型算法
- 为php安装mcrypt
- 简易高重用的jdbcutils工具封装实现类以及简易连接池实现
- Linux内核工作队列
- .net 实现网页截图
- [转载] 关于ckEditor 的一些小知识