20190930 (11)RT-Thread 时钟管理 理论部分(2)

目的:

1 RT 定时器列表查找方式:跳表 Skip List
2 硬件延时


正文

1 跳表

因为定时器都是根据 timeout 插入到定时器列表之中,所以需要很快速的查找相对应的位置用于插入新建定时器
而跳表就是新开一个 list 用于存储部分节点,以空间换时间
20190930 (11)RT-Thread 时钟管理 理论部分(2)_第1张图片

如图所示,如果插入 13 这个值,我只要在数组 3/18/77 中确定最相近 18 在 rt_list 中的位置,就能很快找到 13 这个应该插入的位置
而这个层次主要是由 RT_TIMER_SKIP_LIST_LEVEL 值确定,默认是 1 就是只有一层,加 1 增加一层索引列表


2 定时器管理

void rt_system_timer_init(void); //系统启动时需要初始化定时器管理系统
void rt_system_timer_thread_init(void);//使用 SOFT_TIMER,则系统初始化时,应该调用这个函数接口

20190930 (11)RT-Thread 时钟管理 理论部分(2)_第2张图片

说明一下脱离:rt_timer_detach() 并不会把定时器所占用资源释放

//filePath: include/rtdef.h 
// rt_timer_create() 会使用到的定时器标志位
#define RT_TIMER_FLAG_ONE_SHOT     0x0     /* 单次定时     */ 
#define RT_TIMER_FLAG_PERIODIC     0x2     /* 周期定时     */ 
#define RT_TIMER_FLAG_HARD_TIMER   0x0     /* 硬件定时器   */
#define RT_TIMER_FLAG_SOFT_TIMER   0x4     /* 软件定时器   */
// rt_err_t rt_timer_control(rt_timer_t timer, rt_uint8_t cmd, void* arg);

#define RT_TIMER_CTRL_SET_TIME     0x0     /* 设置定时器超时时间       */ 
#define RT_TIMER_CTRL_GET_TIME     0x1     /* 获得定时器超时时间       */ 
#define RT_TIMER_CTRL_SET_ONESHOT   0x2     /* 设置定时器为单次定时器   */ 
#define RT_TIMER_CTRL_SET_PERIODIC 0x3     /* 设置定时器为周期型定时器 */
//结构块
struct rt_timer { 
    struct rt_object parent;
    rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL]; /* 定时器链表节点 */ 
    void (*timeout_func)(void *parameter); /* 定时器超时调用的函数 */
    void *parameter; /* 超时函数的参数 */ 
    rt_tick_t init_tick; /* 定时器初始超时节拍数 */
    rt_tick_t timeout_tick; /* 定时器实际超时时的节拍数 */ 
};
typedef struct rt_timer *rt_timer_t;

你可能感兴趣的:(RT-Thread)