这里推荐看完韦东山的C语言本质和韦东山的rtos快速入门视频
在 FreeRTOS 的源码中大量地使用了列表和列表项,因此想要深入学习 FreeRTOS,列表和 列表项是必备的基础知识。这里所说的列表和列表项,是 FreeRTOS 源码中 List 和 List Item 的 直译,事实上,FreeRTOS 中的列表和列表项就是数据结构中的链表和节点。
FreeRTOS 中任务存在四种任务状态,分别为运行态、就绪态、阻塞态和挂起态。FreeRTOS 运行时,任务的状态一定是这四种状态中的一种,下面就分别来介绍一下这四种任务状态
1. 运行态 如果一个任务得到 CPU 的使用权,即任务被实际执行时,那么这个任务处于运行态。如果 运行 RTOS 的 MCU 只有一个处理器核心,那么在任务时刻,都只能有一个任务处理运行态。
2. 就绪态 如果一个任务已经能够被执行(不处于阻塞态后挂起态),但当前还未被执行(具有相同优 先级或更高优先级的任务正持有 CPU 使用权),那么这个任务就处于就绪态。上一节关于任务的创建函数,任务一旦被创建,就立即处于就绪态。
3. 阻塞态 如果一个任务因延时一段时间或等待外部事件发生,那么这个任务就处理阻塞态。例如任 务调用了函数 vTaskDelay(),进行一段时间的延时,那么在延时超时之前,这个任务就处理阻塞 态。任务也可以处于阻塞态以等待队列、信号量、事件组、通知或信号量等外部事件。通常情 况下,处于阻塞态的任务都有一个阻塞的超时时间,在任务阻塞达到或超过这个超时时间后, 即使任务等待的外部事件还没有发生,任务的阻塞态也会被解除。 要注意的是,处于阻塞态的任务是无法被运行的。
4. 挂起态 任务一般通过函数 vTaskSuspend()和函数 vTaskResums()进入和退出挂起态与阻塞态一样, 处于挂起态的任务也无法被运行。 四种任务状态之间的转换图如下图所示
那么为什么要使用列表?实际上,当FreeRTOS有很多列表,包括就绪列表,阻塞列表,挂起列表等,结合上面的解释就知道了,处于就绪态的若干任务放在就绪列表,处于挂起态的若干任务放在挂起列表等。