目录
之前的章节,FreeRTOS还没有支持多优先级,只支持两个任务互相切换,从本章开始,任务中我们开始加入优先级的功能。在FreeRTOS中,数字优先级越小,逻辑优先级也越小,这与隔壁的RT-Thread和μC/OS刚好相反。
1. 如何支持多优先级
就绪列表pxReadyTasksLists[ configMAX_PRIORITIES ]是一个数组,数组里面存的是就绪任务的TCB(准确来说是TCB里面的xStateListItem节点),数组的下标对应任务的优先级,优先级越低对应的数组下标越小。空闲任务的优先级最低,对应的是下标为0的链表。图 演示的是就绪列表中有两个任务就绪,优先级分别为1和2,其中空闲任务没有画出来,空闲任务自系统启动后会一直就绪,因为系统至少得保证有一个任务可以运行。
configMAX_PRIORITIES 为任务优先级数量,若 配置为 5,则优先级范围【0,4】,其余以此类推。
任务在创建的时候,会根据任务的优先级将任务插入到就绪列表不同的位置。相同优先级的任务插入到就绪列表里面的同一条链表中,这就是我们下一章要讲解的支持时间片轮转。
pxCurrenTCB是一个全局的TCB指针,用于指向优先级最高的就绪任务的TCB,即当前正在运行的TCB。那么我们要想让任务支持优先级,即只要解决在任务切换(taskYIELD)的时候,让pxCurrenTCB指向最高优先级的就绪任务的TCB就可以,前面的章节我们是手动地让pxCurrenTCB在任务1、任务2和空闲任务中轮转,现在我们要改成pxCurrenTCB在任务切换的时候指向最高优先级的就绪任务的TCB即可,那问题的关键就是:如果找到最高优先级的就绪任务的TCB。
FreeRTOS提供了两套方法,一套是通用的,一套是根据特定的处理器优化过的,接下来我们重点讲解下这两个方法。