首页 > 解决方案 > 从另一个任务产生新任务

问题描述

我正在试验 esp32 和 freertos。我想t2从另一个任务创建一个新任务t1。在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);
}

上述问题的原因可能是什么?

标签: freertosesp32

解决方案


这两个任务都没有无限循环。他们只是跑到完成。他们完成了 1 次工作,然后仅此而已。

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

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 );
    }
 }
}  

您需要清楚地定义您的目标才能提出一个好的设计。您必须考虑调度策略(抢占式、合作式)、任务优先级、激活等。


推荐阅读