FreeRTOS中的任务状态永远处于下面几个状态中的某一个:
●运行态
当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在使用处理器的任务。如果使用的是单核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态。
●就绪态
处于就绪态的任务是那些已经准备就绪(这些任务没有被阻塞或者挂起),可以运行的任务,但是处于就绪态的任务还没有运行,因为有一个同优先级或者更高优先级的任务正在运行!
●阻塞态
如果-一个任务当前正在等待某个外部事件的话就说它处于阻塞态,比如说如果某个任务调用了函vTaskDelay(的话就会进入阻塞态,直到延时周期完成。任务在等待队列、信号量、事件组、通知或互斥信号量的时候也会进入阻塞态。任务进入阻塞态会有一个超时时间,当超过这个超时时间任务就会退出阻塞态,即使所等待的事件还没有来临!
●挂起态
像阻塞态-一样,任务进入挂起态以后也不能被调度器调用进入运行态,但是进入挂起态的任务没有超时时间。任务进入和退出挂起态通过调用函数vTaskSuspend()和xTaskResume()。
状态转换:
运行态:
*当有更高级的优先级来到时,自动进入就绪态
*通过vTaskSuspend()进入挂起态
*通过阻塞API函数进入阻塞态(消息队列,邮箱等等)
就绪态:
*当它成为最高优先级时就如运行态
*通过vTaskSuspend()进入挂起态
阻塞态:
*当事件结束时就如就绪态
*通过vTaskSuspend()进入挂起态
挂起态:
*通过xTaskResume()进入就绪态