Linuxd的内核定时器 timer_list

16 篇文章 2 订阅
本文详细介绍了Linux内核定时器的工作原理,包括其结构、相关API函数如mod_timer、init_timer等,并提供了使用定时器的实际步骤。通过实例演示如何设置超时时间、启动定时器,适合深入理解Linux内核计时机制的开发者。
摘要由CSDN通过智能技术生成
1.内核定时器介绍

​ 内核定时器是内核用来控制在未来某个时间点(基于jiffies(节拍总数))调度执行某个函数的一种机制,相关函数位于 <linux/timer.h> 和 kernel/timer.c 文件中。

​ 当内核定时器定时时间到达时,会进入用户指定的函数,相当于软中断。内核定时器注册开启后,运行一次就不会再运行(相当于自动注销),我们可以重新设置定时器的超时时间,让定时器重复运行。

​ 每当时钟中断发生时,全局变量jiffies(一个32位的unsigned long 变量)就加1,因此jiffies记录了linux系统启动后时钟中断发生的次数,驱动程序常利用jiffies来计算不同事件间的时间间隔。内核每秒钟将jiffies变量增加HZ次。因此,对于HZ值为100的系统,jiffy+1等于隔了10ms,而对于HZ为1000的系统,jiffy+1仅为1ms。

内核定时器结构体

 //timer_list-4.15之前版本
struct timer_list {
    struct list_head entry //定时器列表
	unsigned long expires; //设置定时器到期时间,用jiffies作为基准值
    struct tvec_base *base//管理检测时间
	void (*function)(unsigned long); //类似中断服务函数,设置定时器到时后处理的函数 
    unsigned long data; //中断服务函数的参数
}
2.内核定时器相关API函数
//声明结构变量
struct timer_list mytimer;
//初始化
void init_timer(struct timer_list *timer);
//增加定时器
void add_timer(struct timer_list *timer)
//修改定时器expire
int mod_timer(struct timer_list *timer,unsigned long expire)
//删除定时器
int del_timer(struct timer_list *timer)
2.1 修改定时器超时时间
函数原型*int mod_timer(struct timer_list timer, unsigned long expires)
函数功能修改定时器超时时间
函数参数timer:对应的定时器结构体 expires:超时时间
函数返回值成功返回 :修改成功的时间值
2.2 初始化定时器
函数原型#define init_timer(timer)
函数功能初始化定时器结构
函数参数timer:对应的定时器结构体
2.3 关闭定时器
函数原型int del_timer(struct timer_list *timer)
函数功能关闭定时器,停用一个定时器。
函数参数timer:对应的定 时器结构体
函数返回值返回0:成功
2.4 关闭定时器
函数原型int del_timer_sync(struct timer_list *timer)
函数功能关闭定时器,停用一个定时器,多处理器使用。
函数参数timer:对应的定时器结构体
函数返回值返回0:成功
2.5 转换时间(微妙单位)
函数原型unsigned long usecs_to_jiffies(const unsigned int m)
函数功能转换时间(微妙单位),用于填充定时器结构体,设置超时时间
函数参数m:要转换的时间值(微妙为单位)
函数返回值成功返回转换成功的时间。用于填充定时器结构体,设置超时时间
2.6 转换时间(毫秒为单位)
函数原型unsigned long msecs_to_jiffies(const unsigned int m)
函数功能转换时间(毫秒为单位),用于填充定时器结构体,设置超时时间
函数参数m:要转换的时间值(毫秒为单位)
函数返回值成功返回转换成功的时间。用于填充定时器结构体,设置超时时间
3.使用定时器的步骤
void callback(unsigned long arg){
    int *strp = (int*)arg
    printf(strp);//输出的是12
    tm.expires = jiffies+1*HZ//重新设置时间
    add_timer(&tm);//再次启动定时器
}
(1) 定义定时器结构体timer_list。
/*定义一个内核定时器配置结构体*/
static struct timer_list mytimer ; 

(2) 设置超时时间,定义定时器处理函数和传参。
 mytimer.expires=jiffies+ msecs_to_jiffies(1000); /*设置定时器的超时时间,1000毫秒*/
 //mytimer.expires=jiffies+HZ; /*设置定时器的超时时间,1000毫秒*/
 //两者相同
 //mytimer.expires = jiffies(可以理解成当前时间) + 1*HZ   定时时间  1*HZ 一秒钟节拍数量
 //此行可以理解为 当前时间加上1秒钟  一秒钟后到时

mytimer.function = callback;	 /*定时器超时的回调函数,类似中断服务函数*/
mytimer.data = 12;               /*传给定时器服务函数的参数*/
(3) 启动定时器
add_timer(&tm);//启动定时器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unknown To Known

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值