linux内核定时器

度量时间差

时钟中断由系统的定时硬件以周期性的时间间隔产生,这个间隔(频率)由内核根据HZ来确定,HZ是一个与体系结构无关的常数,可配置(50---1200),在x86平台,默认值为1000.(每秒钟产生1000次时钟中断)


每当时钟中断发生时,全局变量jiffies就加1,因此其记录了自linux启动后时钟中断发生的次数。驱动程序常利用jiffies来计算不同事件间的时间间隔。


如果对延迟的精度要求不高,最简单的实现方法如下----忙等待:

unsigned long j=jiffies + jit_delay*HZ
while(jiffies<j)

{

do nothing

}


内核定时器----

定时器用于控制某个函数(定时器处理函数)在未来的某个特定时间执行。在内核定时器注册的处理函数只执行一次-----不是循环执行的。


内核定时器被组织成双向链表,并使用struct timer_list结构来描述。

struct timer_list {
    struct list_head entry;内核使用,内核初始化
    unsigned long expires;超时的jiffies
    void (*function)(unsigned long);超时处理函数
    unsigned long data;超时处理函数参数
    struct tvec_base *base;内核使用,内核初始化
#ifdef CONFIG_TIMER_STATS
    void *start_site;
    char start_comm[16];
    int start_pid;
#endif
};

内核定时器操作----

void init_timer(struct timer_list *timer)

初始化定时器结构,这里会初始化两个成员,还需手动给其它三个成员初始化。

void add_timer(struct timer_list *timer)

启动定时器

int del_timer(struct timer_list *timer)

在定时器超时前将他删除。当定时器超时后,系统自动的将它删除。



你可能感兴趣的:(timer,struct,list,function,delay,linux内核)