文章目录

1 内核定时器

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

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

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

在这里插入图片描述

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

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

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

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

程序定时关闭器_linux 内核定时器_linux 内核

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 定时器函数 含义函数

初始化函数

linux 内核定时器_程序定时关闭器_linux 内核

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设备结构体 */

程序定时关闭器_linux 内核_linux 内核定时器

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);

linux 内核定时器_程序定时关闭器_linux 内核

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函数)。

本文原创地址://q13zd.cn/lnhsyqjblljl.html编辑:刘遄,审核员:暂无