前言

本文在于记录FreeRTOS的一些注意点。

任务状态

FreeRTOS的任务有四种状态,分别是运行态、就绪态、阻塞态和挂起态
运行态:若一个任务正在运行,就说这个任务处于运行态。处于运行态的任务就是当前正在使用处理器的任务。如果使用的是单核处理器,那么无论在什么时候都只有一个任务处于运行态。
就绪态:处于就绪态的任务是指那些己经准备就绪,可以运行的任务,但当前未被调度度器选中从而未运行,因为有其他优先级更高的任务正在运行。
阻塞态:若一个任务当前正在等待某个外部事件发生,就说这个任务处于阻塞态。任务进入阻塞态会有一个超时时间,如果超过这个超时时间,任务就会退出阻塞态,即使所等待的事件还没有发生。
挂起态:挂起态类似于阻塞态,但任务进入挂起态后不能被调度器选中从而进入运行态,而且进入挂起态的任务没有超时时间。
运行态只能由就绪态转换而来。
个人理解:理论上还存在第五种状态,在任务被删除后,其TCB控制块仍保留一段时间,等待内核检查和回收资源,在内核没有处理之前,任务其实并没有被完全删除,但是再也不能被调度器调度,在这种状态下,需要通过空闲任务释放被删除任务的内存。
1
图片来源:CSDN不成大佬我是猪

任务优先级

FreeRTOS的任务优先级本身是没有限制的。但是优先级数量越多,消耗的资源也越多。当配置configUSE_PORT_OPTIMISED_TASK_SELECTION为1时,即采用硬件方法查找下一个要运行的任务,由于硬件的限制,任务的优先级数量也会受到限制。对于STM32而言,使用硬件方法查找下一个要运行的任务时,任务优先级的数量最多为32个,即0-31。优先级数值越大,代表优先级越高,这点和中断优先级正好相反。对于同一优先级的多个任务,FreeRTOS将采用时间片调度运行这些任务,每个任务只运行一个时间片,如此反复。FreeRTOS的任务优先级通过链表实现,实际上任务调度管理的核心是链表管理
1而其中configMAX_PRIORITIES是在FreeRTOSConfig.h里设置的最大优先级,pxReadyTasksLists[ N ]表示优先级为N的处于Ready/Running的任务