Linux驱动中断与时间篇——高精度定时器hrtimer

在这里插入图片描述

前言


低分辨率定时器是用jiffies来定时的,所以会受到HZ影响,如果HZ200,代表每秒种产生200次中断,那一个jiffies就需要5毫秒,所以精度为5毫秒。

如果精度需要达到纳秒级别,则需要使用高精度定时器hrtimer

相关接口


高分辨率定时器(hrtimer)以ktime_t来定义时间,精度可以达到纳秒级别ktime_t定义如下:

typedef s64	ktime_t;

可以用ktime_set来初始化一个ktime对象,常用方法如下:

ktime_t t = ktime_set(secs, nsecs);

高分辨率hrtimer结构体定义如下:

struct hrtimer {  
    struct timerqueue_node      node;  
    ktime_t             _softexpires;  
    enum hrtimer_restart        (*function)(struct hrtimer *);  
    struct hrtimer_clock_base   *base;  
    unsigned long           state;  
        ......  
};  
enum hrtimer_restart {  
    HRTIMER_NORESTART,  /* Timer is not restarted */  
    HRTIMER_RESTART,    /* Timer must be restarted */  
};  

struct hrtimer结构体中最主要的成员就是回调函数function,回调函数的返回值可以为HRTIMER_NORESTARTHRTIMER_RESTARTHRTIMER_NORESTART代表不需要重启定时器,HRTIMER_RESTART代表需要重启定时器。

最常用的接口如下:

hrtimer_init(struct hrtimer *timer, clockid_t clock_id , enum hrtimer_mode mode)
hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode)
hrtimer_forward_now(struct hrtimer *timer,ktime_t interval)
hrtimer_cancel(struct hrtimer *timer)

hrtimer_init: 初始化 struct hrtimer 结构对象。 clockid_t 是时钟的类型, 种类很多,常见的有四种:

  • CLOCK_REALTIME:系统实时时间。
  • CLOCK_MONOTONIC:从系统启动时开始计时,自系统开机以来的单调递增时间
  • CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间,包含该进程下的所有线程。
  • CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间。

mode 是时间的模式,可以是 HRTIMER_MODE_ABS, 表示绝对时间, 也可以是 HRTIMER_MODE_REL,
示相对时间。
hrtimer_start: 启动定时器。 tim 是设定的到期时间, modehrtimer_init中的 mode
参数含义相同。
hrtimer_forward_now: 修改到期时间为从现在开始之后的 interval 时间。
hrtimer_cancel: 取消定时器。

使用示例


单次定时

加载驱动一秒后输出“hrtimer handler”:

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

#include <linux/ktime.h>
#include <linux/hrtimer.h>

static struct hrtimer timer;

static enum hrtimer_restart timer_handler(struct hrtimer *timer )
{
	printk("hrtimer handler\n");
    
    return HRTIMER_NORESTART;
}

static int __init my_init(void) 
{
    ktime_t tim;
    
	hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
    timer.function = timer_handler;
    tim = ktime_set(1,0); //1s
    hrtimer_start(&timer,tim,HRTIMER_MODE_REL);

    return 0;
}

static void __exit my_exit(void)
{
	printk("%s enter\n", __func__);
	hrtimer_cancel(&timer);
}

module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");

循环定时

循环定时可以在回调函数中调用hrtimer_forward_now()重新设置定时时间,然后将返回值设置为HRTIMER_RESTART代表重启定时器,就可以做到循环定时的效果。

每隔一秒输出“hrtimer handler”:

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

#include <linux/ktime.h>
#include <linux/hrtimer.h>

static struct hrtimer timer;

static enum hrtimer_restart timer_handler(struct hrtimer *timer )
{
	printk("hrtimer handler\n");
    
    hrtimer_forward_now(timer, ktime_set(1,0));//重新设置定时时间
    
    return HRTIMER_RESTART;//重启定时器
}

