从另一个任务产生新任务
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 );
}
}
}
你需要明确你的目标,才能做出好的设计。您必须考虑调度策略(抢占式、协作式)、任务优先级、激活等。
我正在试验 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 );
}
}
}
你需要明确你的目标,才能做出好的设计。您必须考虑调度策略(抢占式、协作式)、任务优先级、激活等。