感谢分享!
12楼
目前接触到的嵌入式项目,基本都是使用FreeRTOS,避免不了使用pvPortMalloc与vPortFree,再者采用heap_4.c与后申请的内存先释放,这样最大化内存复用的效率与减少内存碎片化。不过在此也分享一个内存泄漏的案例:
前几天和同事一起做固件升级时,我们沿用了一套老旧的升级流程和代码。虽然我们各自维护的固件大小差异很大(我的程序内容较少,他的程序包含多层封装、内容更多、文件体积大),但测试下来,我的源码能正常升级他的固件,他的程序也能正常升级我的固件,互刷都没有问题。然而,当尝试用他的程序升级他自身的固件时,却反复失败。经过排查,最终定位到一个内存管理上的隐患:
代码中用一个指针指向了一块申请的缓冲区进行数据处理,之后把申请的缓冲区指针指向 NULL;
后续代码中虽有申请的缓冲区指针非 NULL 判断才执行释放,但此时指针已为空,导致释放逻辑被跳过;
随着升级流程的推进,新的缓冲区不断被申请,而旧的缓冲区始终未被释放,内存越积越多;
最终因可用内存耗尽,升级任务失败。
13楼
确认过不用 malloc,就把 Heap_Size 直接设为 0。但如果工程里引用了第三方库(比如加密、文件系统),先全局搜一遍确认没有 malloc 调用,否则库内部偷偷申请内存会直接返回 NULL,比内存不足更隐蔽。
15楼
建立完整的回收机制,没有操作系统参与,malloc()会安全吗?C语言的产生和应用,是在计算上实现的,有操作系统参与。转移到单片机上时,我不知道malloc这样的处理,是按照什么样的规则操作。难道单片机的底层有类似操作系统的管理系统?
回复
我要赚赏金打赏帖 |
|
|---|---|
| 28BYJ-48机械臂实现人脸跟随被打赏¥24元 | |
| 基于RK3506B的片温识读功能的实现被打赏¥25元 | |
| 【瑞萨RA8D1测评】基于FreeRTOS的lvgl移植教程被打赏¥29元 | |
| 电子价签墨水屏开发被打赏¥35元 | |
| 【Ozone】RTT 打印终端使用被打赏¥29元 | |
| BMS保护板绝缘检测功能-不平衡电桥技术绝缘电阻检测设计与实现被打赏¥34元 | |
| 给28BYJ-48三自由度机械臂加一个网页控制台被打赏¥32元 | |
| 用28BYJ-48电机从零搭一台三自由度机械臂被打赏¥33元 | |
| 【英飞凌开发经验】ModusToolbox配置EdgeTalk外设被打赏¥27元 | |
| 基于BQ76952PFBR的BMS保护板热插拔损坏的原因和处理措施被打赏¥32元 | |
我要赚赏金
