时钟中断由系统的定时硬件以周期性的时间间隔来产生,这个间隔由内核根据HZ来确定,HZ是一个与体系结构无关的常熟,可配置在(50-----200),x86上默认的1000(每秒产生1000次中断)。
当时钟中断时,全局变量jiffies就加1,jiffiies则计算出产生了多少次的中断。如:
unsigned long j = jiffies + jit_delay*HZ
while(jiffies < j)
{
do something;
}
这就是一个延迟的内核程序了。
定时器用于控制某个函数在某个特定的时间执行,内核定时器注册的处理函数,只能执行一次。
内核定时器被组织成双向的链表,用struct timer_list 结构来描述秒个定时器。struvt timer_list 结构体如下:
struct timer_list{
struct list_head entry /*内核使用*/
unsigned list_head expire /超时的jiffies 的值*/
void (*function)(unsigned log)/*超时的处理函数*/
unsigned long data/*超时处理函数的参数*/
struct tvec_base *base /*内核使用*/}
操作定时器的函数通常有以下几个:
void init_timer(struct timer_list *timer) 定时器的初始化
void add_timer(struct timer_list *timer) 启动定时器
void del_time(struct timer_list *timer) 在定时超时之前删除它。但定时器超时后,内核自动会删除它。
来看个例:
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/timer.h>/*timer*/
#include<asm/uaccess.h>/*expires*/
MODULE_LISENCE("GPL");
MODULE_AUTHOR("KK");
MODULE_DESCRIPTION("TIME MODULES");
MODULE_ALIAS("time modules");
struct timer_list timer;
void timer_function(int para)
{
prink("<0>timer is expires and the para is %d\n",para);
}
timer_init()
{
timer_init(&timer);
timer.data= 5;
time.expires = jiffies + (20*jiffies);
timer_function = timer_function;
add_timer(&timer);
return 0;
}
timer_exit()
{
del_timer(&timer);
}
module_init(timer_init);
module_exit(timer_exit);
加入内核进行编译,再传到开发板上,innsmod timer.ko 20秒后加入不rmmod timer.ko 的话则会有超时的提醒。
这就是一个最简单的一个timer定时的驱动程序了。