主要是学习任务状态相互转换
参考概念:005_任务状态及相互转换
创建
创建两个任务,一个worker,一个controller。controller的优先级比worker要高
static TaskHandle_t xWorkerHandle = NULL;
xTaskCreate(vWorkerTask,Worker",configMINIMAL_STACK_SIZE,NULL,1,&xWorkerHandle);
xTaskCreate(vControllerTask,"Controller",configMINIMAL_STACK_SIZE,NULL,2,NULL);
worker需要提供一个任务句柄,用来控制任务。
vWorkerTask
static void vWorkerTask(void *pvParameters)
{
unsigned long ulRunCount = 0;
(void)pvParameters;
for (;;)
{
printf("WORKER running!\n");
vTaskDelay(pdMS_TO_TICKS(200));
}
}
测试
在vControllerTask中通过句柄操作vWorkerTask
static void vControllerTask(void *pvParameters)
{
(void)pvParameters;
vTaskDelay(pdMS_TO_TICKS(1000));
vTaskSuspend(xWorkerHandle); //挂起worker任务
vTaskDelay(pdMS_TO_TICKS(1000));
vTaskResume(xWorkerHandle); //恢复worker任务
vTaskDelay(pdMS_TO_TICKS(1000));
vTaskDelete(xWorkerHandle); //删除worker任务
xWorkerHandle = NULL;//防止空指针
vTaskDelete(NULL); // 删除自身任务
}
Blocked和Suspended的区别
| 对比 | Blocked | Suspended |
|---|---|---|
| 产生方式 | Delay、等待队列等 | vTaskSuspend() |
| 是否等待条件 | 是 | 否 |
| 时间到会否恢复 | 会 | 不会 |
| 如何恢复 | 时间或事件满足 | 必须调用vTaskResume() |
| 是否参与调度 | 否 | 否 |
| TCB和栈是否保留 | 是 | 是 |
Controller删除自己
vTaskDelete(NULL);
Controller正在使用自己的栈,所以其资源需要等切换走以后,由Idle任务安全清理。
Timer Service Task
配置中
#define configUSE_TIMERS 1
它负责:
- 软件定时器回调;
- 软件定时器命令;
xTimerPendFunctionCall();- 定时器到期处理。
Idle任务
执行vTaskStartScheduler(),FreeRTOS内核会自动创建Idle任务。优先级为0,最低优先级。