news 2026/6/23 19:53:25

从零玩转RT-Thread(22):定时器底层机制揭秘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零玩转RT-Thread(22):定时器底层机制揭秘

由于定时器模拟实现的一些机制,将导致我们在使用时容现某些低级错误。为了更好地理解这些错误,本小节介绍RT-Thread定时器的基本设计原理。

注:本小节只对其设计做比较简单的介绍,目的是更好地掌握API的使用。

定时器是如何被触发的?

与时间片轮转机制工作原理类似,RT-Thread定时器依赖系统时钟节拍(tick)中断来触发执行。如下图所示:

当系统时钟节拍产生一次tick中断时,RT-Thread 会调用rt_tick_increase,tick 计数器加 1。

  1. 系统检查所有已启动的定时器。
  2. 若某定时器的超时时间已到:执行其绑定的回调函数(在中断上下文中)。
  3. 若是周期定时器,重置下次触发时间。

定时器精度:由于定时器基于系统时钟节拍中断触发执行;因此,可知其精度受时钟节拍周期影响,即最小的定时时间为1个tick。

HARD_TIMER模式的定时器

默认情况下,创建的定时器会被加入到定时器队列_timer_list中,且该链表为按触发时间排序的链表。

static rt_list_t _timer_list[RT_TIMER_SKIP_LIST_LEVEL];

当我们调用rt_timer_start()启动定时器时,定时器将插入到该队列中。

这样一来,当定时中断发生时:RT-Thread检查各个定时器是否满足超时条件。若满足,调用其回调函数,并且将周期定时器重新插入链表。而如果是一性次的定时器,则会从该链表中移除。

SOFT_TIMER模式的定时器

此外,还有另外一种模式的定时器,SOFT_TIMER。要启用这种定时器,只需要在创建定时器时传递以下标志宏:

#define RT_TIMER_FLAG_SOFT_TIMER 0x4 /* 软件定时器 */

在RT-Thread内部,采用了专门的定时器任务来扫描这些定时器,并执行回调函数。

上述任务相关的配置宏如下:

#define RT_TIMER_THREAD_PRIO 4 #define RT_TIMER_THREAD_STACK_SIZE 512

示例:创建SOFT_TIMER模式的定时器

下面的代码演示了如何创建SOFT_TIMER模式的定时器。

#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 | RT_TIMER_FLAG_SOFT_TIMER); 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_FLAG_SOFT_TIMER); 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/6/22 21:29:41

B站缓存视频转换完整教程:m4s-converter高效管理本地视频

B站缓存视频转换完整教程&#xff1a;m4s-converter高效管理本地视频 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否遇到过这样的情况&#xff1a;精心缓存的B站视频突…

作者头像 李华
网站建设 2026/6/23 19:53:01

解锁企业级后台管理:用Vue.js和Element-UI构建高效前端解决方案

解锁企业级后台管理&#xff1a;用Vue.js和Element-UI构建高效前端解决方案 【免费下载链接】renren-fast-vue 项目地址: https://gitcode.com/gh_mirrors/ren/renren-fast-vue 在当今快速发展的企业数字化浪潮中&#xff0c;一个高效、灵活且易于维护的后台管理系统对…

作者头像 李华
网站建设 2026/6/22 20:20:27

WMS 和 ERP 先上哪个?行业内幕:仓库没打好地基,什么 ERP 都白搭

WMS 和 ERP 的区别与联系&#xff1f;企业到底该选 WMS、ERP&#xff0c;还是 WMSERP&#xff1f;一句实话&#xff1a;仓库没打好地基&#xff0c;什么 ERP 都白搭很多老板在选系统的时候&#xff0c;很容易被“ERP 一把梭、管全场”这一套说法带偏。听起来确实诱人&#xff0…

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

WiFi放大器小白指南:从选购到安装的完整教程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式WiFi放大器新手教学应用&#xff0c;包含&#xff1a;1. 动画演示信号放大原理 2. 设备选购决策树(根据面积/预算等推荐产品) 3. 分步骤安装引导(带AR可视化) 4. 常见…

作者头像 李华
网站建设 2026/6/23 14:35:08

AI如何革新虚拟光驱开发?自动化代码生成实战

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个跨平台虚拟光驱工具&#xff0c;主要功能包括&#xff1a;1.支持ISO/BIN/NRG等镜像文件挂载 2.提供虚拟光驱设备管理界面 3.实现自动加载/卸载功能 4.包含镜像文件预览功能…

作者头像 李华
网站建设 2026/6/23 8:29:11

2024年全国平均身高数据统计可视化分析

数据来源 国家体育总局&#xff08;体质监测数据&#xff09; 网站&#xff1a;http://www.sport.gov.cn 国家统计局&#xff08;社会经济相关&#xff09; 网站&#xff1a;http://www.stats.gov.cn . 国际比较数据 World Population Review 网站&#xff1a;https://worl…

作者头像 李华