
第 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每隔一秒执行一次。七、停止 Timerk_timer_stop(my_timer);Timer 停止后:stop handler会执行。八、第一个 Timer Demomain.c#includelt;zephyr/kernel.hgt;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时序图:"timer_handler 回调""Timer (my_timer)""主线程 (main)""timer_handler 回调""Timer (my_timer)""主线程 (main)"