13.2.2 任务运行状态

更新于 2026年10月10日 版权声明
13.2.2 任务运行状态

在FreeRTOS的管理任务运行时,每一个任务均可运行在睡眠态、就绪态、运行态、阻塞态和挂起态,如图13.7所示。在任一给定的时刻,任务的状态一定是这5种状态之一。

(1)睡眠态。睡眠态是指任务驻留在程序空间之中,还没有交给FreeRTOS管理。就绪态和运行态的任务可以通过xTaskDelete()函数回到睡眠态。

(2)就绪态。

①睡眠态→就绪态。通过xTaskCreate()或xTaskCreateStatic()函数创建完成后进入就绪态。当任务一旦建立,这个任务就进入就绪态准备运行。任务的建立可以是在多任务运行开始之前,也可以是动态地被一个运行着的任务建立。

图示

图13.7 任务运行状态

②阻塞态→就绪态。阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),会加入就绪列表,从而由阻塞态变成就绪态。若此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,该任务将再次转换状态,由就绪态变成运行态。(https://www.daowen.com)

③运行态→就绪态。正处于运行态的任务,若有更高优先级任务创建或恢复后,会发生任务调度,此时就绪列表中最高优先级任务变为运行态,那么原先运行的任务由运行态变为就绪态,进入就绪列表中,等待最高优先级的任务运行完毕再继续运行原来的任务。

④挂起态→就绪态。把一个处于挂起态的任务恢复的唯一途径就是通过调用任务恢复函数vTaskResume()或vTaskResumeFromISR(),若此时被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,该任务将再次转换状态,由就绪态变成运行态。

(3)运行态。发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态。有3种方式可让任务从就绪态进入运行态:第一次启动vTaskStartScheduler(),正常任务调度taskYIELD()和中断级任务调度portYIELD_FROM_ISR()。

(4)阻塞态。正在运行的任务发生阻塞(挂起、延时、读信号量等待)时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中当前最高优先级任务。

(5)就绪态、阻塞态、运行态→挂起态。系统可以通过调用vTaskSuspend()函数将处于任何状态的任务挂起,被挂起的任务得不到CPU的使用权,也不会参与调度,除非它从挂起态中解除。

可通过图13.7所示的任务运行状态分析13.2.1小节的应用案例任务运行的过程。下面将按照任务状态运行,从创建任务开始,围绕状态切换过程讲解和分析任务运行过程。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)