文章目录
0.timer_list
Linux 内核使用全局变量 jiffies 来记录系统从启动以来的系统节拍数,系统启动的时候会将 jiffies 初始化为 0。
HZ 表示每秒的节拍数,jiffies 表示系统运行的 jiffies 节拍数,所以 jiffies/HZ 就
是系统运行时间,单位为秒。
Linux 内核提供了如表几个 API 函数来处理绕回
。
// unkown 通常为 jiffies,known 通常是需要对比的值。
time_after(unkown, known)
time_before(unkown, known)
time_after_eq(unkown, known)
time_before_eq(unkown, known)
如果 unkown 超过 known 的话,time_after 函数返回真,否则返回假。
unsigned long timeout;
timeout = jiffies + (2 * HZ); /* 超时的时间点 */
/*************************************
具体的代码
************************************/
/* 判断有没有超时 */
if(time_before(jiffies, timeout)) {
/* 超时未发生 */
} else {
/* 超时发生 */
}
Linux 内核提供了几个 jiffies 和 ms、us、ns 之间的转换函数,如表
// 将 jiffies 类型的参数 j 分别转换为对应的毫秒、微秒、纳秒。
int jiffies_to_msecs(const unsigned long j);
int jiffies_to_usecs(const unsigned long j)
u64 jiffies_to_nsecs(const unsigned long j)
// 将毫秒、微秒、纳秒转换为 jiffies 类型。
long msecs_to_jiffies(const unsigned int m)
long usecs_to_jiffies(const unsigned int u)
unsigned long nsecs_to_jiffies(u64 n)
struct timer_list {
struct list_head entry;
unsigned long expires; /* 定时器超时时间,单位是节拍数 */
struct tvec_base *base;
void (*function)(unsigned long); /* 定时处理函数 */
unsigned long data; /* 要传递给 function 函数的参数 */
int slack;
};
1. init_timer 函数
初始化 timer_list 类型变量
void init_timer(struct timer_list *timer)
2.add_timer函数
add_timer 函数用于向 Linux 内核注册定时器
void add_timer(struct timer_list *timer)
3.del_timer 函数
del_timer 函数用于删除一个定时器。
在多处理器系统上,定时器可能会在其他的处理器上运行,因此在调用 del_timer 函数删除定时器之前要先等待其他处理器的定时处理器函数退出。
int del_timer(struct timer_list * timer)
返回值:0,定时器还没被激活;1,定时器已经激活。
4.del_timer_sync 函数
del_timer_sync 函数是 del_timer 函数的同步版,会等待其他处理器使用完定时器再删除。del_timer_sync 不能使用在中断上下文中。
int del_timer_sync(struct timer_list *timer)
5.mod_timer 函数
mod_timer 函数用于修改定时值,如果定时器还没有激活的话,mod_timer 函数会激活定时器。
int mod_timer(struct timer_list *timer, unsigned long expires)
expires:修改后的超时时间。
返回值:0,调用 mod_timer 函数前定时器未被激活;1,调用 mod_timer 函数前定时器已被激活。
6. Linux 内核短延时函数
//纳秒、微秒和毫秒延时函数。
void ndelay(unsigned long nsecs)
void udelay(unsigned long usecs)
void mdelay(unsigned long mseces)