第 14 课:Zephyr Timer(软件定时器)
本课摘要:本课系统讲解 Zephyr 软件定时器(k_timer)的核心用法,涵盖一次性与周期 Timer 的创建与启动、回调函数编写、Timer 停止与状态获取,并深入介绍 Timer 与 Semaphore、Work Queue 的协作模式,最后通过对比 k_sleep 阐明适用场景,配合多个可运行的 Demo 与实验帮助读者快速上手。
这一课你将学习Zephyr Kernel Timer(k_timer)的使用。Timer 是 RTOS 中最常见的内核对象之一,用于周期性执行任务、超时检测以及延时事件。
学习完成后,你将能够:
理解 Zephyr Timer 工作原理
创建一次性 Timer(One-shot Timer)
创建周期 Timer(Periodic Timer)
在 Timer 回调中执行代码
与 Thread、Semaphore 配合使用
一、什么是 Timer?
Timer 可以理解成:
“到时间后,自动通知你。”
例如:
启动 Timer │ ▼ 等待1000ms │ ▼ 执行callback()它并不会创建新的线程,而是在System Clock 中断中判断是否超时,然后执行回调。
因此:
Thread ├── 正常运行 ├── Timer到期 └──callback()被调用二、Zephyr Timer API
主要 API:
k_timer_init()k_timer_start()k_timer_stop()k_timer_status_get()k_timer_status_sync()Timer 类型:
struct k_timer三、创建 Timer
定义 Timer:
K_TIMER_DEFINE(my_timer, timer_handler, stop_handler);或者:
struct k_timer my_timer;然后:
k_timer_init(&my_timer, timer_handler, stop_handler);四、Timer Callback
回调函数:
voidtimer_handler(structk_timer*timer){printk("Timer expired!\\n");}停止时:
voidstop_handler(structk_timer*timer){printk("Timer stopped\\n");}stop handler 可以为空:
NULL五、启动 Timer
例如:
k_timer_start(&my_timer,K_SECONDS(2),K_NO_WAIT);表示:
等待2秒 ↓ 执行一次 callback ↓ 停止因为:
period=K_NO_WAIT时间线
0s ----------------2s---------------- callback()结束六、周期 Timer
例如:
k_timer_start(&my_timer, K_SECONDS(1), K_SECONDS(1));时间线:
0----1----2----3----4----5---- ↑ ↑ ↑ ↑ ↑ callback callback callback每隔一秒执行一次。
七、停止 Timer
k_timer_stop(&my_timer);Timer 停止后:
stop handler会执行。
八、第一个 Timer Demo
main.c
#include<zephyr/kernel.h>voidtimer_handler(structk_timer*timer){printk("Timer expired!\\n");}K_TIMER_DEFINE(my_timer,timer_handler,NULL);intmain(void){printk("Start Timer\\n");k_timer_start(&my_timer,K_SECONDS(2),K_NO_WAIT);while(1){printk("Main Thread\\n");k_sleep(K_SECONDS(1));}}运行结果:
Start Timer Main Thread Main Thread Timer expired!Main Thread Main Thread运行结果:
Start Timer Main Thread Main Thread Timer expired!Main Thread Main Thread时序图: