clock hrtimer 在 clock_time 之上提供高精度超时调度。它维护按到期时间排序的 队列,编程下一次事件,并在到期时执行回调。
void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer,
const char *name,
rt_uint8_t flag,
void (*timeout)(void *parameter),
void *parameter);
rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long cnt);
rt_err_t rt_clock_hrtimer_stop(rt_clock_hrtimer_t timer);
rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg);
rt_err_t rt_clock_hrtimer_detach(rt_clock_hrtimer_t timer);
void rt_clock_hrtimer_delay_init(struct rt_clock_hrtimer *timer);
void rt_clock_hrtimer_delay_detach(struct rt_clock_hrtimer *timer);
rt_err_t rt_clock_hrtimer_sleep(struct rt_clock_hrtimer *timer, unsigned long cnt);
rt_err_t rt_clock_hrtimer_ndelay(struct rt_clock_hrtimer *timer, unsigned long ns);
rt_err_t rt_clock_hrtimer_udelay(struct rt_clock_hrtimer *timer, unsigned long us);
rt_err_t rt_clock_hrtimer_mdelay(struct rt_clock_hrtimer *timer, unsigned long ms);
flag 复用 RT_TIMERFLAG* 定义(单次/周期/硬定时器)。cnt 为默认时钟源计数 单位。
void rt_clock_hrtimer_init(rt_clock_hrtimer_t timer,
const char *name,
rt_uint8_t flag,
void (*timeout)(void *parameter),
void *parameter);
timer:待初始化的 hrtimer 对象。name:定时器名称(超过 RT_NAME_MAX-1 会截断)。flag:RT_TIMERFLAG* 标志(单次/周期/硬定时器)。timeout:超时回调函数。parameter:回调参数。rt_clock_hrtimer_start()。rt_err_t rt_clock_hrtimer_start(rt_clock_hrtimer_t timer, unsigned long cnt);
cnt 个计数后到期。cnt:相对延时,单位为默认时钟源计数。cnt 非法。cnt 需小于计数器最大值的一半,以避免回绕歧义。rt_err_t rt_clock_hrtimer_stop(rt_clock_hrtimer_t timer);
rt_err_t rt_clock_hrtimer_control(rt_clock_hrtimer_t timer, int cmd, void *arg);
delay_cnt 到 *(unsigned long *)arg。*(unsigned long *)arg 设置 delay_cnt。rt_err_t rt_clock_hrtimer_detach(rt_clock_hrtimer_t timer);
rt_clock_hrtimer_sleep() 的等待线程并返回错误。void rt_clock_hrtimer_delay_init(struct rt_clock_hrtimer *timer);
void rt_clock_hrtimer_delay_detach(struct rt_clock_hrtimer *timer);
rt_err_t rt_clock_hrtimer_sleep(struct rt_clock_hrtimer *timer, unsigned long cnt);
timer 需已初始化(通常通过 delay_init)。cnt 为 0。rt_err_t rt_clock_hrtimer_ndelay(struct rt_clock_hrtimer *timer, unsigned long ns);
rt_err_t rt_clock_hrtimer_udelay(struct rt_clock_hrtimer *timer, unsigned long us);
rt_err_t rt_clock_hrtimer_mdelay(struct rt_clock_hrtimer *timer, unsigned long ms);
rt_clock_hrtimer_sleep()。#include <drivers/clock_time.h>
static struct rt_clock_hrtimer demo_timer;
static void demo_timeout(void *parameter)
{
RT_UNUSED(parameter);
rt_kprintf("hrtimer timeout\n");
}
static void demo_hrtimer_start(void)
{
rt_uint64_t ns = 5ULL * 1000 * 1000; /* 5 ms */
unsigned long cnt = (unsigned long)rt_clock_time_ns_to_counter(ns);
rt_clock_hrtimer_init(&demo_timer, "demo", RT_TIMER_FLAG_ONE_SHOT,
demo_timeout, RT_NULL);
rt_clock_hrtimer_start(&demo_timer, cnt);
}
static void demo_hrtimer_sleep(void)
{
struct rt_clock_hrtimer timer;
rt_clock_hrtimer_delay_init(&timer);
rt_clock_hrtimer_mdelay(&timer, 10);
rt_clock_hrtimer_delay_detach(&timer);
}