• nrf51822 RAM不足分析


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

    首先是看下nrf51822的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的话,这个时候就要考虑动下启动文件中的栈和堆的大小,不过这个在栈和堆如果过小会影响程序的运行,具体在程序运行中怎么测量堆和栈的使用情况这个还没有研究过,这样的话那只能去修改程序中关于变量的申请了,程序中不要声明大的数组,尤其是在牵制到协议解析的时候,不要使用太大的数据区缓存数据。
    ---------------------
    作者:陶孜河畔
    来源:CSDN
    原文:https://blog.csdn.net/u011559046/article/details/80772417
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Response.AppendHeader使用大全
    JS获取父框架的内容:获取子框架的内容:js框架应用
    各种好用的代码生成器
    Centos 64位上搭建Android
    WinForm 多线程
    GAC及其作用
    WPF 详解模板
    WPF控件开发基础(1)
    WPF:从WPF Diagram Designer Part 1学习控件模板、移动、改变大小和旋转
    告诫
  • 原文地址:https://www.cnblogs.com/jack-hzm/p/10183195.html
Copyright © 2020-2023  润新知