freertos - 从另一个任务产生新任务
问题描述
我正在试验 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);
}
上述问题的原因可能是什么?
解决方案
这两个任务都没有无限循环。他们只是跑到完成。他们完成了 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 );
}
}
}
您需要清楚地定义您的目标才能提出一个好的设计。您必须考虑调度策略(抢占式、合作式)、任务优先级、激活等。
推荐阅读
- java - 从 s3 读取密钥文件时出错 - 并非所有字节都从 S3ObjectInputStream 读取,正在中止 HTTP 连接
- python - 如何从 python 中的 splunk stats 创建可视化?
- android - Android Studio 模拟器错误:检测到挂起的线程“QEMU2 主循环”
- c# - 遇到类似键前缀的问题,即。尽管两者都存在,但调用“Tag1”而不是“Tag10”
- c# - 迭代数据表时检查列是否存在?
- java - 使用 ProcessBuilder 调用 Java 方法
- php - 从 php 更改当前服务器日期和时间
- amazon-web-services - 使用 EC2 实例名称和私有 IP 地址创建 awscli 表输出
- reactjs - redux-saga 总是返回 'undefined'
- javascript - 如何使用 javascript 淡入淡出