当前位置: 首页 > news >正文

从零玩转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文件系统》等。

http://www.cnnetsun.cn/news/15256.html

相关文章:

  • 从零玩转RT-Thread(22):定时器底层机制揭秘
  • B站缓存视频转换完整教程:m4s-converter高效管理本地视频
  • 解锁企业级后台管理:用Vue.js和Element-UI构建高效前端解决方案
  • WMS 和 ERP 先上哪个?行业内幕:仓库没打好地基,什么 ERP 都白搭
  • WiFi放大器小白指南:从选购到安装的完整教程
  • AI如何革新虚拟光驱开发?自动化代码生成实战
  • 2024年全国平均身高数据统计可视化分析
  • 1小时打造Mac专属SSH工具:快马平台实战
  • PIKE-RAG知识库本地化部署之分块
  • DREAM3D完整指南:从入门到精通的材料科学数据分析解决方案
  • 靠谱的自动供包环线分拣机生产厂家
  • 5分钟用VSCode在Ubuntu上搭建Web应用原型
  • 24小时挑战:用AI快速打造‘旺仔‘风格IP原型
  • 零基础搞定Umi项目自动化部署:从代码到上线的完整指南
  • 数学分析简明教程——6.2
  • SSM物业缴费管理系统u8mx4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
  • 如何在PowerPoint中轻松插入LaTeX公式:终极解决方案
  • Ultralytics YOLOv11终极性能优化:从配置到实战的完整指南
  • 突破传统:3大实战方法让GLM语言模型成为你的AI生产力工具
  • 3步快速解决HeyGem.ai性能问题:终极优化指南
  • 自助项目全解析:适配老板画像业态选择指南
  • 传统链表OUT了!侵入式链表让Nginx、TCMalloc 性能飞跃的秘密武器
  • MinIO效率革命:传统存储方案对比实测
  • AI如何帮你彻底理解box-sizing的奥秘
  • 如何用AI自动生成OpenRGB灯光控制脚本
  • 告别深夜改Bug!CodeGenie帮你快速“驯服”鸿蒙编译错误!
  • 企业IT运维:批量处理设备启动故障(代码10)实战
  • 3天掌握VAR模型:零基础搭建GPT式图像生成系统
  • Headless Recorder完整指南:从零掌握浏览器自动化脚本生成
  • 终极指南:如何用ConvNeXt实现高效语义分割(UperNet完整教程)