FreeRTOS任务传递结构体参数异常问题求助
问题排查与解决
核心问题:打印的是内存地址而非变量值
你任务函数里的打印代码犯了一个基础错误:
printf("Task: %d\n", ¶meter.taskNr);
这里¶meter.taskNr取的是变量的内存地址,用%d格式化输出地址,自然会得到一个看似随机的固定整数。改成打印变量本身即可解决:
printf("Task: %d\n", parameter.taskNr);
其他潜在问题排查
参数传递的内存有效性
你用malloc分配堆内存存储结构体数组的做法是对的(堆内存不会像栈变量那样被自动销毁),但要确保taskPtr不会在任务运行期间被提前释放——如果main函数后续调用free(taskPtr),任务访问参数时会触发未定义行为。类型定义的一致性
你已经用typedef把结构体定义为taskParameters,但main里却写了struct taskParameters *taskPtr;,虽然C语言兼容这种写法,但建议统一写成taskParameters *taskPtr;,避免类型混淆。简化参数访问方式
没必要在任务里拷贝结构体,直接用指针访问参数更高效也更少出错:taskParameters *parameter = (taskParameters *)param; while (1) { printf("Task: %d\n", parameter->taskNr); // 其他任务逻辑 }内存分配检查
记得添加malloc成功与否的判断,避免空指针访问:taskPtr = (taskParameters *)malloc(n * sizeof(taskParameters)); if (taskPtr == NULL) { // 处理内存分配失败的情况 return; }
如果你之前尝试全局结构体的方式没生效,大概率也是打印地址的错误导致的,修正打印逻辑后再测试即可。
内容的提问来源于stack exchange,提问作者Bernard Lee
相关产品推荐
相关产品推荐

