You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FreeRTOS任务传递结构体参数异常问题求助

问题排查与解决

核心问题:打印的是内存地址而非变量值

你任务函数里的打印代码犯了一个基础错误:

printf("Task: %d\n", &parameter.taskNr);

这里&parameter.taskNr取的是变量的内存地址,用%d格式化输出地址,自然会得到一个看似随机的固定整数。改成打印变量本身即可解决:

printf("Task: %d\n", parameter.taskNr);

其他潜在问题排查

  1. 参数传递的内存有效性
    你用malloc分配堆内存存储结构体数组的做法是对的(堆内存不会像栈变量那样被自动销毁),但要确保taskPtr不会在任务运行期间被提前释放——如果main函数后续调用free(taskPtr),任务访问参数时会触发未定义行为。

  2. 类型定义的一致性
    你已经用typedef把结构体定义为taskParameters,但main里却写了struct taskParameters *taskPtr;,虽然C语言兼容这种写法,但建议统一写成taskParameters *taskPtr;,避免类型混淆。

  3. 简化参数访问方式
    没必要在任务里拷贝结构体,直接用指针访问参数更高效也更少出错:

    taskParameters *parameter = (taskParameters *)param;
    while (1)
    {
        printf("Task: %d\n", parameter->taskNr);
        // 其他任务逻辑
    }
    
  4. 内存分配检查
    记得添加malloc成功与否的判断,避免空指针访问:

    taskPtr = (taskParameters *)malloc(n * sizeof(taskParameters));
    if (taskPtr == NULL) {
        // 处理内存分配失败的情况
        return;
    }
    

如果你之前尝试全局结构体的方式没生效,大概率也是打印地址的错误导致的,修正打印逻辑后再测试即可。

内容的提问来源于stack exchange,提问作者Bernard Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:31:22