news 2026/4/6 16:05:46

从零玩转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/4/2 6:39:09

终极指南:如何用Lago开源计费系统快速搭建企业级计费平台

终极指南&#xff1a;如何用Lago开源计费系统快速搭建企业级计费平台 【免费下载链接】lago Open Source Metering and Usage Based Billing 项目地址: https://gitcode.com/GitHub_Trending/la/lago Lago开源计费系统为企业提供了强大的使用计量和基于事件的计费解决方…

作者头像 李华
网站建设 2026/4/4 11:00:10

590S-0350-5-0-0-00欧陆Eurotherm直流调速器故障代码

590S-0350-5-0-0-00 欧陆直流调速器&#xff08;属派克 590 系列&#xff09;的常见故障代码及其含义和处理方法如下&#xff1a;常见故障代码及含义OVERSPEED&#xff08;超速报警&#xff09;含义&#xff1a;速度反馈超过额定速度的 125%。可能原因&#xff1a;速度反馈信号…

作者头像 李华
网站建设 2026/4/4 2:00:08

10分钟搞定!ComfyUI帧插值神器让视频流畅度翻倍

10分钟搞定&#xff01;ComfyUI帧插值神器让视频流畅度翻倍 【免费下载链接】ComfyUI-Frame-Interpolation A custom node set for Video Frame Interpolation in ComfyUI. 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Frame-Interpolation 还在为视频卡顿、动…

作者头像 李华
网站建设 2026/3/30 13:17:32

auipc指令在NEMU中的执行过程

指令集为RV64I内存地址开始于0x8000 0000使用如下的代码&#xff1a;static const uint32_t img [] {0x00000297, // auipc t0,00x00028823, // sb zero,16(t0)0x0102c503, // lbu a0,16(t0)0x00100073, // ebreak (used as nemu_trap)0xdeadbeef, // some data};Decode的定义…

作者头像 李华
网站建设 2026/4/4 6:09:03

Fritzing终极指南:如何用开源工具快速上手电子设计

Fritzing终极指南&#xff1a;如何用开源工具快速上手电子设计 【免费下载链接】fritzing-app Fritzing desktop application 项目地址: https://gitcode.com/gh_mirrors/fr/fritzing-app 想要轻松设计电路却苦于传统EDA软件的复杂性&#xff1f;Fritzing作为一款专为电…

作者头像 李华
网站建设 2026/3/31 11:11:55

Spring新手必看:@Autowired注解从入门到精通

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向初学者的Spring Boot教学项目&#xff0c;逐步演示Autowired的使用&#xff1a;1) 最简单的字段注入示例 2) 解决常见No qualifying bean错误 3) 使用Qualifier解决歧义…

作者头像 李华