hrtimer 介绍:
hrtime是Linux内核提供的高精度中断定时器,其精度达到了纳秒级别,精度和主频相关,通过回调复位和设置超时,使用起来也比较方便。
参考文章链接:
链接: https://blog.csdn.net/fuyuande/article/details/82193600.
MTK使用实例:
以下是MTK67656平台kernel-4.9实例,仅供参考。
注意:请勿在定时器使用过程中调用sleep(),会引起系统异常。
#include <linux/hrtimer.h>
#include <linux/jiffies.h>
static struct hrtimer timer;
ktime_t kt;
#define _MS_TO_NS(x) (x * 1000 * 1000)
......
//#################### 定时器循环处理 ####################//
static ktime_t auto_water_light_proc(void)
{
......
//返回设置下一次延时的时间
return ktime_set(0,_MS_TO_NS(100));
}
//#################### 定时器回调函数,定时器时间达到后进入这个函数 #####################//
static enum hrtimer_restart hrtimer_hander(struct hrtimer *t)
{
printk("[dc_pin] %s Callback ...\r\n",__func__ );
/* 设置下次过期时间 */
// kt = ktime_set(3,0);
//此处为自定义的循环函数,返回下一次循环的时间。
kt = auto_water_light_proc();
//设置循环时间
hrtimer_forward_now(t, kt);
/* 该参数将重新启动定时器 */
return HRTIMER_RESTART;
}
//#################### 定时器启动开关 ####################//
static void charger_water_light_start(int ON_OFF)
{
printk("[dc_pin] %s ON_OFF = %d \n",__func__,ON_OFF);
if(ON_OFF)
{
printk("[dc_pin] hrtimer_start... \r\n");
//首次延时100ms
kt = ktime_set(0,_MS_TO_NS(100));
/* hrtimer初始化 */
hrtimer_init(&timer,CLOCK_MONOTONIC,HRTIMER_MODE_ABS_PINNED );
/* 设置回调函数 */
timer.function = hrtimer_hander;
/* hrtimer启动 */
hrtimer_start(&timer,kt,HRTIMER_MODE_REL_PINNED );
}
else
{
//可以增加其它关闭的操作
/* hrtimer注销 */
hrtimer_cancel(&timer);
printk("bye hrtimer\r\n");
keep_wakeup_onoff(0);
}
}