第7章:时间管理 - 系统时钟与定时器
Zephyr提供了k_cycle_get_32()函数来获取系统时钟的当前周期计数。
uint32_t current_cycles = k_cycle_get_32();
特性:
sys_clock_hw_cycles_per_sec()获取注意: 周期计数与硬件相关,不同平台可能有不同的时钟频率。
Zephyr提供了k_msleep()函数让当前线程进入睡眠状态。
// 让当前线程睡眠500毫秒 k_msleep(500);
特性:
警告: 不要在中断上下文中使用睡眠函数,会导致系统崩溃。
Zephyr的高精度定时器使用k_timer结构体表示:
struct k_timer {
// 定时器到期处理函数
void (*expiry_fn)(struct k_timer *timer);
// 定时器停止处理函数
void (*stop_fn)(struct k_timer *timer);
// 定时器周期(0表示单次定时器)
k_timeout_t period;
// 定时器状态标志
uint32_t status;
// 用户数据
void *user_data;
// 内部使用的链表节点
_wait_q_t wait_q;
};
完整的高精度定时器使用流程:
// 定义定时器
struct k_timer my_timer;
// 定时器回调函数
void timer_expiry_handler(struct k_timer *timer) {
printk("Timer expired!\n");
}
void timer_stop_handler(struct k_timer *timer) {
printk("Timer stopped!\n");
}
void init_timer(void) {
// 初始化定时器
k_timer_init(&my_timer, timer_expiry_handler, timer_stop_handler);
// 启动定时器,1秒后触发,之后每500ms触发一次
k_timer_start(&my_timer, K_SECONDS(1), K_MSEC(500));
// 停止定时器
// k_timer_stop(&my_timer);
}
初始化定时器结构体
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_sync(struct k_timer *timer);
客服小姐姐(优先添加)
讲师微信(备用)