这里写自定义目录标题
时钟节拍是RT thread操作系统的最小时间单位。
第一个功能,rt tick值自动加1,在RT thread当中通过RT_USING_SMP定义了多核和单核的场景。第二个功能,检查当前线程的时间片,首先获取当前线程,将当前线程的剩余thread值自动减1。如果线程的剩余thread值等于0,说明当前线程时间片已经超时。此时修改线程的状态为RT_THREAD_STAT_YIELD。
此状态下会使线程让出处理器的使用,然后将thread in need tick重新复制给remaining tick,同时将当前线程设置为已有的状态,然后执行后续的线程调度。最后一个功能是检查定时器的链表。
这三个定时器分别加上系统当前的时间20,从小到大排序链接到RT_time_list链表中,形成如图所示的定时器链表结构。每次时钟节拍中断时,RT_tick会自动+1并和链表中的定时器超时时间进行比较。如果rt_timer ≥ time_eout,则说明该定时器超时处理对应的回调函数。
如果创建了新的定时器,如在上图链表的基础上新创建了一个定时器timer#4,它的超时时间是330,则timer#4会根据超时时间放置在tim#2和tim#3之间。而周期性的定时器会在它再次启动时被加入定时器列表。
定时器在启动时会按超时时间排序插入到链表中,如果从头开始遍历链表效率会很低。当使用定时器数量比较大时,每次新创建了一个定时器并启动时会有很大的开销。
内核使用跳表算法来加速遍历速度,在rtdef.h头文件当中,通过artie mer skip list level来配置跳表的层数默认为一定时器原始有序单链表如下,如果想要查找39原始链表,需要遍历3、7、13、18、39,经过五次跳转后可以查找到结果。
那么从列表中将某些元素抽取出来加一级索引,一级索引指向了原始链表。同样查找39跳表中只需先遍历3、18、39就可以找到最终。
即定时器的类型可以是(0x0)一次性的,也可以是(0x2)周期性的。同时可以或上硬件定时器模式或软件定时器模式。
RT thread当中常用的两个延时函数,其精度都为毫秒级。