本篇目标:讲清 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 只扫到第一个未到期的就停。


