jiffies变量
Linux 内核使用全局变量 jiffies 来记录系统从启动以来的系统节拍数。频率是位于 include/asm-generic/param.h的USER_HZ一般是100HZ。
extern u64 __jiffy_data jiffies_64;
extern unsigned long volatile __jiffy_data jiffies;
jiffies_64用64位系统;jiffies用于32位系统。
将 jiffies 类型的参数 j 分别转换为对应的毫秒、 微秒、纳秒。
int jiffies_to_msecs(const unsigned long j)
u64 jiffies_to_nsecs(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)
unsigned long nsecs_to_jiffies(u64 n)
内核定时器
timer_list 结构体里expires 成员变量表示超时时间,单位为节拍数。比如我们现在需要定义一个周期为 2 秒的定时器,(频率)HZ=1000,那么这个定时器的超时时间就是 jiffies+(2*HZ),因此 expires=jiffies+(2*HZ)。function 就是 定时器超时回调函数。超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函 数中重新开启定时器。
struct timer_list {
struct list_head entry;
unsigned long expires; /* 定时器超时时间,单位是节拍数 */
struct tvec_base *base;
void (*function)(unsigned long); /* 定时处理函数 */
unsigned long data; /* 要传递给 function 函数的参数 */
int slack;
};
初始化定时器函数
void init_timer(struct timer_list *timer)
timer:要初始化定时器。 返回值:没有返回值。
add_timer 函数用于向 Linux 内核注册定时器,使用 add_timer 函数向内核注册定时器以后, 定时器就会开始运行。
void add_timer(struct timer_list *timer)
del_timer 函数用于删除一个定时器,不管定时器有没有被激活,都可以使用此函数删除。
int del_timer(struct timer_list * timer)
del_timer_sync 函数是 del_timer 函数的同步版,会等待其他处理器使用完定时器再删除, del_timer_sync 不能使用在中断上下文中。
int del_timer_sync(struct timer_list *timer)
mod_timer 函数用于修改定时值,如果定时器还没有激活的话,mod_timer 函数会激活定时 器!函数原型如下:
int mod_timer(struct timer_list *timer, unsigned long expires)
timer:要修改超时时间(定时值)的定时器。 expires:修改后的超时时间。 返回值:0,调用 mod_timer 函数前定时器未被激活;1,调用 mod_timer 函数前定时器已 被激活。
void ndelay(unsigned long nsecs)
void udelay(unsigned long usecs) //纳秒、微秒和毫秒延时函数。
void mdelay(unsigned long mseces)