小工具知识网

当前位置: 首页 > 行业知识 > zephyr学习

行业知识

zephyr学习

2026-11-03 00:47:31 来源:互联网转载

zephyr内核对象学习

定时器

���似linux的定时器,

可以分别设置第一次到期时间和后续的周期触发时间,

可以注册到期回调和停止回调

还有一个计数状态,用于标记timer到期了多少次

duration:设定timer第一次到期的时间。

period: timer第一次到期后的触发时间间隔。

expiry:触发回调。

定时器的使用:

  1. 初始化定时器
void k_timer_init(struct k_timer *timer, k_timer_expiry_t expiry_fn, k_timer_stop_t stop_fn);
  1. 启动定时器
void k_timer_start(struct k_timer *timer, k_timeout_t duration, k_timeout_t period);
  1. 停止定时器
void k_timer_stop(struct k_timer *timer);
  1. 读取定时器状态
uint32_t k_timer_status_get(struct k_timer *timer);

读取定时器的状态,该状态表示自上次读取其状态以来定时器已到期的次数,每次读取后会重置状态为0。

  1. 等待定时器到期
uint32_t k_timer_status_sync(struct k_timer *timer);

调用这个函数会阻塞线程,直到定时器到期或者停止,调用这个函数会将定时器状态清零,另外不允许在中断处理函数中调用该函数,函数返回定时器的状态值。

  1. 获取定时器超时到期时的系统时间
k_ticks_t k_timer_expires_ticks(const struct k_timer *timer);

该函数返回定时器下一次到期时候的系统时间,以系统ticks为单位。如果定时器未运行,则返回当前系统时间。

  1. 获取定时器超时到期的剩余时间
k_ticks_t k_timer_remaining_ticks(const struct k_timer *timer)

计算运行的定时器下次过期前剩余的时间,如果定时器未运行,则返回0。

  1. 获取定时器超时到期前的剩余时间
uint32_t k_timer_remaining_get(struct k_timer *timer);

计算运行定时器下次到期前剩余的(近似)时间,以毫秒(ms)为单位。如果定时器未运行,则返回0。

另外还有一种定义和初始化定时器的方式:

静态定义并初始化定时器

#define K_TIMER_DEFINE(name, expiry_fn, stop_fn)
注意

因为timer的回调是在中断中执行,所以在回调函数中不能做耗时操作。

timer不能保证精确的定时,但其精度比k_sleep/k_usleep高,测量执行时间时不建议使用k_timer,建议读系统硬件时钟。

当timer触发回调后需要处理耗时操作时,可配合k_work使用,将耗时操作放在workqueue中执行

/* k_work回调函数,用于处理耗时操作 */void work_handler(struct k_work *work){    while(int i=0, i        printk("do something \n");    }}/* 定义初始化一个k_work */K_WORK_DEFINE(a_work, work_handler);/* timer到期回调函数 */static void timer_handler_expiry(struct k_timer *dummy){    counter++;    printk("counter %d \n", counter);    /*发送k_work信号量*/    k_work_submit(&a_work);} __VA_ARGS__ };\const STRUCT_SECTION_ITERABLE(bt_gatt_service_static, _name) =\BT_GATT_SERVICE(attr_##_name)/** Attribute UUID */const struct bt_uuid *uuid;bt_gatt_attr_read_func_t read;/** Attribute write callback */bt_gatt_attr_write_func_t write;/** Attribute user data */void *user_data;/** Attribute handle */uint16_t handle;/** @brief Attribute permissions. * * Will be 0 if returned from ``bt_gatt_discover()``. */uint16_t perm;};

上一篇:服务器离线怎么下载软件?

下一篇:地铁逃生怎么强制改服务器?