度量时间差
时钟中断由系统的定时硬件以周期性的时间间隔产生,这个间隔(频率)由内核根据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)
在定时器超时前将他删除。当定时器超时后,系统自动的将它删除。