news 2025/12/20 8:49:37

从零玩转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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/12 16:03:39

隐形眼镜护理液浸泡的关键

使用护理液浸泡隐形眼镜并非只是倒一点、泡一泡那么简单&#xff0c;这一步做不对的话&#xff0c;镜片不干净不说&#xff0c;还可能伤眼睛。那么&#xff0c;浸泡过程中有哪些关键点需要大家注意的呢&#xff1f; 护理液的核心作用是清洁、杀菌以及保湿&#xff0c;全面保护和…

作者头像 李华
网站建设 2025/12/19 20:19:33

Obsidian主页定制终极指南:打造你的专属知识管理门户

还在为Obsidian杂乱无章的主页而烦恼吗&#xff1f;想要一个既美观又实用的知识管理门户吗&#xff1f;今天就来教你如何通过Farouks Homepage主题&#xff0c;快速打造个人专属的Obsidian主页。这个主题专为知识管理而设计&#xff0c;集成了卡片布局、动态进度条和智能倒计时…

作者头像 李华
网站建设 2025/12/12 16:02:34

三步完成InternLM3模型4bit量化:显存直降50%的终极部署指南

三步完成InternLM3模型4bit量化&#xff1a;显存直降50%的终极部署指南 【免费下载链接】InternLM Official release of InternLM series (InternLM, InternLM2, InternLM2.5, InternLM3). 项目地址: https://gitcode.com/gh_mirrors/in/InternLM 还在为AI大模型部署时爆…

作者头像 李华
网站建设 2025/12/12 16:02:24

fcitx5 vs ibus:中文输入法性能深度对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个输入法性能测试工具&#xff0c;功能包括&#xff1a;1. 测量输入法启动时间 2. 记录输入响应延迟 3. 统计内存和CPU占用 4. 测试词库加载速度 5. 生成可视化对比报告。要求…

作者头像 李华
网站建设 2025/12/12 16:02:12

智能简历解析终极指南:如何用AI技术精准提取关键信息

智能简历解析终极指南&#xff1a;如何用AI技术精准提取关键信息 【免费下载链接】Resume-Matcher Resume Matcher is an open source, free tool to improve your resume. It works by using language models to compare and rank resumes with job descriptions. 项目地址…

作者头像 李华
网站建设 2025/12/19 11:30:42

springAI学习 一

一、Spring AI 概述 什么是Spring AI&#xff1f; Spring生态的AI集成框架 统一API访问不同AI服务&#xff08;OpenAI、Azure OpenAI、Anthropic等&#xff09; 支持多种AI功能&#xff1a;聊天、文生图、嵌入、向量存储等 Spring AI 是一个用于 AI 工程的应用框架。 其目标…

作者头像 李华