hrtimer
在Linux内核中,timer_list和hrtimer都是用于实现定时器功能的机制,但它们有一些区别和不同的特点:
timer_list:
- timer_list是Linux内核提供的传统定时器机制,精度一般为毫秒级别。
- timer_list使用struct timer_list结构表示一个定时器,通过init_timer、add_timer和del_timer等函数来初始化、启动和停止定时器。
- timer_list适用于一般的定时任务,例如延迟执行某个函数或处理定时事件。
hrtimer (High Resolution Timer):
- hrtimer是Linux内核提供的高精度定时器机制,可以实现纳秒级别的定时精度。
- hrtimer基于struct hrtimer结构表示一个高精度定时器,通过hrtimer_init、hrtimer_start和hrtimer_cancel等函数来操作定时器。
- hrtimer适用于对定时精度要求较高的场景,例如实时系统、调度器实现等。
关于二者的关系:
- hrtimer实际上是在timer_list的基础上进行了扩展和优化,提供了更高的定时精度和更灵活的定时器管理方式。
- 在Linux内核中,hrtimer是建立在timer_list之上的,因此你可以将hrtimer视为对timer_list的增强和改进版本。
- 通常情况下,如果你需要高精度的定时器或者对定时器精度要求比较高,可以选择使用hrtimer;而对于一般的定时任务,timer_list也是一个可靠的选择。
hrtimer的使用demo:
#include <linux/module.h> #include <linux/kernel.h> #include <linux/hrtimer.h> static struct hrtimer hr_timer; static ktime_t interval; enum hrtimer_restart my_hrtimer_callback(struct hrtimer *timer) { printk("HR Timer callback function is called!\n"); // 重新设置定时器触发时间为间隔时间之后 hrtimer_forward_now(timer, interval); // 向前移动1s return HRTIMER_RESTART; } static int __init hrtimer_demo_init(void) { printk("Initializing hrtimer demo\n"); // 初始化高精度定时器 hrtimer_init(&hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); // 设置定时器间隔为1秒 interval = ktime_set(1, 0); // 设置定时器回调函数 hr_timer.function = my_hrtimer_callback; // 启动定时器 hrtimer_start(&hr_timer, interval, HRTIMER_MODE_REL); return 0; } static void __exit hrtimer_demo_exit(void) { // 取消定时器 hrtimer_cancel(&hr_timer); printk("Exiting hrtimer demo\n"); } module_init(hrtimer_demo_init); module_exit(hrtimer_demo_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("lethe1203"); MODULE_DESCRIPTION("hrtimer demo");
hrtimer_forward_now是Linux内核中用于在当前时间基础上将定时器向前移动一定时间间隔的函数。具体而言,它的作用是更新定时器的触发时间,使定时器在当前时间基础上向前推进指定的时间间隔。
函数原型如下:
nt hrtimer_forward_now(struct hrtimer *timer, ktime_t interval); // 参数说明 timer:指向要操作的高精度定时器的指针。 interval:表示要向前移动的时间间隔,以ktime_t类型表示。可以使用ktime_set等函数创建合适的时间间隔值。
ktime_set是一个在Linux内核中用于创建ktime_t类型时间值的函数。它接受两个参数,分别表示秒和纳秒,然后将它们组合成一个ktime_t类型的时间值。
具体来说,ktime_set函数的原型如下:
ktime_t ktime_set(const s64 secs, const unsigned long nsecs); // 参数说明 secs:表示秒数,采用64位有符号整数(s64)表示。 nsecs:表示纳秒数,采用无符号长整型(unsigned long)表示。