简介
内核定时器,也称作动态定时器。是管理内核时间的基础,是一种用来推迟执行程序的工具。
include/linux/timer.hstruct timer_list {/** All fields that change during normal runtime grouped to the* same cacheline*/struct hlist_node entry;unsigned long expires;// 定时器到期的tick数,也就是 jiffies这个全局变量中void (*function)(unsigned long); // 定时器到期执行的函数unsigned long data; // 传递的参数u32 flags; //...#ifdef CONFIG_LOCKDEPstruct lockdep_map lockdep_map;#endif};
Linux内核系统中,分为硬件时钟(实时时钟)和软件时钟(系统时钟)。内核编程过程中,我们常用到的是软件时钟(系统时钟)。系统时钟时在系统启动的时候,读取的硬件时钟(实时时钟)所得。然后由内核维护。
系统时钟以某种频率触发时钟中断,这个频率就是我们常说的节拍率tick rate。节拍率是通过静态预处理生成的,被定义为HZ。HZ被定义为1秒产生多少个时钟中断。如下,HZ为100,表示一个tick为10ms。
#define HZ 100/*jiffies 表示从系统运行至今,tick数*/extern unsigned long volatile __jiffy_data jiffies;
内核定时器
基于时间轮算法的内核定时器。是一个动态的定时器。
内核定时器的精度不高。若是需要实时性比较高的定时器,推荐使用hrtimer,
使用
使用内核定时器的一般步骤为
- 定义一个timer_list结构,编写回调函数
- 初始化timer,为其expires、flags参数赋值
- 调用add_timer。将定时器添加到系统中
- 回调函数被执行以后,调用del_timer或者mod_timer。删除或者重新修改定时器。
API
#define DEFINE_TIMER(_name, _function, _expires, _data) # 定义一个timerlist结构体extern void add_timer(struct timer_list *timer); /*向系统加入timer_list*/extern int del_timer(struct timer_list * timer);extern int mod_timer(struct timer_list *timer, unsigned long expires);
使用例子
#include <linux/timer.h>/*内核定时器*/static struct timer_list mytimer;/*回调函数*/static void qt_task(unsigned long data){struct timer_list *timer = (struct timer_list *)data;.../*重新赋值*/mod_timer(timer,jiffies+msecs_to_jiffies(1000));}static int __init hello_world_init(void) {setup_timer(&mytimer,qt_task,(unsigned long)&mytimer);add_timer(&mytimer);}static void __exit hello_world_exit(void) {del_timer(&mytimer);}
