在FreeRTOS中,可能我们所创建的任务有很多,其所处的状态也有所不同,FreeRTOS的任务状态主要有四种,分别为blocked阻塞状态,suspended暂停状态,ready就绪状态,以及running运行状态,具体状态关系图如下图所示。
从图中我们可以看到,由运行状态到阻塞状态需要事件触发函数,事件触发函数有很多,比如我们常用的延时函数vTaskDelay就是一个事件触发函数,当我们在任务中调用这个函数,那么我们的任务就进入了阻塞状态。任务由阻塞状态进入就绪状态也是需要事件触发的,比如我们的延时函数vTaskDelay延时完毕后就触发了,使我们任务就回到了就绪状态。从就绪状态到运行状态是要看任务的优先级的,高优先级任务优先进入运行状态,同优先级任务轮流进入运行状态。
其实我们用的最多的状态还是suspended暂停状态,也叫挂起状态,将一个任务挂起,则需要调用vTaskSuspend函数,如果要是将自己挂起就可以用:
vTaskSuspend( NULL );
如果将其他任务挂起则可以用:
vTaskSuspend( xTaskToSuspend );
其中xTaskToSuspend为要挂起函数的句柄。
如果想要将一个函数由挂起状态转为就绪状态,则需要调用vTaskResume函数,例如
vTaskResume( xTaskToSuspend );
其中xTaskToSuspend为要恢复就绪函数的句柄。