当前位置: 首页 > news >正文

解决因内存过小芯片使用malloc造成内存碎片使程序偶发性卡死问题

这一期,我们来分享一个之前在项目中遇到的一个使用内存出现的偶发性错误,具体原因是因为当时开发的项目采用的是STM32F1系列的103RCT6型号,其Flash为256K。

错误原因:

因为项目中采用了第三方的组件和FreeRTOS,FreeRTOS因为选择的是heap4.c内存方案,所以申请和释放的内存都会合并减少产生内存碎片,倒是不会出现内存不足造成的系统性崩坏。

而第三方组件中因为申请释放内存采用的是malloc和free,加上程序代码占用和一些静态存储占用,本身256K内存剩余不多,所以出现内存碎片就会导致对于小容量的芯片在后期动态内存申请上造成不足,容易出现hardfault_handler错误

而标题为什么会说是偶发性的是因为你的产品如果有很大的量,可能不一定每个都会出现内存申请不足,因为malloc内存申请是随机的,所以有可能会造成下次申请的所需内存空间大于剩下的内存碎片,也有可能正好小于,满足所需要的内存空间,存在不确定性,这样有可能出现你调试时候没问题,但是在生产时候就会出现问题。

因此,如果有出现这种情况可以参考我下面的解决方法!

解决方法:

所以如果没有使用os就尽量手动申请内存,减少使用malloc,造成内存碎片;如果使用os,像FreeRTOS的heap4内存方案,会将内存申请空间相近,减少内存碎片产生,尤其适用于像单片机内存只有几十KB或者几百KB的情况下。

好了,今天的分享就到这里了~

本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞和收藏,谢谢~


http://www.mrgr.cn/news/54119.html

相关文章:

  • 51单片机快速入门之 IIC I2C通信
  • 算法笔记day07
  • 【MyBatis-Plus系列】QueryWrapper中or的使用
  • 中国信通院联合中国电促会开展电力行业企业开源典型实践案例征集
  • 鸿蒙 app上怎么实现阴影效果
  • 把其他.ui文件拿到我的工程中使用
  • mysql 10 单表访问方法
  • Java 数据基本类型详解(各基本数据类型及其大小、数据类型转换、数据溢出问题、自动装箱与拆箱的影响)
  • 架构师之路-学渣到学霸历程-23
  • 理解C#中空值条件运算符及空值检查简化
  • 十五、Python基础语法(list(列表)-上)
  • AI写作助手系统盈利模式分析:打造盈利的AI网站
  • 可能要招1000+应届生!直击美团心动岗位 - 美团面试原题 - 贪心算法题如何用 go 和 C++ 解决
  • 【CSAPP】【答案/解析】《深入理解计算机系统》实验一/datalab-handout实验
  • 记录迷茫!
  • 【运维基础知识】《Linux 系统架构与文件系统及权限管理全解析》
  • java反射介绍
  • Kubernetes运行 Llama3
  • ntfs MFT损坏(ntfs文件系统故障)导致oracle异常恢复---惜分飞
  • 使用Version Catalog在项目之间共享版本
  • target_include_directories是如何组织头文件的?
  • Android开发相关的重要网站
  • 《数字图像处理基础》学习02-BMP位图文件
  • 浅析DDR
  • 【C++】类的默认成员函数:深入剖析与应用(上)
  • 编码方式知识整理【ASCII、Unicode和UTF-8】