Lazy loaded image
原理篇11-软件定时器,非阻塞延迟
Words 643Read Time≈ 2 min
2026-9-2
🎯
本篇目标:讲清 stp_rtos 的软件定时器——定时器链表 + 跳表插入 + tick 扫描,以及它和阻塞延时的关系。

一、硬件定时器 vs 软件定时器

  • 硬件定时器:超时函数在中断上下文执行,不能阻塞、不能太长;
  • 软件定时器:超时函数在 tick 上下文(或定时器线程)执行,数量不限,是纯软件结构。
stp_rtos 的软件定时器核心是一个按超时时间升序排列的链表。

二、定时器链表

每个定时器记录“绝对超时时刻”:

三、启动定时器:按超时时间插入

链表按 timeout_tick 升序排列,头节点就是最早到期的定时器。STP_TIMER_SKIP_LIST_LEVEL 是跳表层数,插入时用随机数决定定时器“爬”到第几层,兼顾插入效率和查询效率(跳表思想)。

四、扫描:stp_timer_check

关键优化:因为链表有序,只要头节点没到期,立刻 break,不用扫全表。STP_TICK_MAX/2 是处理 tick 回绕的经典技巧——用差值判断,避免直接比大小在回绕时出错。

五、线程内置定时器:阻塞延时的真相

原理篇05的 stp_thread_sleep 就是靠线程内置定时器实现的:
sleep = 挂起线程 + 启动 thread_timer(一次性),超时回调 _thread_timeout 把线程插回就绪列表。所以延时和定时器是同一套机制,不是两套代码。

六、小结

  • 软件定时器 = 有序链表 + tick 扫描;
  • 链表有序 → 扫描可提前 break,O(到期数) 而非 O(n);
  • 阻塞延时复用线程内置定时器,一套机制两处用。
核心一句话:定时器链表按超时时刻排序,tick 只扫到第一个未到期的就停。
上一篇
C++ String 常用操作
下一篇
嵌入式工程师习题集

Comments
Loading...