从另一个任务产生新任务

Spawning new task from another task

我正在试验 esp32 和 freertos。我想从另一个任务 t1 创建一个新任务 t2。在 t2 中,我在 for 循环中打印语句,但 for 循环在第一次打印后停止打印,ESP32 模块仅在第一次打印后卡住。以下是我使用的代码:

void t2(void *pvParam){
    ESP_LOGI(TAG,"task 2 started \n");
    int i = 0;
    for(i = 0; i < 3; i++)
        print("...task 2 printing\n");
}

void t1(void)
{
    BaseType_t xReturned;
    TaskHandle_t xHandle = NULL;
    xReturned = xTaskCreate(&t2,"t2",4048,NULL,configMAX_PRIORITIES-1,&xHandle);
    printf("xReturned = %d \n", xReturned);
    if(xReturned == pdPASS)
    {
         vTaskDelete( xHandle );
    }
}   
void app_main()
{   
    xTaskCreate(&t1,"namet",4048,NULL,configMAX_PRIORITIES- 1,NULL);
}

出现上述问题的原因是什么?

两个任务都没有死循环。他们刚刚 运行 完成。他们做了 1 次工作,然后仅此而已。

我不明白你的目的,但如果你只是想试验一下(这不是一个合适的解决方案),你可以在 t1 中进行无限循环并创建具有 更高优先级的 t2(这样 t1 不会干扰并在 t2 完成之前再次调用 xTaskCreate()),保持 t2 代码不变。那应该是 "keep printing".

void t1(void)
{
 while (1)
 {
    BaseType_t xReturned;
    TaskHandle_t xHandle = NULL;
    xReturned = xTaskCreate(&t2,"t2",4048,NULL,configMAX_PRIORITIES,&xHandle);
    printf("xReturned = %d \n", xReturned);
    if(xReturned == pdPASS)
    {
         vTaskDelete( xHandle );
    }
 }
}  

你需要明确你的目标,才能做出好的设计。您必须考虑调度策略(抢占式、协作式)、任务优先级、激活等。