static int __init my_init(void) 
{
    ktime_t tim;
    
	hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
    timer.function = timer_handler;
    tim = ktime_set(1,0); //1 s
    hrtimer_start(&timer,tim,HRTIMER_MODE_REL);

    return 0;
}

static void __exit my_exit(void)
{
	printk("%s enter\n", __func__);
	hrtimer_cancel(&timer);
}

module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Linux高精度定时器是一种可以提供微秒级别精度的定时器,它可以用于实现高精度时间相关应用,比如实时系统、嵌入式系统等。它的实现基于内核的定时器机制,通过使用更高精度的时钟源和更细致的时间管理策略,可以达到更高的精度和更低的延迟。在Linux内核中,高精度定时器是通过hrtimer结构体来实现的,它可以支持周期性和单次定时器,并且可以在内核中使用。 ### 回答2: Linux高精度定时器是一种基于内核的功能,它允许用户程序创建和管理高精度定时器,以进行事件管理和实现任务调度。Linux高精度定时器的最小精度为1纳秒,比普通定时器的最小精度要高出很多,使得它可以满足更高性能和更准确的定时器需求。 Linux高精度定时器使用的是一个双向链表数据结构来存储所有的定时器,并通过定时器管理者(timer wheel)进行管理。当一个定时器被创建时,它将被插入到定时器管理者中,并根据设定的时间进行排序。当时间到达时,定时器将被触发并执行相应的操作。 除了基本的定时器功能外,Linux高精度定时器还提供了周期性定时器、相对定时器和绝对定时器等不同类型的定时器。其中,周期性定时器可以周期性地触发,这在一些精确计时的应用中非常有用;而相对定时器和绝对定时器则依据不同的时间基准来完成定时器的设定和触发。 Linux高精度定时器具有极高的稳定性和可靠性,可以大规模应用于高并发和高性能的服务器、网络设备等场合。但同时也需要注意,使用高精度定时器需要对系统的硬件环境和内核参数进行相关优化,以保证其正确运行和稳定性。 ### 回答3: Linux高精度定时器(High Resolution Timer, HRT)是Linux内核提供的一种高精度的计时机制,可以在微秒及以下的时间精度上进行计时。它在Linux内核2.6版本中被引入,并在之后的版本中得到了不断的改进和完善。高精度定时器通过提供更精确的计时功能,满足了一些对计时要求较高的应用场景,比如实时系统、多媒体应用、网络通信等。 高精度定时器是基于内核时钟源(jiffies)实现的,它拥有有自己的独立的时钟源,能够在微秒级别上进行定时。相比起以往的定时器机制,高精度定时器的最大优势在于对系统频率的要求更低。传统的内核计时器使用中断计数器来进行计时,中断计数器的频率通常为1KHz,精度只能到毫秒级别。而高精度定时器利用了多核心处理器、硬件高精度计时器、或者对时钟源进行更细微的切换,可以实现更高的计时精度。 在Linux内核中,高精度定时器主要由三个核心模块构成:时钟事件源、定时器管理器和高精度定时器API。时钟事件源是高精度定时器的核心组成部分,由系统硬件或内核软件提供,其负责产生定时器事件。定时器管理器用于管理和维护各个定时器的创建、删除、重置和超时等操作。高精度定时器API提供了一系列API函数,用于操作和管理高精度定时器。 使用高精度定时器,需要使用定时器结构体来描述定时器定时器结构体包含了定时器的名称、定时器回调函数、定时器超时时间定时器要素等信息。在使用高精度定时器时,通过定时器结构体向定时器管理器发送添加定时器的请求,并关联相关的回调函数。在定时器的超时时间结束后,定时器管理器会自动触发回调函数。开发者可以在回调函数中实现自己的功能需求。 总的来说,高精度定时器提高了计时的精度,满足了一些对计时精度有要求的应用场景,同时也带来了一些挑战和成本,在Linux内核开发和应用中需要有一定的技术积累和经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Linux充电站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值