文章目录
1、任务的四种状态
(1)就绪态
就绪态:该任务在就绪列表中,就绪的任务已经具备执行的能力,只等待调度器进行调度,新创建的任务会初始化为就绪态。
(2)运行态
该状态表明任务正在执行,此时它占用处理器,FreeRTOS 调度器选择运行的永远是处于最高优先级的就绪态任务,当任务被运行的一刻,它的任务状态就变成了运行态。
(3)阻塞态
在等待某些事件发生,包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等。(事件可以分为两类:一是时间相关的事件,即使用阻塞延时函数;二是同步事件,即某个任务在等待某些信息,别的任务或者中断服务程序会给它发送信息,发送信息的方法有:任务通知、队列、事件组、信号量、互斥量等)
(4)挂起态
处于挂起态的任务对调度器而言是不可见的,让一个任务进入挂起状态的唯一办法就是调用vTaskSuspend() 函数。
2、任务状态的迁移
1)运行态→阻塞态:正在运行的任务发生阻塞(挂起、阻塞延时、读信号量等待)时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中当前最高优先级任务。
2)就绪态、阻塞态、运行态→挂起态:任务可以通过调用 vTaskSuspend() API 函数都可以将处于任何状态的任务挂起,被挂起的任务得不到CPU 的使用权,也不会参与调度,除非它从挂起态中解除。
3)挂起态→就绪态:把一个挂起状态的任务恢复的唯一途径就是调用 vTaskResume() 或 vTaskResumeFromISR() API 函数
3、任务状态的记录及管理
对于FreeRTOS来说,如何存放每个任务的状态的捏?又是如何对任务进行管理的?
FreeRTOS的关键是链表,当然任务的状态也是通过链表进行管理的了,
对于FreeRTOS来说几乎每个任务状态均有一个链表。
如刚创建成功的任务,会将其任务控制块挂载在就绪链表中。(就绪链表中,又因为任务优先级有5个,所以每个优先级均有一个就绪链表)
4、所有任务优先级一样的基础上,最后面创建的任务会先运行
(1)例1
(2)例2
5、空闲任务的作用
删除任务后的内存清零工作是在空闲任务中进行的。
在空闲任务中会自动调用其钩子函数(即相当于中断的回调函数一样)下面是使用钩子函数的一些注意事项