【Linxux API】计时器add_event_timer & hrtimer

本文介绍了Linux系统中的hrtimer,一种基于红黑树实现的高精度计时器。内容涉及hrtimer如何依赖timekeeper和clock_event_device工作,以及在超时时的回调机制。文章详细解析了关键知识点如Linux时间子系统,并列举了`add_event_timer`等关键API的使用方法,包括结构体定义和函数作用。同时提供了一个LCD驱动的代码实例来展示hrtimer的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Hrtimer,一种高精度时间计时器,主要实现技术:红黑树;其实现依赖于timekeeper(时间维护者)和clock_event_device(定时器引擎);hrtimer系统需要通过timekeeper获取当前的时间,计算与到期时间的差值,并根据该差值,设定该cpu的tick_device(clock_event_device)的下一次的到期时间,时间一到,在clock_event_device的事件回调函数中处理到期的hrtimer。
关键知识:Linux时间子系统
参考文件

kernel/include/soc/qcom/event_timer.h
kernel/drivers/soc/qcom/event_timer.c
kernel/include/linux/hrtimer.h
kernel/include/linux/timerqueue.h

函数使用介绍

重要的结构体

struct **event_timer_info** {
    struct timerqueue_node node; //timerqueue节点,用来跟踪按照时间排序的事件定时器结构体
    void (*function)(void *); //时间定时器的回调函数,
    void *data;  //给回调函数提供的数据
};
**struct hrtimer** {
    struct timerqueue_node      node;  //
    ktime_t             _softexpires;
    enum hrtimer_restart        (*function)(struct hrtimer *);
    struct hrtimer_clock_base   *base;
unsigned long           state;};
static struct hrtimer event_hrtimer; //一种高精度定时器,

使用方法

1, struct event_timer_info add_event_timer(void (*function)(void ), void *data)
@function 事件定时器超时时执行的回调函数
@data 用户提供的回调函数的操作数据
函数作用:添加一个唤醒事件,只会被用户调用一次,返回一个用来处理交互的一个操作句柄

2, static bool is_event_next(struct event_timer_info *event)
@event:被检查的事件event
函数作用:辅助函数用以检查此事件是否是下一个即将到期的事件
3, void activate_event_timer(struct event_timer_info *event, ktime_t event_time)
@event:到期操作函数
@event_time:绝对时间
函数作用:设置的到期事件为绝对时间,一旦设置就一定会执行,用户需要再调用用来设置另一个事件的到期事件
4 void timerqueue_init(struct timerqueue_node *node)

代码案例

LCD驱动实例
代码路径

kernel/drivers/video/msm/mdss/mdss_mdp_overlay.c

//1,添加事件计时器   add_event_timer
int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd)
{
……..
mdp5_data->cpu_pm_hdl = add_event_timer(NULL, (void *)mdp5_data);  //添加事件计时器初始化
……..
}

//2,设置计时器触发时间相关 
static void mdss_mdp_overlay_update_pm(struct mdss_overlay_private *mdp5_data)
{
    ktime_t wakeup_time;
    if (!mdp5_data->cpu_pm_hdl)
        return;
    if (mdss_mdp_display_wakeup_time(mdp5_data->ctl, &wakeup_time))   //初始化时间
        return;
    activate_event_timer(mdp5_data->cpu_pm_hdl, wakeup_time);  //给计时器设置触发时间,绝对时间
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值