感谢分享!
12楼
目前接触到的嵌入式项目,基本都是使用FreeRTOS,避免不了使用pvPortMalloc与vPortFree,再者采用heap_4.c与后申请的内存先释放,这样最大化内存复用的效率与减少内存碎片化。不过在此也分享一个内存泄漏的案例:
前几天和同事一起做固件升级时,我们沿用了一套老旧的升级流程和代码。虽然我们各自维护的固件大小差异很大(我的程序内容较少,他的程序包含多层封装、内容更多、文件体积大),但测试下来,我的源码能正常升级他的固件,他的程序也能正常升级我的固件,互刷都没有问题。然而,当尝试用他的程序升级他自身的固件时,却反复失败。经过排查,最终定位到一个内存管理上的隐患:
代码中用一个指针指向了一块申请的缓冲区进行数据处理,之后把申请的缓冲区指针指向 NULL;
后续代码中虽有申请的缓冲区指针非 NULL 判断才执行释放,但此时指针已为空,导致释放逻辑被跳过;
随着升级流程的推进,新的缓冲区不断被申请,而旧的缓冲区始终未被释放,内存越积越多;
最终因可用内存耗尽,升级任务失败。
13楼
确认过不用 malloc,就把 Heap_Size 直接设为 0。但如果工程里引用了第三方库(比如加密、文件系统),先全局搜一遍确认没有 malloc 调用,否则库内部偷偷申请内存会直接返回 NULL,比内存不足更隐蔽。
15楼
建立完整的回收机制,没有操作系统参与,malloc()会安全吗?C语言的产生和应用,是在计算上实现的,有操作系统参与。转移到单片机上时,我不知道malloc这样的处理,是按照什么样的规则操作。难道单片机的底层有类似操作系统的管理系统?
回复
我要赚赏金打赏帖 |
|
|---|---|
| 告别手动建模:我让AI用FreeCAD画了个开发板外壳被打赏¥30元 | |
| 【瑞萨RA8D1测评】总结收官——从IMU动作识别到LVGL桌宠被打赏¥33元 | |
| 【瑞萨BLE/WIFI模块测评】MPU6050双链路对比被打赏¥30元 | |
| 【瑞萨BLE/WIFI模块测评】DA14531被打赏¥28元 | |
| 【瑞萨BLE/WI-FI模块测评】DA16200被打赏¥28元 | |
| 【瑞萨BLE/WIFI模块测评】环境搭建被打赏¥32元 | |
| 【瑞萨RA8D1测评】LVGL显示动画被打赏¥30元 | |
| 【瑞萨RA8D1测评】IMU动作识别的数据采集与模型训练被打赏¥33元 | |
| 【S32K3学习整理】时钟系统 ClockOut 功能被打赏¥28元 | |
| 【S32K3学习整理】以太网LoopBack模式功能验证被打赏¥26元 | |
我要赚赏金
