HRTIMER_RESTART,/* 重启定时器 */ }; 在回调函数返回前要手动设置下一次超时时间。 另外,回调函数执行时间不宜过长,因为是在中断上下文中,如果有什么任务的话,最好使用工作队列等机制。 6. 关闭定时器 int hrtimer_cancel(structhrtimer *timer); 简单用例: /* * Description : 高精度定时器用例 * Author :...
hrtimer高精度定时器的interval由ktime_set(const long secs, const unsigned long nsecs)决定,可做到ns级。此处的例子为5ms interval: #include <linux/kernel.h> #include <linux/module.h> #include <linux/hrtimer.h> #include <linux/ktime.h> MODULE_LICENSE("GPL"); staticstructhrtimer hr_timer; sta...
定时部分,系统有一个全局计数器counter,每个cpu核心有一个硬件定时器timer。定时器内部有比较器,当设定值达到全局计数器值就触发中断。每cpu定时器timer在软件上被抽象成时钟事件设备(Clock event device),在高精度版本,每个Clock event device创建一个本地高精度定时器hrtimer管理结构。hrtimer基于事件触发,通过红黑树来...
那么低精度的定时器最小定时时间为1ms;高精度定时器可以实现ns级的定时,不过,实际的定时周期粒度与CPU的主频有关,比如,桌面级的CPU一般都是GHZ级别,那么,其定时粒度可以达到ns级别,而对于嵌入式CPU,其主频一般在百兆级别,那么定时粒度就只能达到us级别了。
哪怕底层的定时事件设备精度再高,定时器层的分辨率只能达到Tick级别,按照内核配置选项的不同,在100Hz到1000Hz之间。但是,原有的定时器层由于实现教早,应用广泛,如果完全替换掉会引入大量代码改动。因此,Linux内核又独立设计出了一个叫高精度定时器层(High Resolution Timer)的框架,可以为我们提供纳秒级的定时精度,以...
低分辨率定时器是用jiffies来定时的,所以会受到HZ影响,如果HZ为200,代表每秒种产生200次中断,那一个jiffies就需要5毫秒,所以精度为5毫秒。 如果精度需要达到纳秒级别,则需要使用高精度定时器hrtimer。 使用示例 单次定时 加载驱动一秒后输出“ hrtimer handler ”: #
/* 将定时器的hrtimer_clock_base结构体变量设置为特殊的全局migration_base,表示正在迁移。 */ WRITE_ONCE(timer->base, &migration_base); /* 释放原来hrtimer_cpu_base结构体的自旋锁 */ raw_spin_unlock(&base->cpu_base->lock); /* 获得新hrtimer_cpu_base结构体的自旋锁 */ ...
高精度定时器使用步骤: 初始化定时器工作模式:hrtimer_init(&kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); 设置定时器的回调函数:kthread_timer.function = hrtimer_cb_func; 启动定时器:hrtimer_start(&kthread_timer, ktime_set(HRTIMER_TEST_CYCLE), HRTIMER_MODE_REL); ...
1. 高精度延时简介 GPT(General Purpose Timer),是一个32位向上定时器,GPT定时器也可以跟一个值进行对比,当计数器值和这个值相同时就发生比较事件,产生比较中断。GPT定时器特性如下: 一个可选时钟源(5个时钟源)的32位向上计数器 两个输入捕获通道,可以设置触发方式 ...