主要是学习任务状态相互转换

参考概念: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的区别

对比BlockedSuspended
产生方式Delay、等待队列等vTaskSuspend()
是否等待条件是否
时间到会否恢复会不会
如何恢复时间或事件满足必须调用vTaskResume()
是否参与调度否否
TCB和栈是否保留是是

Controller删除自己

vTaskDelete(NULL);

Controller正在使用自己的栈,所以其资源需要等切换走以后,由Idle任务安全清理。

Timer Service Task

配置中

#define configUSE_TIMERS 1

它负责:

  • 软件定时器回调;
  • 软件定时器命令;
  • xTimerPendFunctionCall();
  • 定时器到期处理。

Idle任务

执行vTaskStartScheduler(),FreeRTOS内核会自动创建Idle任务。优先级为0,最低优先级。