感谢分享!
12楼
目前接触到的嵌入式项目,基本都是使用FreeRTOS,避免不了使用pvPortMalloc与vPortFree,再者采用heap_4.c与后申请的内存先释放,这样最大化内存复用的效率与减少内存碎片化。不过在此也分享一个内存泄漏的案例:
前几天和同事一起做固件升级时,我们沿用了一套老旧的升级流程和代码。虽然我们各自维护的固件大小差异很大(我的程序内容较少,他的程序包含多层封装、内容更多、文件体积大),但测试下来,我的源码能正常升级他的固件,他的程序也能正常升级我的固件,互刷都没有问题。然而,当尝试用他的程序升级他自身的固件时,却反复失败。经过排查,最终定位到一个内存管理上的隐患:
代码中用一个指针指向了一块申请的缓冲区进行数据处理,之后把申请的缓冲区指针指向 NULL;
后续代码中虽有申请的缓冲区指针非 NULL 判断才执行释放,但此时指针已为空,导致释放逻辑被跳过;
随着升级流程的推进,新的缓冲区不断被申请,而旧的缓冲区始终未被释放,内存越积越多;
最终因可用内存耗尽,升级任务失败。
15楼
建立完整的回收机制,没有操作系统参与,malloc()会安全吗?C语言的产生和应用,是在计算上实现的,有操作系统参与。转移到单片机上时,我不知道malloc这样的处理,是按照什么样的规则操作。难道单片机的底层有类似操作系统的管理系统?
回复
我要赚赏金打赏帖 |
|
|---|---|
| 【S32K3XX】FlexCAN 模块配置使用被打赏¥30元 | |
| 【S32K3XX】FlexCAN RAM 资源分配整理被打赏¥25元 | |
| 【S32K3XX】IPCF 适配核间中断处理被打赏¥21元 | |
| 【S32K3XX】IPCF 核间通讯模块UNMANAGED方式使用被打赏¥29元 | |
| 片外存储Flash使用方法(Arduino IDE环境)被打赏¥22元 | |
| 三分钟快速上手ESP-NOW(ArduinoIDE环境)被打赏¥23元 | |
| 【S32K3XX】LPSPI参数配置说明被打赏¥21元 | |
| 在WT9932C61-TINY上实现超声波测距被打赏¥22元 | |
| 基于WT9932C61-TINY的环境构建及OLED屏驱动测试被打赏¥20元 | |
| 【S32K3XX】Core-to-Core 中断使用被打赏¥21元 | |
我要赚赏金
