文章目录
1 内核定时器
Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序等。硬件定时器提供时钟源红帽子linux,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,使用定时中断来计时。
Linux 内核定时器采用系统时钟来实现,内核中配置
-> Kernel Features
-> Timer frequency ( [=y])
高节拍率和低节拍率的优缺点:
①、高节拍率会提高系统时间精度,如果采用 100Hz 的节拍率qq linux,时间精度就是 10ms,采用1000Hz 的话时间精度就是 1mslinux 内核定时器linux 内核定时器,精度提高了 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函数)。
本文原创地址://q13zd.cn/lnhsyqjblljl.html编辑:刘遄,审核员:暂无