之前了解过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
版权声明:本文为博主原创文章,转载请附上博文链接!

nrf51822 RAM不足分析的更多相关文章

  1. Android:管理应用内存

    全部内容均来源于官方文档https://developer.android.com/training/articles/memory.html only way to completely relea ...

  2. [专业名词·硬件] 2、DC\DC、LDO电源稳压基本常识(包含基本原理、高效率模块设计、常见问题、基于nRF51822电源管理模块分析等)·长文

    综述先看这里 第一节的1.1简单介绍了DC/DC是什么: 第二节是关于DC/DC的常见的疑问答疑,非常实用: 第三节是针对nRF51822这款芯片电源管理部分的DC/DC.LDO.1.8的详细分析,对 ...

  3. Suspend to RAM和Suspend to Idle分析,以及在HiKey上性能对比

    Linux内核suspend状态 Linux内核支持多种类型的睡眠状态,通过设置不同的模块进入低功耗模式来达到省电功能.目前存在四种模式:suspend to idle.power-on standb ...

  4. [蓝牙] 6、基于nRF51822的蓝牙心率计工程消息流Log分析(详细)

    开机初始化Log Log编号 函数名   所在文件名 000001: main ..\main.c 000002: timers_init ..\main.c 000003: gpiote_init ...

  5. Suspend to RAM和Suspend to Idle分析,以及在HiKey上性能对比【转】

    转自:https://www.cnblogs.com/arnoldlu/p/6253665.html 测试环境:AOSP 7.1.1+Kernel 4.4.17 HW:HiKey Ubuntu 14. ...

  6. RAM调优之日志分析

    D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats> ...

  7. 低功耗蓝牙4.0BLE编程-nrf51822开发(11)-蓝牙串口代码分析

    代码实例:点击打开链接 实现的功能是从uart口发送数据至另一个蓝牙串口,或是从蓝牙读取数据通过uart打印出数据. int main(void) { // Initialize leds_init( ...

  8. [编译] 4、在Linux下搭建nRF51822的开发烧写环境(makefile版)

    星期日, 09. 九月 2018 07:51下午 - beautifulzzzz 1.安装步骤 1) 从GNU Arm Embedded Toolchain官网下载最新的gcc-arm工具链,写文章时 ...

  9. PC虚拟现实应用的性能分析与优化:从CPU角度切入

    如今,虚拟现实 (VR) 技术正日益受到欢迎,这主要得益于遵循摩尔定律的技术进步让这一全新体验在技术上成为可能.尽管虚拟现实能给用户带来身临其境般的超凡体验,但相比传统应用,其具有双目渲染.低延迟.高 ...

随机推荐

  1. AlertManager集群搭建

    AlertManager集群搭建 一.AlertManager集群搭建 1.背景 2.机器 3.集群可用配置 4.alertmanager启动脚本 1.127.0.0.1:9083 机器启动脚本 2. ...

  2. freemarker中使用String字符串作为模板

    在日常开发中,我们有时候需要发送短信.邮件等通知,但是这些通知的内容通常都是动态的,而且可能会发生变动,为了程序的灵活性,我们通常会将通知的内容配置在页面上,然后后台通过渲染这些模板,来获取具体的内容 ...

  3. 硬件工程师必须掌握的PCB叠层设计内容

    总的来说叠层设计主要要遵从两个规矩: 1. 每个走线层都必须有一个邻近的参考层(电源或地层); 2. 邻近的主电源层和地层要保持最小间距,以提供较大的耦合电容; 下面列出从两层板到八层板的叠层来进行示 ...

  4. 修炼Servlet

    修炼Servlet 一.Servlet简单认识 1.Servlet是什么 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的 ...

  5. stop: Job failed while stopping start: Job is already running: networking eth0 not configured

    再给ubuntu系统重启网络服务的时候出现失败,"stop: Job failed while stopping start: Job is already running: network ...

  6. 并发编程从零开始(十四)-Executors工具类

    并发编程从零开始(十四)-Executors工具类 12 Executors工具类 concurrent包提供了Executors工具类,利用它可以创建各种不同类型的线程池 12.1 四种对比 单线程 ...

  7. GoLang设计模式13 - 观察者模式

    观察者模式是一种行为型设计模式.这种模式允许一个实例(可以称为目标对象)发布各种事件(event)给其他实例(观察者).这些观察者会对目标对象进行订阅,这样每当目标对象发生变化时,观察者就会收到事件( ...

  8. offsetX各种值总结

    pageX: 页面X坐标位置 pageY: 页面Y坐标位置 screenX: 屏幕X坐标位置 screenY: 屏幕Y坐标位置 clientX: 鼠标的坐标到页面左侧的距离 clientY: 鼠标的坐 ...

  9. es聚合查询语法

    {    "size": 0,    "query": {        "bool": {            "filter ...

  10. RocketMQ源码详解 | Consumer篇 · 其一:消息的 Pull 和 Push

    概述 当消息被存储后,消费者就会将其消费. 这句话简要的概述了一条消息的最总去向,也引出了本文将讨论的问题: 消息什么时候才对被消费者可见? 是在 page cache 中吗?还是在落盘后?还是像 K ...