linux高精度时钟

1 添加内核组件
  HIGH_RES_TIMERS

2 初始化:
hrtimer_init(&( hrt_timer), CLOCK_MONOTONIC, HRTIMER_MODE_REL);
说明 参数 1 struct hrtimer hrt_timer;
       参数 2 时钟选择可以设置为 CLOCK_REALTIME、CLOCK_MONOTONIC、CLOCK_BOOTTIME
    CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户改成其他,则对应的时间相应改变
    CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响。不包括系统休眠的时间
    CLOCK_BOOTTIME:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响。包括系统休眠的时间
       参数3 时钟模式:可以设置为HRTIMER_MODE_REL、HRTIMER_MODE_ABS
    HRTIMER_MODE_REL:相对时间
    HRTIMER_MODE_ABS:绝对时间

3 注册回调函数:
   hrt_timer.function = hrt_timer_func;
   launch_hrt_timer_func; 为回调函数
   实例如下:
enum hrtimer_restart hrt_timer_func(struct hrtimer *timer)
{
    ktime_t kt = ktime_set(0, 1000*100); //100微秒后超时
    hrtimer_forward(timer, timer->base->get_time(), kt);
    return HRTIMER_RESTART;
}
回调的返回值为HRTIMER_RESTART或者HRTIMER_NORESTART
顾名思义,一个是重启定时器,一个是不重启定时器
如果要重启定时器,一定要调用hrtimer_forward重置超时时间
ktime_set的第一个参数为秒 第二参数为纳秒
注意:回调函数中不能调用msleep之类的会挂起CPU的函数,否则系统会挂掉。

4 启动定时器
   hrtimer_start(&(hrt_timer), ktime_set(10, 0), HRTIMER_MODE_REL);//10秒超时
也可以使用hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,unsigned long range_ns, const enum hrtimer_mode mode);
这个函数和hrtimer_start相同,只是多了一个范围range_ns,。

5 注销定时器
   hrtimer_cancel(&(hrt_timer));
通过上面的函数,定时器就可以正常工作了。

其他函数说明:
static inline int hrtimer_active(const struct hrtimer *timer)
{
    return timer->state != HRTIMER_STATE_INACTIVE;
}

static inline int hrtimer_is_queued(struct hrtimer *timer)
{
    return timer->state & HRTIMER_STATE_ENQUEUED;
}

static inline int hrtimer_callback_running(struct hrtimer *timer)
{
    return timer->state & HRTIMER_STATE_CALLBACK;
}

其他说明:
高精度中断函数:
kernel/hrtimer.c
void hrtimer_interrupt(struct clock_event_device *dev)

此函数调用tick_program_event,调用clockevents_program_event 设置下次中断
时间的范围在dev->max_delta_ns, dev->min_delta_ns。

初始化时钟调用clockevents_config_and_register或者clockevents_register_device
通常在drivers/clocksource目录下XXX_timer.c下
或者arch/cpu_type/mach-xxx/time.c下
会设置dev->max_delta_ns, dev->min_delta_ns。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值