目录
一、时间管理和内核定时器
1.1、时间管理
linux内核使用全局变量jiffies来记录系统从启动以来的系统节拍数,系统启动的时候会将jiffies初始化为0。
内核提供了几个jiffies和ms、us、ns之间的转换函数

1.2、内核定时器
内核定时器并不是周期性运行的,超时以后会自动关闭,因此如果想要实现周期性定时,那么需要在定时处理函数里重新开启定时器。内核定义如下:
struct timer_list {
struct list_head entry;
unsigned long expires; /* 定时器超时时间,单位是节拍数 */
struct tvec_base *base;
void (*function)(unsigned long); /* 定时处理函数 */
unsigned long data; /* 要传递给 function 函数的参数 */
int slack;
};
expires表示超时时间,单位为节拍数,比如现在需要定义一个周期为2秒的定时器,那么这个定时器超时时间为jiffies+(2*HZ),因此expires=jiffies+(2*HZ)。
1.3、定时器API
1.3.1、init_timer
定义一个time_list变量后要用init_timer初始化一下。
/*
@Decription:初始化定时器
@timer:要初始化的定时器
*/
void init_timer(struct timer_list *timer)
1.3.2、add_timer
用于向内核注册一个定时器,注册成功以后,定时器就会开始运行。
/*
@Decription:注册定时器
@timer:要注册的定时器
*/
void add_timer(struct timer_list *timer)
1.3.3、del_timer
用于删除定时器,不管定时器有没有被激活,都可以用来删除定时器
在多处理器系统上,定时器可能会在其他的处理器上运行,因此在调用 del_timer 函数删除定时器之前要先等待其他处理器的定时处理器函数退出
/*
@Decription:删除定时器
@timer:要删除的定时器
@return:0,定时器还没被激活
1,定时器已经激活
*/
int del_timer(struct timer_list *timer)

最低0.47元/天 解锁文章
863

被折叠的 条评论
为什么被折叠?



