rt-thread的调度算法为基于优先级调度和基于时间片轮转调度共存的策略。rt-thread内核中存在多个线程优先级,并且支持多个线程具有同样的线程优先级。线程级别数目在rtconfig.h中以宏定义的方式配置,当系统存在多个线程时,可能的情况是,某些线程具有不同的线程优先级,但是还有一些线程具有相同的优先级。rt-thread采用的调度策略是:
不同优先级的线程,采用可抢占的方式:就绪的高优先级的线程会“立刻”抢占低优先级的线程;
同线程优先级别的多个线程则采用时间片轮转,同级线程依次获得CPU时间
在上面的情形中,摆在rt-thread面前的问题是,如何从多个线程优先级别中找出当前优先级最高的那个线程,并调度执行。
rt-thread的内核调度算法采用位图(bitmap)实现,算法时间复杂度为O(1)(注,O(1)定义,请参考数据结构相关书籍,即每次调度的时间恒定:无论当前的系统中存在多少个线程,多少个优先级,rt-thread的调度函数总可以在恒定的时间内选择出最高优先级的线程执行。
线程结构存储
寻找当前线程优先级最高的线程并调度执行,首先需要解决线程数据结构的存储问题。下面先来分析rt-thread中如何存储多个线程的数据结构。
先做几点说明:
每个线程的信息用线程控制块(Thread Control-Block,缩写为TCB)表示,它是定义在rtdef.h中的struct结构体,用来描述一个线程所有必要信息;
线程的优先级别用非负整数(即无符号整数)表示。数值越小,优先级越高;
系统的线程优先级的数目固定,最多支持256级;
系统中的线程数目不做任何限制,线程的数目仅受限于系统RAM的大小。
读者不妨思考最后两点,当系统存在多个的线程时,如何存储线程控制块才能满足要求?
线程的优先级别数目固定。使用数组存储TCB,数组的长度即为线程优先级的数目,数组的每个元素为一个指向TCB数据结构的指针。
线程数目不受限制。那当某个线程优先级上存在多个线程时,这些TCB显然没办法存储在上面定义的数组对应的优先级位置上,那么使用链表,链表是一种数据结构,每个元素彼此链接,TCB中有一个链接下一个TCB的“链表数据结构”,如同一个钩子一样。
这样就可以达到上面提及的两点设计要求,不同线程优先级的线程的TCB分别存在线程TCB数组对应优先级的位置上。对于相同优先级别的多个线程,我们只需要将该优先级的第一个就绪线程的TCB存储在线程TCB数组中相关位置,后续同级线程通过链表依次连接。
scheduler.c

假定RT_THREAD_PRIORITY_MAX这个宏为256