目录
一、任务状态
在FreeRTOS系统中,每个任务都在多种任务状态中来回切换。
1、就绪态
处于就绪态的任务以及具备执行条件,等待任务调度器调度即可执行。新创建的任务会初始化为就绪态。
2、运行态
任务正在运行,正在运行的任务永远是所有就绪态任务中优先级最高的。同一时刻只有一个任务处于运行态。
3、阻塞态
如果一个任务正在等待某个信号或外部事件那就说它处于阻塞态,阻塞态任务不在就绪列表中。例如调用了延迟函数vTaskDelay()时,那么该任务就会进入阻塞态,不再占用处理器,延迟结束再回到就绪态。
4、挂起态
处于挂起态的任务对调度器是不可见的,也就是说挂起态任务不会得到执行。将一个任务挂起就调用函数vTaskSuspend();解除挂起调用vTaskResume()和vTaskResumeFromISR(),其中vTaskResumeFromISR()是在中断中调用。
状态间转换图示
二、常用任务函数
1、创建任务
(1)动态创建
xTaskCreate();
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //任务函数
const char * const pcName, //任务名字(字符串类形)
const configSTACK_DEPTH_TYPE usStackDepth, //任务栈大小
void * const pvParameters, //传给任务的参数
UBaseType_t uxPriority, //任务优先级
TaskHandle_t * const pxCreatedTask ) //任务句柄
(2)静态创建
xTaskCreateStatic();
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, //任务函数
const char * const pcName, //任务名称
const uint32_t ulStackDepth, //任务堆栈大小
void * const pvParameters, //传给任务的函数
UBaseType_t uxPriority, //任务优先级
StackType_t * const puxStackBuffer, //任务堆栈(需定义)
StaticTask_t * const pxTaskBuffer ) //任务控制块(需定义)
2、任务删除
vTaskDelete();
入口参数为任务句柄。
void vTaskDelete( TaskHandle_t xTaskToDelete );
3、任务挂起
(1)挂起指定任务
vTaskSuspend();
入口参数为任务句柄。
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
(2)挂起全部任务
void vTaskSuspendAll( void )
{
++uxSchedulerSuspended;
}
注意:调用多少次vTaskSuspendAll()就需要调用多少次xTaskResumeAll()函数来恢复。
4、解除任务挂起
入口参数为任务句柄:
void vTaskResume( TaskHandle_t xTaskToResume ); //解除指定任务
BaseType_t xTaskResumeAll( void ); //解除全部任务
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ); //中断中使用
三、其他任务相关API函数
四、内核控制函数