news 2026/2/7 6:07:23

从零玩转RT-Thread(21):创建简单的定时器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零玩转RT-Thread(21):创建简单的定时器

本小节介绍RT-Thread中定时器相关API的使用。

注意,与API使用相关的部分细节,会在后面的课时中说明。

定时器的基本结构

RT-Thread使用软件方法来创建软定时器,从而提供不受硬件定时器数量限制的定时器。每个软定时器使用定时器控制块rt_timer_t来进行管理。

在定时控制块中,存储定时器的一些信息,例如初始节拍数,超时时的节拍数,也包含定时器与定时器之间连接用的链表结构,超时回调函数等。

在这些信息中,核心的信息有:

  • 定时时长:多少个 tick 之后触发
  • 是否周期:一次性或者周期性执行
  • 回调函数:定时触发时调用的函数
  • 运行上下文:在什么环境(定时中断、软定时器任务)中执行

示例一:创建周期性和一次性定时器

下面的例子中演示了使用相关的接口创建了两种类型的定时器:

  • 周期性定时器led_timer:每隔500ms闪烁一次LED
  • 一次性定时器:在启动定时器3秒后,点亮LED
#include <rtthread.h> #include "base.h" #include "rtconfig.h" #include "rtdef.h" // 回调函数 static void led_timer_cb(void *parameter) { RT_UNUSED(parameter); led_toggle(LED0); // 切换LED 状态 } struct rt_timer oneshort_timer; static void oneshort_timer_cb (void * parameter) { RT_UNUSED(parameter); led_set(LED1, 1); } int main (void) { hardware_init(); // 创建一个周期性定时器(1000ms) rt_timer_t led_timer = rt_timer_create("led_t", led_timer_cb, RT_NULL, rt_tick_from_millisecond(500), // RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC); if (led_timer != RT_NULL) { rt_timer_start(led_timer); // 启动定时器 } rt_timer_init(&oneshort_timer, "oneshort", oneshort_timer_cb, RT_NULL, 3*RT_TICK_PER_SECOND, // 3秒 RT_TIMER_FLAG_ONE_SHOT); rt_timer_start(&oneshort_timer); return 0; }

示例二:重启或结束定时器

在定时器回调函数被调用时,可以手动重启或者停止定时器。示例代码如下:

#include <rtthread.h> #include "base.h" #include "rtconfig.h" #include "rtdef.h" rt_timer_t led_timer; // 回调函数 static void led_timer_cb(void *parameter) { RT_UNUSED(parameter); led_toggle(LED0); // 切换LED 状态 static int count; if (++count == 20) { // 可以关闭 rt_timer_stop(led_timer); } } struct rt_timer oneshort_timer; static void oneshort_timer_cb (void * parameter) { RT_UNUSED(parameter); led_toggle(LED1); // 可以重启 rt_timer_start(&oneshort_timer); } int main (void) { hardware_init(); // 创建一个周期性定时器(1000ms) led_timer = rt_timer_create("led_t", led_timer_cb, (void *)20, rt_tick_from_millisecond(500), // RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC); if (led_timer != RT_NULL) { rt_timer_start(led_timer); // 启动定时器 } rt_timer_init(&oneshort_timer, "oneshort", oneshort_timer_cb, RT_NULL, 3*RT_TICK_PER_SECOND, // 3秒 RT_TIMER_FLAG_ONE_SHOT); rt_timer_start(&oneshort_timer); return 0; }

课程推荐

  • 全新升级的手写RTOS课程:从原理到实战,一次掌握操作系统的核心

  • 用10000+行代码手写一个TCP/IP协议栈

  • 硬核项目,从0手搓一个RISC-V模拟器!

作者介绍 李述铜,嵌入式系统与底层架构领域讲师,专注于操作系统、CPU 架构、RTOS 内核与系统软件实现原理的教学与研究。 出版作品《从0手写x86计算机操作系统》,主讲课程包括:《从0手写嵌入式操作系统》《从0手写TCP/IP协议栈》《从0手写FAT32文件系统》等。

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

1小时快速搭建:Linux Docker原型验证

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请设计一个快速原型开发模板&#xff0c;包含&#xff1a;1. 多语言选择&#xff08;Python/Node.js/Go&#xff09;2. 预配置的开发容器 3. 热重载支持 4. 内置测试框架 5. 一键部…

作者头像 李华
网站建设 2026/2/5 6:17:01

Qwen3-14B-AWQ:在消费级硬件上运行140亿参数大模型的终极指南

你是否曾因大模型高昂的硬件要求而望而却步&#xff1f;Qwen3-14B-AWQ正是为你量身打造的解决方案。这款来自阿里巴巴通义千问团队的轻量化模型&#xff0c;通过AWQ 4-bit量化技术将140亿参数压缩至消费级GPU可承受范围&#xff0c;让你在单张显卡上就能享受顶级AI能力。 【免费…

作者头像 李华
网站建设 2026/2/2 23:41:47

5步实现云顶之弈智能托管系统:零基础配置到高效运行全攻略

5步实现云顶之弈智能托管系统&#xff1a;零基础配置到高效运行全攻略 【免费下载链接】LOL-Yun-Ding-Zhi-Yi 英雄联盟 云顶之弈 全自动挂机刷经验程序 外挂 脚本 ,下载慢可以到https://gitee.com/stringify/LOL-Yun-Ding-Zhi-Yi 项目地址: https://gitcode.com/gh_mirrors/l…

作者头像 李华
网站建设 2026/2/6 6:52:59

25G光模块:驱动5G与数据中心升级的关键引擎

随着5G网络的大规模部署和数据中心流量激增&#xff0c;网络接口正经历从10G到25G的代际跨越。25G SFP28光模块以其翻倍的带宽和优异的性价比&#xff0c;成为支撑5G前传、数据中心互联及企业核心网络升级的主流选择。面对多样的应用场景&#xff0c;25G光模块已发展出丰富的技…

作者头像 李华
网站建设 2026/2/6 0:13:40

从零到一:AI游戏辅助的技术探索之旅

在当今游戏竞技领域&#xff0c;AI游戏辅助技术正悄然掀起一场革命。你是否好奇&#xff0c;深度学习如何让计算机像人类一样精准识别目标&#xff1f;目标检测算法又是怎样实现智能瞄准的&#xff1f;让我们一起踏上这场技术探索之旅&#xff0c;揭开RookieAI_yolov8项目背后的…

作者头像 李华
网站建设 2026/2/6 19:05:02

2024年全国各地区平均身高统计分析】

基于数据分析的三个猜想猜想一&#xff1a;身高增长进入平台期&#xff0c;未来增长将更加依赖精准营养干预数据显示&#xff0c;近十年来我国居民身高增长速度逐年放缓&#xff0c;年均增长不足0.3cm。这表明在现有营养水平下&#xff0c;我国居民身高已接近遗传潜力的上限。未…

作者头像 李华