linux 内核定时器

本文详细解析了Linux内核定时器的工作原理,涉及定时器数据结构、函数如初始化、注册与修改,并讨论了高节拍率与低节拍率的优缺点。重点介绍了如何通过`timer_list`结构和关键函数实现定时任务的周期性管理。
摘要由CSDN通过智能技术生成

1 内核定时器

Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序等。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。

Linux 内核定时器采用系统时钟来实现,内核中配置

-> Kernel Features
		-> Timer frequency (<choice> [=y])

在这里插入图片描述

高节拍率和低节拍率的优缺点:

①、高节拍率会提高系统时间精度,如果采用 100Hz 的节拍率,时间精度就是 10ms,采用1000Hz 的话时间精度就是 1ms,精度提高了 10 倍。高精度时钟对于那些对时间要求严格的函数来说,能够以更高的精度运行,时间测量也更加准确。

②、高节拍率会导致中断的产生更加频繁,频繁的中断会加剧系统的负担, 1000Hz 和 100Hz的系统节拍率相比,系统要花费 10 倍的资源去处理中断。

Linux 内核使用全局变量 jiffies 来记录系统从启动以来的系统节拍数,系统启动的时候会将 jiffies 初始化为 0

2 定时器数据结构

struct timer_list {
	struct list_head entry;
	unsigned long expires; /* 定时器超时时间,单位是节拍数 */
	struct tvec_base *base;
	void (*function)(unsigned long); /* 定时处理函数 */
	unsigned long data; /* 要传递给 function 函数的参数 */
	int slack;
};

3 定时器函数

含义函数
初始化函数void init_timer(struct timer_list *timer)
向 Linux 内核注册定时器void add_timer(struct timer_list *timer)
修改定时值int mod_timer(struct timer_list *timer, unsigned long expires)
删除一个定时器int del_timer(struct timer_list * timer)
等待其他处理器使用完定时器再删除int del_timer_sync(struct timer_list *timer)

4 程序框架


/* timer设备结构体 */
struct timer_dev{
	struct timer_list timer;/* 定义一个定时器*/
	...
};

struct timer_dev timerdev;	/* timer设备 */

static int timer_open(struct inode *inode, struct file *filp)
{
	timerdev.timeperiod = 1000;		/* 默认周期为1s */
}

/* 定时器回调函数 */
void timer_function(unsigned long arg)
{
	//重新设置定时器,设置超时时间
	mod_timer(&dev->timertest, jiffies + msecs_to_jiffies(2000));
 }


static int __init timer_init(void)
{
	/* 初始化timer,设置定时器处理函数,还未设置周期,所有不会激活定时器 */
	init_timer(&timerdev.timer);
	timerdev.timer.function = timer_function;//回调函数
	timerdev.timer.data = (unsigned long)&timerdev;
	return 0;
}

static void __exit timer_exit(void)
{
	del_timer_sync(&timerdev.timer);		/* 删除timer */
}

Linux 内核定时器,只需要提供超时时间和定时处理函数即可,当超时时间到了以后设置的定时处理函数就会执行。

注意:内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器(使用mod_timer函数)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

为了维护世界和平_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值