行业知识
zephyr学习
2026-11-03 00:47:31
来源:互联网转载
zephyr内核对象学习
定时器
���似linux的定时器,
可以分别设置第一次到期时间和后续的周期触发时间,
可以注册到期回调和停止回调
还有一个计数状态,用于标记timer到期了多少次
duration:设定timer第一次到期的时间。
period: timer第一次到期后的触发时间间隔。
expiry:触发回调。
定时器的使用:
- 初始化定时器
void k_timer_init(struct k_timer *timer, k_timer_expiry_t expiry_fn, k_timer_stop_t stop_fn);
- 启动定时器
void k_timer_start(struct k_timer *timer, k_timeout_t duration, k_timeout_t period);
- 停止定时器
void k_timer_stop(struct k_timer *timer);
- 读取定时器状态
uint32_t k_timer_status_get(struct k_timer *timer);
读取定时器的状态,该状态表示自上次读取其状态以来定时器已到期的次数,每次读取后会重置状态为0。
- 等待定时器到期
uint32_t k_timer_status_sync(struct k_timer *timer);
调用这个函数会阻塞线程,直到定时器到期或者停止,调用这个函数会将定时器状态清零,另外不允许在中断处理函数中调用该函数,函数返回定时器的状态值。
- 获取定时器超时到期时的系统时间
k_ticks_t k_timer_expires_ticks(const struct k_timer *timer);
该函数返回定时器下一次到期时候的系统时间,以系统ticks为单位。如果定时器未运行,则返回当前系统时间。
- 获取定时器超时到期的剩余时间
k_ticks_t k_timer_remaining_ticks(const struct k_timer *timer)
计算运行的定时器下次过期前剩余的时间,如果定时器未运行,则返回0。
- 获取定时器超时到期前的剩余时间
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;};
上一篇:服务器离线怎么下载软件?
下一篇:地铁逃生怎么强制改服务器?