news 2026/9/30 2:32:05

Zephyr应用: 14-Timer

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Zephyr应用: 14-Timer

第 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

时序图:

"timer_handler 回调""Timer (my_timer)""主线程 (main)""timer_handler 回调""Timer (my_timer)""主线程 (main)"
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 2:31:35

全栈嵌入式开发:从MCU到云端的系统思维

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 2:31:29

【更新至2025年】2000-2025年上市公司管理层治理能力指标数据

【更新至2025年】2000-2025年上市公司管理层治理能力指标数据 1、时间:2000-2025年 2、来源:上市公司年报 3、指标:证券代码、证券简称、统计截止日期、行业代码、行业名称、行业代码1、行业名称1、产权性质、实际控制人拥有上市公司所有权…

作者头像 李华
网站建设 2026/9/30 2:30:58

基于大数据的青少年心理健康预警中与分析系统的设计与实现

毕业设计课题的任务和要求: 课题的任务:在学校规定的时间内,掌握并使用《基于大数据的青少年心理健康预警中与分析系统的设计与实现》项目所需的技能和知识,完成包括技术掌握、系统设计、实现、测试以及学术成果的撰写和展示。项目…

作者头像 李华
网站建设 2026/9/30 2:30:28

LKDS2.Linux内核的双向链表代码解析(2) 遍历算法

目录 1.list_for_each_entry系列 正向遍历: list_for_each_entry list_entry --> ★container_of★ container_of实验 内核中contain_of的常见应用 ★contain_of速记图 list_entry container_of list_first_entry和list_last_entry list_next_entry list_prev_en…

作者头像 李华
网站建设 2026/9/30 2:30:23

低功耗UPF介绍(一)

一、功耗简介 传统分类: 动态功耗(Dynamic Power):晶体管门电路翻转时产生的功耗 静态功耗(Static Power):晶体管不翻转时由非理想效应产生的功耗 业内计算分类: 泄漏功耗(Leakage Power):由沟道、栅极、衬底等非理想漏…

作者头像 李华