news 2026/6/15 16:11:05

从零玩转RT-Thread(20):为什么需要定时器?——定时器的应用场景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零玩转RT-Thread(20):为什么需要定时器?——定时器的应用场景

在很多时候,系统中需要周期性地做某些事情,或者推迟执行某件事,此时可以借助定时器来实现这些功能。

什么是定时器?

RT-Thread中的定时器是一个“非阻塞式”的延迟或周期执行工具,它不依赖任务执行,而是在系统时钟节拍中断或者指定的定时器任务)中被调度触发,执行预设的回调函数。

它与任务中使用延时函数有着不同的特性,具体来说有如下几个方面:

特性

延时函数(如rt_thread_delay()

定时器

执行者

当前任务本身

系统 tick 定时触发回调

是否阻塞

阻塞当前任务

非阻塞

使用场景

任务内部临时等待

轻量定时触发任务逻辑

执行位置

任务上下文

中断上下文(或任务上下文)

典型应用场景

通常情况下,我们常常将定时器用于以下几种场合。虽然在这些场合中可以使用硬件定时器实现相同的功能;但是,硬件定时器毕竟有限,于是就需要利用RT-Thread提供的定时器。

1. 周期性任务调度

例如:LED 心跳灯、状态刷新。每隔一秒刷新一次界面、闪一次灯,不需要一个完整的任务做这件事。

如果单独创建一个任务来完成这些简单的工作,则过于浪费任务资源。

2. 超时检测机制

例如:串口接收超时、按键长按。如果在一定时间内没收到数据,说明通信异常,可以重连。

3. 替代任务延时函数,提高响应效率

在任务中,可以避免使用rt_thread_mdelay()等函数,而是在事件发生时被定时器唤醒或回调执行。这样任务就可以尽早做某它事情。

4. 软件看门狗

定时执行一个喂狗操作,防止系统死锁。

5. 延迟启动某项功能

例如,设备开机后延迟5秒启动某个服务。

案例演示:定时闪烁LED(1秒闪一次)

下面的示例使用一个定时器,每隔 1 秒切换一次 LED 状态。

#include <rtthread.h> #include "base.h" #include "rtconfig.h" // 回调函数 static void led_timer_cb(void *parameter) { RT_UNUSED(parameter); led_toggle(LED0); // 切换LED 状态 } int main (void) { // 创建一个周期性定时器(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); // 启动定时器 } return 0; }

可以看到:如果要使用定时器,我们需要先创建定时器再启动(与任务创建相同)。但是,当定时器启动后,系统会根据定时器的要求周期性(或一次性)的调用定时器指定的回调函数。

课程推荐

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

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

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

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

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

ConvNeXt语义分割终极指南:5步实现高精度像素级场景理解

ConvNeXt语义分割终极指南&#xff1a;5步实现高精度像素级场景理解 【免费下载链接】ConvNeXt Code release for ConvNeXt model 项目地址: https://gitcode.com/gh_mirrors/co/ConvNeXt ConvNeXt语义分割技术正成为计算机视觉领域的新标杆&#xff0c;它巧妙地将现代T…

作者头像 李华
网站建设 2026/6/15 12:52:19

Day35 文件的规范拆分和写法

知识点&#xff1a; 1. 规范的文件命名 2. 规范的文件夹管理 3. 机器学习项目的拆分 4. 编码格式和类型注解 昨天我们介绍了如何在不同的文件中&#xff0c;导入其他目录的文件&#xff0c;核心在于了解导入方式和python解释器检索目录的方式。 搞清楚了这些&#xff0c;…

作者头像 李华
网站建设 2026/6/15 13:42:35

10倍效率提升:VSCode插件开发最佳实践

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个VSCode插件开发效率工具包&#xff0c;包含&#xff1a;1) 项目脚手架生成器 2) 调试配置自动生成 3) 测试用例模板 4) 发布流程自动化脚本 5) 性能分析工具。要求支持一键…

作者头像 李华
网站建设 2026/6/15 13:54:05

ModernWMS企业级部署实战指南:5分钟实现高可用仓库管理系统

ModernWMS企业级部署实战指南&#xff1a;5分钟实现高可用仓库管理系统 【免费下载链接】ModernWMS The open source simple and complete warehouse management system is derived from our many years of experience in implementing erp projects. We stripped the original…

作者头像 李华
网站建设 2026/6/15 13:48:18

LabelPlus:高效漫画翻译工具完整使用指南

LabelPlus&#xff1a;高效漫画翻译工具完整使用指南 【免费下载链接】LabelPlus Easy tool for comic translation. 项目地址: https://gitcode.com/gh_mirrors/la/LabelPlus 在漫画翻译领域&#xff0c;LabelPlus是一款备受推崇的开源漫画翻译工具&#xff0c;它能显著…

作者头像 李华
网站建设 2026/6/15 11:50:15

CH341驱动在工业自动化中的典型应用案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于CH341驱动的工业设备通信中间件。要求实现多设备并行通信管理&#xff0c;支持MODBUS协议转换&#xff0c;提供通信状态监控界面。包含异常处理机制&#xff0c;确保工…

作者头像 李华