RT-Thread版本:4.0.5
MCU型号:STM32F103RCT6(ARM Cortex-M3 内核)
1 线程优先级链表
每个线程控制块都带有一个链表成员,根据优先级将thread->slist插入对相应优先级链表中,对于相同优先级采取时间片轮转调度方式,若线程当前时间片已用完,且其所在的优先级队列为当前系统最高优先级,则调用rt_list_insert_before(&(rt_thread_priority_table[thread->current_priority]),&(thread->tlist))将此线程插入到末尾,切换到表头线程运行。

对于不同优先级,采取抢占式调度,每次会从优先级链表找出当前最高优先级链表(即非空),然后在其中取出第一个线程运行。

2 位图算法
查找最高优先级的线程,首先得先找到当前最高的就绪优先级,最容易想到的调度算法(调度算法1):
for(i = 0; i < 256; i++)
{
if(rt_thread_priority_table[i] != NULL)
break;
}
highest_ready_priority = i;
此算法可以找到当前最高的就绪优先级,但当最高优先级为255时,每次都要遍历完优先级表才能找到,时间复杂度O(n)
每个优先级链表是否存在线程,可以用一个bit位来表示,对于256级的线程,则共需要256个bit位,即32字节,因此引入:
rt_uint8_t rt_thread_ready_table[32];
数组的第一个字节的bit0表示优先级0,bit7表示优先级7,第而个字节的bit0表示优先级8,以此类推:
bit: 7 6 5 4 3 2 1 0
byte0 |007|006|005|

本文详细介绍了RT-Thread操作系统中线程优先级链表和位图算法的原理及应用,通过逐步优化调度算法,最终实现了高效的时间复杂度O(1)的实时调度。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



