简介
内核定时器,也称作动态定时器。是管理内核时间的基础,是一种用来推迟执行程序的工具。
include/linux/timer.h
struct 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_LOCKDEP
struct 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);
}