低精度定时器和高精度定时器

本文详细介绍了Linux内核中的低精度和高精度定时器。低精度定时器基于jiffies,精度为1/HZ,通常为1ms。高精度定时器(hrtimer)提供更精确的定时,可以基于多种时间基准系统,并通过hrtimer_init、hrtimer_start等函数进行管理。文中包含初始化、注册、注销、测试程序及测试结果等内容。
摘要由CSDN通过智能技术生成

低精度定时器

所谓低精度定时器,是指这种定时器的计时单位基于jiffies值的计数,也就是说,它的精度只有1/HZ,假如你的内核配置的HZ是1000,那意味着系统中的低分辨率定时器的精度就是1ms。

函数接口

struct timer_list {
   
 
        struct list_head entry;
 
        unsigned long expires;
 
        void (*function)(unsigned long);
 
        unsigned long data;
 
       struct tvec_base *base;
 
       ......
 
};

其中expires字段表示期望定时器执行的jiffies值,到达jiffies值时,将调用function函数,并传递data作为参数(如果function函数需要不止一个参数时,那么可以将几个参数组成一个结构体,并将结构体的指针赋值给data)。
entry字段用来连接该定时器到一个内核链表中。base字段是内核内部实现所使用的字段(一般情况不用管这两个字段)。

初始化

定时器初始化时可使用如下方法(exp):

struct timer_list mytimer;
 
init_timer(&mytimer);    
 
mytimer.expires = jiffies + HZ;
 
mytimer.data = (unsigned long) dev;
 
mytimer.function = timer_test_func;

注册

使用add_timer(struct timer_list *timer),初始化的定时器会被连接到内核专门的链表中。
mod_timer(struct timer_list *timer, unsigned long expires)该函数会重新注册定时器到内核,而不管定时器函数是否被运行过。

注销

add_timer函数相反,del_timer类的函数负责从系统的定时器管理队列中摘除一个定时器对象。也可以使用del_timer_sync
del_timerdel_timer_sync的函数原型是:

 <kernel/timer.c> 
 int del_timer(struct timer_list *timer)int del_timer_sync(struct timer_list *timer)

两者的区别del_timer是当前处理器没有执行定时器时会将其注销,而是del_timer_sync是当所有处理器都没有执行定时器时会进行注销。

测试程序

#define CNT   32

static int g_get_time_index = 0;
static struct timer_list mytimer_test;
static struct timespec64 current_time[CNT];
static void timer_test_func(struct timer_list *t)
{
   
	if(g_get_time_index >= CNT){
   
         printk("timer test done!\n");
        return;
     }
     mytimer_test.expires = jiffies + HZ;    
     add_timer(&mytimer_test);
     
	getnstimeofday64(&current_time[g_get_time_index++]);

}
 
 static int  timer_test_init(void)
{
   
    mytimer_test.function = (void *
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值