-
make menuconfig -> Kernel Features -> -> Timer frequency ( [=y])
-
内核是使用全局变量 jiffies 来记录系统的节拍数 ,文件路径 kernel_code/include/linux/jiffies.h
-
API 函数
- 比较函数:
time_after(unkown, known)
,宏函数, unkown > known ===> , 返回1, else 返回0time_before(unkown, known)
, 宏函数, unkown < known ===> , 返回1, else 返回0time_after_eq(unkown, known)
, 宏函数, unkown >= known ===> , 返回1, else 返回0time_before_eq(unkown, known)
, 宏函数, unkown <= known ===> , 返回1, else 返回0
- 转换API:
int jiffies_to_msecs(const unsigned long j)
int jiffies_to_usecs(const unsigned long j)
u64 jiffies_to_nsecs(const unsigned long j)
long msecs_to_jiffies(const unsigned int m)
long usecs_to_jiffies(const unsigned int u)
unsigned long nsecs_to_jiffies(u64 n)
- 比较函数:
-
数据结构 , 路径: kernel_code/include/linux/timer.h
struct timer_list{ struct list_head entry; unsigned long expires; /* 定时器超时时间,单位是节拍数 */ struct tvec_base *base; void (*function)(unsigned long); /* 定时处理函数, 回调函数 */ unsigned long data; /* 要传递给 function 函数的参数 */ int slack; };
-
使用注意:内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器。
-
API
void init_timer(struct timer_list *timer)
,初始化 timer_list 类型变量,当我们定义了一个 timer_list 变量以后一定要先用 init_timer 初始化一下,相当于在链表定时器中申请一个节点要用的空间。节点先初始化,再向节点成员赋值。void add_timer(struct timer_list *timer)
,向 Linux 内核注册定时器,使用 add_timer 函数向内核注册定时器以后,定时器就会启动,即激活int del_timer(struct timer_list * timer)
,用于删除一个定时器,不管定时器有没有被激活,都可以使用此函数删除。在多处理器系统上,定时器可能会在其他的处理器上运行,因此在调用 del_timer 函数删除定时器之前要先等待其他处理器的定时处理器函数退出 返回值: 0,定时器还没被激活; 1,定时器已经激活int del_timer_sync(struct timer_list *timer)
,是 del_timer 函数的同步版,会等待其他处理器使用完定时器再删除,del_timer_sync 不能使用在中断上下文中 返回值: 0,定时器还没被激活; 1,定时器已经激活int mod_timer(struct timer_list *timer, unsigned long expires)
,修改定时值,如果定时器还没有激活的话, mod_timer 函数会激活定时器! 返回值: 0,调用 mod_timer 函数前定时器未被激活; 1,调用 mod_timer 函数前定时器已被激活。
-
内核其他短延时
- void ndelay(unsigned long nsecs)
- void udelay(unsigned long usecs)
- void mdelay(unsigned long mseces)