了解内核定时相关基础知识
简要介绍
硬件为内核提供了一个系统定时器来计算流逝的时间(即基于未来时间点的计时方式, 以当前时刻为计时开始的起点, 以未来的某一时刻为计时的终点) , 内核只有在系统定时器的帮助下才能计算和管理时间, 但是内核定时器的精度并不高, 所以不能作为高精度定时器使用。并且内核定时器的运行没有周期性, 到达计时终点后会自动关闭。 如果要实现周期性定时, 就要在定时处理函数中重新开启定时器。
Linux 内核中使用 timer_list 结构体表示内核定时器, 该结构体定义在“内核源码/include/li
nux/timer.h”文件中, 具体内容如下所示
struct timer_list {
struct hlist_node entry;
unsigned long expires;/* 定时器超时时间,单位是节拍数 */
void (*function)(struct timer_list *);/* 定时处理函数 */
u32 flags;
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
ANDROID_KABI_RESERVE(1);
ANDROID_KABI_RESERVE(2);
};
timer_list 特点
inux 内核定时器是基于 timer_list 结构的动态定时器,具有以下特点:
-
不是周期性的,超时后会自动失效
-
基于内核的 jiffies 计时
-
在中断上下文执行,因此不能睡眠
-
精度取决于 HZ 值(通常为 1ms 或 10ms)
API 函数
| 函数 | 作用 |
|---|---|
| void add_timer(struct timer_list *timer) | 向 Linux 内核注册定时器,使用 add_timer 函数向内核注册定时器以后,定时器就会开始运行 |
| int del_timer(struct timer_list * timer) | 删除一个定时器 |
| int mod_timer(struct timer_list *timer,unsigned long expires) | 修改定时值,如果定时器还没有激活的话,mod_timer 函数会激活定时器</ |

最低0.47元/天 解锁文章
1万+






