nrf51822 RAM不足分析

之前了解过STM32 的内存分配问题,对于蓝牙芯片51822的内存分配问题把项目中,遇到了.bss和。data部分超了的问题,这其实就是声明的变量和stask 及 heap的大小总和超出了单片机的RAM,仔细的分析了下NRF51822的ram的分配,这里做下分享。


首先是看下nrf51822的ROM和RAM 的大小:
这里写图片描述

ROM

RAM

我这边选用的芯片型号是 QAFAC就是有ROM 256kb RAM 32kb.
文档的20页21页


下面看下在keil工程中的配置:

这里写图片描述

实际中的RAM的开始位置并不是由0x20000000开始,这是因为最开始的部分大约有8K的空间是给了蓝牙协议栈使用。


我这边使用的蓝牙协议栈版本是S110 找到相应的文档有描述协议栈最小使用的RAM和默认的RAM大小如下:

这里写图片描述

这里写图片描述

有上面可以看到协议栈占有的RAM的大小为8K ,所以片上一共有的32K的RAM给应用程序的实际上只有24K了。

文档的35页


下面在看下在启动文件中定义的栈和堆的大小,实际上在程序运行过程中使用的栈和堆以及使用的变量都是存放在RAM中。

这里写图片描述

可以看到分配的stask size 为 7200 就认为为7K吧,heap size 为3584 就认为为3K吧。


在看下编译生成的map文件.
这里写图片描述
可以看出这个时候编译出的RW size 是23K 左右,这个时候是单片机的RAM是够用的,当然在链接的时候没有问题,能够生成MAP文件说明片子的RAM肯定是够用的。

这里说下:
Code :是程序中代码所占字节大小
RO-data :程序中所定义的指令和常量大小 (个人理解 :Read Only)
RW-data :程序中已初始化的变量大小 (个人理解”:Read/Write)
ZI-Data :程序中未初始化的变量大小 (个人理解 :Zero Initialize)

这里看到的TOAL RW size 其实是包括了启动文件中分配的栈和堆的大小的。


到这里就知道假如程序报报.bss 或者 .data 数据存储不足的话,如果程序的优化等级已经是-O3的话,这个时候就要考虑动下启动文件中的栈和堆的大小,不过这个在栈和堆如果过小会影响程序的运行,具体在程序运行中怎么测量堆和栈的使用情况这个还没有研究过,这样的话那只能去修改程序中关于变量的申请了,程序中不要声明大的数组,尤其是在牵制到协议解析的时候,不要使用太大的数据区缓存数据。

猜你喜欢

转载自blog.csdn.net/u011559046/article/details/80772417
今日推荐