1. 概念
-
系统频率:节拍率 tick rate
-
系统节拍数:jiffies 系统运行以来的节拍数
-
绕回:jiffies 溢出后置零,32 位的系统需考虑使用几个 API 处理绕回
time_after(unkown, known); time_before(unkown, known); ...
-
jiffies 和 ms us ns 之间的转换 API 函数
/* 将 jiffies 转换为 时间 */ int jiffies_to_msecs(const unsigned long j); int jiffies_to_usecs(const unsigned long j); /* 将 时间 转换为 jiffies */ long msecs_to_jiffies(const unsigned int m); long usecs_to_jiffies(const unsigned int u);
2. 原理
-
内核定时器 非 硬件定时器
-
机制
-
首先,提供 超时时间 和 定时处理函数
-
然后,到了超时时间 自动执行 定时处理函数
-
note:内核定时器不是周期性的,超时后需要手动重启定时器,以实现周期定时器
-
timer_list 结构体表示内核定时器
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 };
-
-
一些定时器操作 API
-
timer_setup 函数
定义了一个 timer_list 变量以后一定要先用 timer_setup 初始化。
/* * timer: 要初始化定时器 * func: 定时器的回调函数,此函数的形参是当前定时器的变量 * flags: 标志位,直接给 0 就行 */ void timer_setup(struct timer_list *timer, void (*func)(struct timer_list *), unsigned int flags);
-