/**
* timer structure
*/
struct rt_timer
{
struct rt_object parent; /**< inherit from rt_object */
rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL];
void (*timeout_func)(void *parameter); /**< timeout function */
void *parameter; /**< timeout function's parameter */
rt_tick_t init_tick; /**< timer timeout tick */
rt_tick_t timeout_tick; /**< timeout tick */
};
typedef struct rt_timer *rt_timer_t;
1. 基础属性
-
parent
:继承自内核对象基类rt_object
,包含公共属性:-
name
:定时器名称(调试用)。 -
type
:对象类型(如定时器、线程、信号量等)。 -
flag
:标志位(如单次/周期定时器、激活状态等)。 -
list
:链表节点,用于将定时器挂载到内核对象容器中统一管理。
-
2. 跳表与链表管理
-
row[RT_TIMER_SKIP_LIST_LEVEL]
:- 跳表(Skip List):定时器通过多级链表(默认 4 层)管理,以优化插入、删除和超时检测的效率,时间复杂度为
O(log n)
。 - 层级机制:高概率选择层级,高层链表跳过多个节点,快速定位超时时间相近的定时器。
- 排序依据:定时器按
timeout_tick
(绝对超时时间)升序排列,确保系统时钟中断中能快速触发最近的超时事件。
- 跳表(Skip List):定时器通过多级链表(默认 4 层)管理,以优化插入、删除和超时检测的效率,时间复杂度为
3. 超时处理逻辑
-
timeout_func
:超时回调函数指针,定义定时器触发时执行的逻辑(例如更新传感器数据、发送信号等)。 -
parameter
:传递给回调函数的参数(例如设备句柄、消息队列等)。
4. 时间管理
-
init_tick
:- 初始超时时间:用户设置的相对时间(单位:系统 tick),表示定时器的首次触发延时或周期触发间隔。
- 单次/周期模式:若为周期定时器,每次超时后重新用
init_tick
更新timeout_tick
。
-
timeout_tick
:- 绝对超时时间:根据系统当前 tick 值(
rt_tick_get()
)和init_tick
计算得出,用于在跳表中排序。 - 更新规则:
- 单次定时器:触发后自动从跳表移除。
- 周期定时器:触发后重新计算
timeout_tick = 当前时间 + init_tick
,并重新插入跳表。
- 绝对超时时间:根据系统当前 tick 值(