ZYX_256 2024-05-22 11:30 采纳率: 60%
浏览 7
已结题

STM32cubeMX里的FreeRTOS无法释放内存

STM32cubeMX里的FreeRTOS无法释放内存
我用的STM32F407ZGT6
pvPortMalloc(1024*512);//申请
vPortFree(data);//释放

用标准库在F103上可行,但是在F407cubeMX就不能释放

img

img

  • 写回答

24条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-22 11:30
    关注
    获得0.30元问题酬金

    引自免费微信小程序:皆我百晓生

    从您提供的信息来看,似乎在STM32F407ZGT6上使用FreeRTOS时,内存分配(pvPortMalloc)和释放(vPortFree)的功能在某些情况下可能存在问题。为了帮助您解决这个问题,我们可以逐步检查并尝试一些可能的解决方案。

    首先,确认您的FreeRTOS配置是否正确。确保您已经正确设置了heap相关参数,特别是heap size(堆大小)。这通常在main.c或相关的启动文件中设置。例如:

    #define configTOTAL_HEAP_SIZE (configMINIMAL_STACK_SIZE + 1024 * 1024) // 设置堆大小为1MB
    

    其次,请确保在创建任务时指定了足够的堆栈大小,因为默认的任务堆栈可能会太小,导致堆栈溢出影响到内存管理。例如,在创建任务时:

    xTaskCreate(Priority, StackDepth, Function, Argument, Priority, NULL);
    

    其中StackDepth应足够大,比如几千字节,根据实际需求调整。

    接下来,请检查您的代码逻辑,确保在申请内存之后,确实调用了vPortFree函数来释放内存,并且传递给它的指针是之前通过pvPortMalloc分配的正确指针。如果代码中有多个任务,确保在正确的上下文中执行释放操作,即在分配了内存的任务中进行释放。

    此外,确保您使用的strstr()函数不会导致内存泄漏。如果它返回非NULL值,那么它会返回一个指向输入字符串内部的指针,而不是复制字符串。在这种情况下,不需要额外释放内存。

    为了更好地诊断问题,可以添加一些调试输出,以便跟踪内存分配和释放的情况。例如,在申请和释放内存的地方打印相关信息:

    char* data = pvPortMalloc(1024*512);
    printf("Memory allocated at %p, size: %d bytes\n", data, 1024*512);
    
    // ...
    ...
    // 在适当的位置释放内存
    vPortFree(data);
    printf("Memory freed at %p\n", data);
    

    最后,您可以考虑使用动态内存分析工具,如Valgrind或AddressSanitizer,来检测潜在的内存泄漏。然而,这些工具可能不适用于嵌入式系统,但您可以尝试将项目移植到类似STM32F4的开发板上,看看是否可以在Linux环境下找到问题。

    如果以上步骤都无法解决问题,那可能是FreeRTOS堆实现的问题或者是其他未知的硬件或软件冲突。在这种情况下,建议查阅官方文档、社区论坛或向专业的技术支持寻求帮助。如果问题仍然存在,可能需要深入研究FreeRTOS源码或者联系STMicroelectronics的技术支持团队获取更具体的帮助。

    记住,要确保您的代码遵循良好的编程实践,包括适当的错误处理和资源管理,这样可以帮助您更快地定位和解决问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月30日
  • 创建了问题 5月22日

悬赏问题

  • ¥20 PVE虚拟机运行不流畅,出现卡顿
  • ¥15 使用stata进行网状meta分析时遇到的问题
  • ¥15 ffmpeg音视频同步
  • ¥20 Ubuntu18.04卸载Python2后无可视化界面问题
  • ¥15 php同一个单元格里多选提交,更新表格
  • ¥15 Vue 前端调用本地jar包有什么方法?
  • ¥15 基础的图像处理问题求解答
  • ¥50 全国两定智慧医保接口开发相关业务文档,以及技术实现流程文档
  • ¥15 idea做图书管理系统,要求如下
  • ¥15 最短路径分配法——多路径分配