3.2 FreeRTOS基础知识

任务调度器

所谓任务调度器,其实就是使用一些调度算法来决定当前需要执行哪一个任务。

我们RTOS会创建很多个任务,这个任务我们同一时刻只能执行1个,执行哪一个呢?就是由调度算法来决定的。

FreeRTOS支持三种任务调度模式:

抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。

时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时, 任务调度器会在每一次系统时钟节拍到的时候切换任务。

协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务 FreeRTOS现在虽然还支持,但是官方已经表示不再更新协程式调度 。

任务状态

任务有哪些状态呢?

FreeRTOS中,任务共存在4种状态:

运行态:正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态 。

就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态 。

阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态。

挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume() 才可以进入就绪态 。

FreeRTOS中无非就四种状态,运行态,就绪态、阻塞态、挂起态。这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表。

列表在我们RTOS之中无处不在,非常滴重要,其实和链表差不多,一个个链子把任务串起来,就形成了一个列表。

就绪列表:pxReadyTasksLists[x],其中x代表任务优先级数值。这个其实就是一个数组,这个x的取值范围,如果你使用的软件方式,那么取值范围是无限制的;如果你用的是硬件方式,那么你的取值范围是0~31。我们使用的是硬件方式,因为硬件方式比较高效。