QCC51XX---系统学习目录_嵌入式学习_force的博客-CSDN博客
想必大家有时会遇到一些memory的panic,就像下图的提示
这主要是内存溢出引起的。而内存溢出主要有内存池(memory pool)和RAM溢出两种,不管哪种溢出都是不规范使用内存或过度使用造成的。那具体有多少能用或怎么正确使用呢?接下来我们一起看看。
首先我们要了解芯片RAM的大小,以3044为例,datasheet中写了很多类型的RAM,但我们常用的只有P1核的DM(data memory),这个大小只有40KB。而这40KB也不全是给数据变量存储,里面会划分好几个分区,这部分可以在link_script_common.ld这个文件查看。我们也可以用一个简单的方法去看这个分区的情况,在pydbg的窗口输入apps1.subsystem.memory_usage(),我们就能看到整个P1的DM分区使用情况。
可以看到这整一块大小正是40960个bytes,也就是40KB。而我们代码中申请的变量空间就是我图中圈出来的部分,大小约有24KB。这24KB还分了两部分,下面就来讲解下这两部分的内容。
pmalloc_blocks:我们有时候会在代码中用到这样一些语句malloc和free,这是我们在代码中申请一部分空间,用完之后再释放时用到的语句。如果申请的指针变量没有用malloc分配空间就很容易出现莫名其妙的问题;或者用malloc分配了空间,但没有用free去释放空间,这就会造成空间没有被重复利用而导致内存溢出问题。其实malloc和free都是程序对内存使用的一种常见方法,他不是实时对RAM申请空间,而是在内存池(memory pool)中申请一个空间 ,这个内存池实际也是程序启动时申请的一个大变量。内存池的配置可以查找app_pools这数组。
第一个数据表示这一个池的大小,第二个数据表示这个池的个数
例如{4,15}表示,4bytes的内存池有15个
另外用指令apps1.fw.pmalloc.info()可以去看实时的内存池使用情况
这个实时的数据中内存池大小、个数和配置中的是一一对应的,(内存池有部分声明在pmalloc_config_P1.h中)其中out的这一列就是目前存在多少个正被使用的池。同时也可以用apps1.fw.pmalloc.report()看具体使用的地方。
Tips:当申请的空间没有刚好合适的时候,会选择最贴近这个大小的去申请。当没有适合的内存池时,申请会失败。
例如,申请一个6bytes的空间,程序是不会分配4bytes的内存池给你,只会分配一个8bytes的,如果8bytes的内存池没有了,程序就会分配12bytes的,遇到同样的问题以此类推。如果申请的是1000bytes,内存池最大就692bytes,这时候就会申请失败。
unallocated_ram: 我们平常声明变量存储的空间,例如uint8 a[1000] 就会在这个空间划分1000bytes。这个空间没有什么特殊的规则,除了变量申请超过这个空间大小时就会造成panic。