一、Linux时间管理与内核定时器
1、常用定时中断来计时,中断周期性产生频率常称为系统频率(节拍率),在编译内核时可以通过图形化界面来设置系统节拍率。在内核路径下输入 make menuconfig ,-> Kernel Features ->Timer Frequency(<choice>[=y]),设置好了以后可以在linux内核源码根目录下的.config文件下看到系统节拍率的设置语句。
2、高节拍率会提高系统时间精度,但是高节拍率会导致中断频繁产生,频繁中断会加剧系统的负担,但是现在处理器性能已经很强了。
3、Linux内核使用全局变量jiffies(64位)来记录系统从启动以来的系统节拍数,系统启动后会把jiffies初始化为0。
4、每秒的节拍数用HZ表示,jiffies表示系统运行的节拍数,jiffies/HZ = 系统运行时间(秒),超时 = jiffies > jiffies+(2*HZ)。
5、Linux内核定时器采用系统时钟来实现,提供超时时间(定时值)与定时处理函数就行,超时以后就会跳转到定时处理函数去执行,但需要注意的是超时后需要在处理函数中重新打开定时器。
6、Linux内核采用结构体timer_list结构体表示内核定时器:
struct timer_list {
struct list_head entry;
unsigned long expires; /* 定时器超时时间,单位是节拍数 */
struct tvec_base *base;
void (*function)(unsigned long); /* 定时处理函数 */
unsigned long data; /* 要传递给 function 函数的参数 */
int slack;
};
7、 内核定时器API函数:
1)init_timer函数:负责初始化timer_list变量。
void init_timer(struct timer_list *timer)
2)add_timer函数:用于向Linux内核注册定时器,使用该函数后定时器就会开始运行。
void add_timer(struct timer_list *timer)
3)del_timer函数:不管定时器激活否,都删除一个指定的定时器,但是要注意在多处理器系统,一个定时器可能会在其他处理器上运行,删除的时候需要等待其他处理器运行结束。返回值: 0 定时器未激活 1 定时器已激活
int del_timer(struct timer_list * timer)
4) del_timer_sync函数:同步版的del_timer,会等待其他处理器用完定时器再删除定时器,但是该函数不能用在中断上下文中。返回值 :0 定时器未激活 1 定时器已激活
int del_timer_sync(struct timer_list *timer)
5)mod_timer函数:用于修改定时值,如果定时器未激活也会被激活。 参数:timer 要修改的定时器 expires 修改后超时时间 返回值: 0 调用函数的时候定时器未激活 1 调用函数的时候定时器已经激活。
int mod_timer(struct timer_list *timer, unsigned long expires)
8、Linux内核定时器使用流程
/*定义定时器*/
struct timer_list timer;
/*书写定时器回调函数*/
void function(unsigned long arg)
{
/*
* 定时器处理函数
*/
/*需要周期性定时器使用函数mod_timer*/
mod_timer(&dev->timertest, jissies + msecs_to_jiffies(定时值(2000 = 2秒)));
}
/*初始化函数*/
void init(void)
{
/*初始化定时器*/
init_timer(&timer);
timer.function = function; /* 设置定时处理函数 */
timer.expires=jffies + msecs_to_jiffies(2000);/* 超时时间 2 秒 */
timer.data = (unsigned long)&dev; /* 将设备结构体作为参数 */
add_timer(&timer); /* 启动定时器 */
}
/* 出口函数 */
void exit(void)
{
del_timer(&timer); /* 删除定时器 */
}
9、Linux内核短延时函数
内核提供了豪秒、微秒、纳秒三种函数
1) void ndelay(unsigned long nsecs)
2) void udelay(unsigned long usecs)
3) void mdelay(unsigned long msecs)