Linux内核hrtimer高精度定时器介绍及使用

1.hrtimer结构体介绍

timer子系统因为精度局限在毫秒级别(时钟频率可设置在100HZ到1000HZ之间),无法满足对时间要求高精度的场景(比如看门狗、usb、ethernet、块设备、kvm等子系统)。因此linux社区设计了hrtimer(High Resolution Timer,高精度定时器)子系统,提供纳秒级别的时钟精度。

2.定义高精度定时器

路径:kernel5.4/include/linux/hrtimer.h

struct hrtimer {
	struct timerqueue_node		node;
	ktime_t				_softexpires;
	enum hrtimer_restart		(*function)(struct hrtimer *);	//定时器处理函数
	struct hrtimer_clock_base	*base;
	u8				state;
	u8				is_rel;
	u8				is_soft;
	u8				is_hard;

	ANDROID_KABI_RESERVE(1);
};

struct hrtimer timer;

3.初始化高精度定时器

 void hrtimer_init(struct hrtimer *timer, clockid_t clock_id, enum hrtimer_mode mode)
 参数:
	@timer 高精度定时器结构体
	@clock_id 时钟源
		#define CLOCK_REALTIME			    0	/* 从1970.1.1到当前的时间,常说的wall time(墙上时钟) */
		#define CLOCK_MONOTONIC			    1   /* 从系统启动这一刻起开始计时,不受系统时间被用户改变的影响 */
		#define CLOCK_PROCESS_CPUTIME_ID	2   /* 本进程到当前代码系统CPU花费的时间 */
		#define CLOCK_THREAD_CPUTIME_ID		3   /* 本线程到当前代码系统CPU花费的时间 */
		#define CLOCK_MONOTONIC_RAW		    4   /* 和CLOCK_MONOTONIC类似,但不同之处是MONOTONIC_RAW不会受到NTP的影响。*/
		#define CLOCK_REALTIME_COARSE		5   /* 系统实时时间,从Epoch计时,可被设置更改,速度更快精度更低*/
		#define CLOCK_MONOTONIC_COARSE		6   /* 系统运行时间,从系统启动时开始计时,速度更快精度更低,系统休眠时不再计时
												(NTP与硬件时钟有问题时会影响其频率,没有验证过)。*/
		#define CLOCK_BOOTTIME			    7	/* 与CLOCK_MONOTONIC类似*/
		#define CLOCK_REALTIME_ALARM		8   /* 闹钟时间(应该休眠后继续计时,没验证过),系统实时时间,从Epoch计时,可被设置更改。*/
		#define CLOCK_BOOTTIME_ALARM		9   /* 闹钟时间(应该休眠后继续计时,没验证过),系统运行时间,从系统启动时开始计时。*/
	@mode
		enum hrtimer_mode {
			HRTIMER_MODE_ABS	= 0x00,		/* 绝对时间 */
			HRTIMER_MODE_REL	= 0x01,		/* 相对时间 */
			HRTIMER_MODE_PINNED	= 0x02,		/* 计时器绑定到CPU,仅在启动定时器时考虑 */
			HRTIMER_MODE_SOFT	= 0x04,		/* 计时器回调将会在软中断上下文中执行 */
			HRTIMER_MODE_HARD	= 0x08,     /* 定时器是“硬”的,即该定时器的回调函数在硬中断上下文执行即使是PREEMPT_RT打开的情况 */
			HRTIMER_MODE_ABS_PINNED = HRTIMER_MODE_ABS | HRTIMER_MODE_PINNED,
			HRTIMER_MODE_REL_PINNED = HRTIMER_MODE_REL | HRTIMER_MODE_PINNED,
			HRTIMER_MODE_ABS_SOFT	= HRTIMER_MODE_ABS | HRTIMER_MODE_SOFT,
			HRTIMER_MODE_REL_SOFT	= HRTIMER_MODE_REL | HRTIMER_MODE_SOFT,
			HRTIMER_MODE_ABS_PINNED_SOFT = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_SOFT,
			HRTIMER_MODE_REL_PINNED_SOFT = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_SOFT,
			HRTIMER_MODE_ABS_HARD	= HRTIMER_MODE_ABS | HRTIMER_MODE_HARD,
			HRTIMER_MODE_REL_HARD	= HRTIMER_MODE_REL | HRTIMER_MODE_HARD,

			HRTIMER_MODE_ABS_PINNED_HARD = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_HARD,
			HRTIMER_MODE_REL_PINNED_HARD = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_HARD,
		};

4.高精度定时器处理函数

hrtimer_restart枚举:
enum hrtimer_restart {
	HRTIMER_NORESTART,	/* 不重启定时器 */
	HRTIMER_RESTART,	/* 重启定时器 */
};

static enum hrtimer_restart ltr569_timer_handler(struct hrtimer *timer)
{
	/**
	 * 定时器处理函数处理逻辑。
	 */

	hrtimer_forward_now(timer, period);	//设置下次定时时间
	return HRTIMER_RESTART;				
}

5.高精度定时器相关操作函数

/* 启动定时器 */
static inline void hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode);
/* 取消定时器 */
static int hrtimer_cancel(struct hrtimer *timer);
/* 判断定时器是否过期 */
bool hrtimer_active(const struct hrtimer *timer);

你可能感兴趣的:(传感器,linux,c语言,驱动开发)