Biu~笔记:高通蓝牙ADK(26)--RAM资源查看

Biu~ 想必大家有时会遇到一些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

       以上是本期博文的全部内容,如有疑问就别在博文下方评论留言了,有什么疑问或想了解的当面和我说(如果你知道我是谁的话ヽ( ̄▽ ̄)و),我会尽量安排上(o´ω`o)و。谢谢大家浏览,我们下期再见。

 

 多看文档,多上官网

多看文档,多上官网

多看文档,多上官网

 

      

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论

准备人肉小编,和你当面聊聊人生
太及时了,遇到啥问题就更新啥问题