作者: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