RT-Thread 定时器结构体

/**
 * 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(绝对超时时间)升序排列,确保系统时钟中断中能快速触发最近的超时事件。

3. ​超时处理逻辑
  • timeout_func:超时回调函数指针,定义定时器触发时执行的逻辑(例如更新传感器数据、发送信号等)。
  • parameter:传递给回调函数的参数(例如设备句柄、消息队列等)。

4. ​时间管理
  • init_tick

    • 初始超时时间:用户设置的相对时间(单位:系统 tick),表示定时器的首次触发延时或周期触发间隔。
    • 单次/周期模式:若为周期定时器,每次超时后重新用 init_tick 更新 timeout_tick
  • timeout_tick

    • 绝对超时时间:根据系统当前 tick 值(rt_tick_get())和 init_tick 计算得出,用于在跳表中排序。
    • 更新规则
      • 单次定时器:触发后自动从跳表移除。
      • 周期定时器:触发后重新计算 timeout_tick = 当前时间 + init_tick,并重新插入跳表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值