# Linux内核定时器 ## 简介 我们在编译 Linux内核的时候可以通过图形化界面设置系统节拍率,按照如下路径打开配置界面: ![](media/image-20210829151104816.png) 可以看出,可选的系统节拍率为 100Hz、 200Hz、 250Hz、 300Hz、 500Hz和1000Hz,默认情况下选择 100Hz,编写 Linux驱动的时候会常常用到 HZ,HZ表示一秒的节拍数,也就是频率。即上面的这些频率值 定义在include/asm-generic/param.h里面 ```c # undef HZ # define HZ CONFIG_HZ // 这里定义 CONFIG_HZ即是通过配置界面生成在.config里面的值 # define USER_HZ 100 # define CLOCKS_PER_SEC (USER_HZ) ``` Linux内核使用全局变量 jiffies来记录系统从启动以来的系统节拍数,系统启动的时候会将 jiffies初始化为 0 ,jiffies定义在文件 `include/linux/jiffies.h`中,定义如下: ```c extern u64 __jiffy_data jiffies_64; extern unsigned long volatile __jiffy_data jiffies; // jiffies_64 和jiffies一个是64位的一个是32位的,jiffies其实就是jiffies_64的低32位而已 ``` 常用api函数如下: unkown 通常为jiffies,known 通常是需要对比的值。 | 函数 | 功能 | | ----------------------------- | ----------------------------------------- | | time_after(unkown, known) | unkown>known 超时 返回真,否则返回假 | | time_after_eq(unkown, known) | unkown>=known 刚超时 返回真,否则返回假 | | time_before(unkown, known) | unkowntimertest, jiffies + msecs_to_jiffies(2000)); } /* 初始化函数 */ void init(void) { init_timer(&timer); /* 初始化定时器 */ timer.function = function; /* 设置定时处理函数 */ timer.expires=jffies + msecs_to_jiffies(2000);/* 超时时间2秒 */ timer.data = (unsigned long)&dev; /* 将设备结构体作为参数 */ add_timer(&timer); /* 启动定时器 */ } /* 退出函数 */ void exit(void) { del_timer(&timer); /* 立即删除定时器 */ /* 或者使用 */ del_timer_sync(&timer); /* 会等定时器处理函数完成后在删除*/ } ``` ## 内核常用的短延时函数 | 函数 | 功能 | | --------------------------------- | ------------- | | void ndelay(unsigned long nsecs) | 纳秒 延时函数 | | void udelay(unsigned long usecs) | 微秒 延时函数 | | void mdelay(unsigned long mseces) | 毫秒 延时函数 |