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
版权声明:本文为博主原创文章,转载请附上博文链接!
nrf51822 RAM不足分析的更多相关文章
- Android:管理应用内存
全部内容均来源于官方文档https://developer.android.com/training/articles/memory.html only way to completely relea ...
- [专业名词·硬件] 2、DC\DC、LDO电源稳压基本常识(包含基本原理、高效率模块设计、常见问题、基于nRF51822电源管理模块分析等)·长文
综述先看这里 第一节的1.1简单介绍了DC/DC是什么: 第二节是关于DC/DC的常见的疑问答疑,非常实用: 第三节是针对nRF51822这款芯片电源管理部分的DC/DC.LDO.1.8的详细分析,对 ...
- Suspend to RAM和Suspend to Idle分析,以及在HiKey上性能对比
Linux内核suspend状态 Linux内核支持多种类型的睡眠状态,通过设置不同的模块进入低功耗模式来达到省电功能.目前存在四种模式:suspend to idle.power-on standb ...
- [蓝牙] 6、基于nRF51822的蓝牙心率计工程消息流Log分析(详细)
开机初始化Log Log编号 函数名 所在文件名 000001: main ..\main.c 000002: timers_init ..\main.c 000003: gpiote_init ...
- 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. ...
- RAM调优之日志分析
D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats> ...
- 低功耗蓝牙4.0BLE编程-nrf51822开发(11)-蓝牙串口代码分析
代码实例:点击打开链接 实现的功能是从uart口发送数据至另一个蓝牙串口,或是从蓝牙读取数据通过uart打印出数据. int main(void) { // Initialize leds_init( ...
- [编译] 4、在Linux下搭建nRF51822的开发烧写环境(makefile版)
星期日, 09. 九月 2018 07:51下午 - beautifulzzzz 1.安装步骤 1) 从GNU Arm Embedded Toolchain官网下载最新的gcc-arm工具链,写文章时 ...
- PC虚拟现实应用的性能分析与优化:从CPU角度切入
如今,虚拟现实 (VR) 技术正日益受到欢迎,这主要得益于遵循摩尔定律的技术进步让这一全新体验在技术上成为可能.尽管虚拟现实能给用户带来身临其境般的超凡体验,但相比传统应用,其具有双目渲染.低延迟.高 ...
随机推荐
- Asp.net Core C#进行筛选、过滤、使用PredicateBuilder进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询
在asp.net core.asp.net 中做where条件过滤筛选的时候写的长而繁琐不利于维护,用PredicateBuilder进行筛选.过滤.LInq配合Ef.core进行动态拼接lamdba ...
- js基础学习之"=="与"==="的区别
var a = 1; var b = 1; var c = "1"; 1. "==" 可理解为相等运算符.相等运算符比较时,会自己进行类型转换,等于什么类型就会 ...
- 2021.9.21考试总结[NOIP模拟58]
T1 lesson5! 开始以为是个无向图,直接不懂,跳去T2了. 之后有看了一眼发现可暴力,于是有了\(80pts\). 发现这个图是有拓扑序的,于是可以用拓扑排序找最长路径.先找原图内在最长路径上 ...
- 方阵里面的dp
打了一场luogu的信心赛,惊讶地发现我不会T2,感觉像这样在矩阵里面的dp看起来很套路的样子,但是仔细想想还是有很多需要注意的细节. 又想到之前貌似也考过一些类似的题目 然而我并没有改 ,于是打算补 ...
- lvs 四层负载相关
都打开 /etc/sysctl.conf 中的 net.ip4.ip_forward=1.开启路由转发功能. 分发器 : eth0:192.168.1.66 (VIP) eth1:192.168.2. ...
- Piakchu之RCE漏洞
一.Ping(远程系统命令执行) 首先正常输入一个ip,查看页面的返回值.发现有乱码,但是能看出执行了ping命令. 查看源代码,可以看到只是对操作系统进行了判断,而对输入内容是否为ip地址并没有判断 ...
- google-chrome 启动报错 nss_util.cc(627)] NSS_VersionCheck("3.26") failed. NSS >= 3.26 is required
一.错误情况 报错如下: [0807/144244.712736:FATAL:nss_util.cc(627)] NSS_VersionCheck("3.26") failed. ...
- PTA 7-2 哈夫曼编码 (30分)
PTA 7-2 哈夫曼编码 (30分) 给定一段文字,如果我们统计出字母出现的频率,是可以根据哈夫曼算法给出一套编码,使得用此编码压缩原文可以得到最短的编码总长.然而哈夫曼编码并不是唯一的.例如对字符 ...
- hivesql笔记
一.常用聚合函数 count():计数 count(distinct 字段) 去重统计 sum():求合 avg():平均 max():最大值 min():最小值 二.hivesql执行顺序 from ...
- 『学了就忘』Linux基础命令 — 38、Linux中光盘的挂载
目录 步骤一:创建一个空目录 步骤二:找到光盘的设备文件名称 步骤三:挂载光盘 步骤四:访问关盘中的数据 步骤五:卸载挂载点 问题:挂载点为什么要使用空目录 提示:关于Linux系统中光盘的挂载,我们 ...