FreeRTOS 抢占式调度器的实现

时间:2022-11-15 20:16:53

通过如下的框图来说明枪占式调度器在FreeRTOS中的运行过程,让大家有一个形象的认识:


FreeRTOS 抢占式调度器的实现

运行条件:

 此框图是FreeRTOS操作系统运行过程中的一部分。

 这里仅对抢占式调度进行说明。 

 创建3个任务Task1,Task2和Task3。 

 Task1的优先级为1,Task2的优先级为2,Task3的优先级为3。FreeRTOS操作系统是设置的数值越小任务优先级越低,故Task3的优先级最高,Task1的优先级最低。 


运行过程描述如下:

 此时任务Task1在运行中,运行过程中由于Task2就绪,在抢占式调度器的作用下任务Task2抢占Task1的执行。Task2进入到运行态,Task1由运行态进入到就绪态。 

 任务Task2在运行中,运行过程中由于Task3就绪,在抢占式调度器的作用下任务Task3抢占Task2的执行。Task3进入到运行态,Task2由运行态进入到就绪态。 

 任务Task3运行过程中调用了阻塞式API函数,比如vTaskDelay,任务Task3被挂起,在抢占式调度器的作用下查找到下一个要执行的最高优先级任务是Task2,任务Task2由就绪态进入到运行态。 

 任务Task2在运行中,运行过程中由于Task3再次就绪,在抢占式调度器的作用下任务Task3抢占Task2的执行。Task3进入到运行态,Task2由运行态进入到就绪态。 上面就是一个简单的不同优先级任务通过抢占式调度进行任务调度和任务切换的过程。


如果用户在FreeRTOS的配置文件FreeRTOSConfig.h中禁止使用时间片调度,那么每个任务必须配置不同的优先级。当FreeRTOS多任务启动执行后,基本会按照如下的方式去执行:


 首先执行的最高优先级的任务Task1,Task1会一直运行直到遇到系统阻塞式的API函数,比如延迟,事件标志等待,信号量等待,Task1任务会被挂起,也就是释放CPU的执行权,让低优先级的任务得到执行。 

 FreeRTOS操作系统继续执行任务就绪列表中下一个最高优先级的任务Task2,Task2执行过程中有两种情况: 

 Task1由于延迟时间到,接收到信号量消息等方面的原因,使得Task1从挂起状态恢复到就绪态,在抢占式调度器的作用下,Task2的执行会被Task1抢占。 

 Task2会一直运行直到遇到系统阻塞式的API函数,比如延迟,事件标志等待,信号量等待,Task2任务会被挂起,继而执行就绪列表中下一个最高优先级的任务。 

 如果用户创建了多个任务并且采用抢占式调度器的话,基本都是按照上面两条来执行。根据抢占式调度器,当前的任务要么被高优先级任务抢占,要么通过调用阻塞式API来释放CPU使用权让低优先级任务执行,没有用户任务执行时就执行空闲任务。