RT-Thread "骚操作"之内存泄漏定位

本文探讨了在RT-Thread操作系统中如何定位和解决内存泄漏问题。通过理解内存泄漏的原理,分析动态内存分配特点,结合RT-Thread的小内存管理算法和memtrace功能,可以有效地找出内存泄漏点,确保系统稳定运行。
摘要由CSDN通过智能技术生成

作者:liu2guang

上期回顾嵌入式中是否应该使用动态内存?

之前探讨了关于动态内存的东西,那么我们回到本次的主题内存泄漏。笔者前面说到使用RTOS无法避免的会有内存泄漏,所以我们需要找一种手段来查找内存泄漏并修复。笔者多次提到了内存泄漏,那内存泄漏到底是什么呢?

什么是内存泄漏

1

简单的来说内存泄漏就是应该释放的内存没有释放,那么我们回头来考虑在没有MMU的RTOS,由于分配的地址都是真实的物理地址,一段代码的所有内存都没有释放,系统的内存就会变得越来越少,最终没有内存可以使用。

最终的现象是在RT-Thread的msh上执行free命令可以看到系统没有可用的内存,效果如下:

1memheap   pool size  max used size available size
2-------- ---------- ------------- --------------
3sram1    131072     131000        72
4heap     413872     413000        872

除此之外还有一种泄漏,一段代码的部分内存没有释放,随着这块代码反复调用,内存区域被划分成了n个小块。通过free命令可以看到系统中可能还有很多内存,但是这个时候分配一个大内存的区域就可能会分配失败,因为虽然系统总内存是大于你需要分配的内存大小的,但是最大的连续块缺比你需要分配的小,这种情况也被叫做内存碎片。在RT-Thread的内存策略中只有连续的小块内存会在空闲线程中被整合成一块大内存,同时由于没有MMU所以无法利用物理与虚拟地址的转换在后台将小块内存自动整合成大内存。所以这种内存泄漏也是比较难查的问题之一,哪怕一段代码中分配了100块不同大小的内存,其中有一块没有释放也会导致系统没有大内存可用,只是时间问题。

1memheap  pool size  max used size available size
2-------- ---------- ------------- --------------
3sram1    131072     31000    
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值