[经验] CC2540解决内存不足的方法

[复制链接]

技术员

发表于 2016-4-11 17:16:18   873 查看 0 回复 显示全部楼层 倒序浏览
分享
CC2540解决内存不足的方法
转载:http://blog.csdn.net/itas109

今天CC2540运行IAR程序时,连接阶段报错,是因为XKATA内存不足的原因:

Error[e104]: Failed to fit all segments into specified ranges. Problem discovered in segment XDATA_N. Unable to place 2 block(s) (0xbba byte(s) total) in 0x925 byte(s) of memory. The problem occurred while processing the segment placement command
"-P(XDATA)XDATA_N=_XDATA_START-_XDATA_END", where at the moment of placement the available memory ranges were "XDATA:15db-1eff"
Error while running Linker

首先,告诉大家一些解决办法,然后分析一下:
1、  减少冗余数组,优化程序
2、  换用更大内存的片子

一般而言,我们板子都是买好的,要想换掉不太容易,所以我们选择优化程序。
解决办法:
在预编译里面有一个INT_HEAP_LEN属性,默认的值为3027,将他改小到1000或者更小,这个问题就可以解决。

###############################################################################
为什么会这样子呢?我们可以来分析一下。

首先,我们得了解CC2540的存储器的情况。

CC2540里的四种存储空间(结构上划分的存储空间,并不是实际的存储器,是一种理论上的概念)
      1.  CODE   程序存储器   用处存放程序代码和一些常量
           有16根地址总线,所以CODE的寻址范围是 0000H~FFFFH共64KB

      2.  DATA   数据存储器   用于存放程序运行过程中的数据
           有8根地址总线,所以DATA的寻址空间为 00H~FFH共256 byte.低128位可以直接寻址,高128位只能间接寻址。

      3.  XDATA  外部数据存储器(只能间接寻址,访问速度比较慢) DMA是在XDATA上寻址的,这一点很重要
           有16根地址总线,所以 XDATA的寻址空间为 0000H ~ FFFFH共64K

      4.  SFR  特殊功能寄存器  就是那些T1CTL, EA, P0等配置寄存器存储的地方共128K。因为CC2530的配置寄存器比较多,所以一些多余的寄存器就放到了XREG 里面。XREG的大小为1K XREG的访问速度比 SFR慢。


从图中可以看出,XDATA中包含了所有存储器的映射,包括256kb的FLASH存储器,8K的SRAM存储器,还有 SFR , XREG, INFORMATION FAGE。这里看出来,其实CC2530的DATA,和 XDATA,都是用SRAM作为物理存储媒介的,但是它们的寻址方式不一样,所以访问DATA,比访问XDATA要快。至于SFR,XREG,INFORMATION PAGE,我不知道它们用了什么物理存储媒介,但是它们都被映射到XDATA上,可以被DMA访问。
这里要搞清楚一个概念,映射到XDATA上,不代表就只能用XDATA的寻址方式访问。比如SFR,它虽然被映射到了XDATA上,只能说明,DMA可以通过访问XDATA来操作SFR,但是CPU还是可以通过单周期访问SRF.打个比方,我们平时坐的公交车上都有一把逃生应急锤,在紧急情况下可以敲破窗子逃生。我们平时不会使用锤子敲碎窗子进出车厢,我们平时有车门可以走。但是在特殊情况下(比如DMA要操作某个存储器中的数据时),我们可以用特殊的方法(从XDATA上的映射来得到我们想要的数据)。
*************************************************************************
虽然上面说了这么多,其实我们只需要了解到:DATA和XDATA存在SRAM上,而CODE存在Flash上就可以了。哪一段的代码溢出我们就处理哪一段。CC2540是256KB的Flash和8KB的SRAM。

我们在Output文件夹的.map文件中的最后可以看到
166 159 bytes of CODE  memory
      26 bytes of DATA  memory (+ 81 absolute )
   6 396 bytes of XDATA memory
     192 bytes of IDATA memory
       8 bits  of BIT   memory
   4 478 bytes of CONST memory
也就是我们比较关心的DATA+XDATA所占的内存不能SRAM的8KB,这就是我们处理问题的关键。那么,我们知道DATA是用于存放程序运行过程中的数据。XDATA中包括堆的定义,也就是堆数组包括在XDATA。
**********************************************************************
那么我们把INT_HEAP_LEN的值改小以后,程序有什么影响呢?
正如前面所说的INT_HEAP_LEN位于XDATA,它是一个堆,是为了动态内存分配的,BLE协议栈使用动态分配了几个功能,主要用于执行加密和存储安全密钥。如果你减少INT_HEAP_LEN的值太多,加密就会失败。现在设想一个主机可以可以用加密的方式同时连接到三个从机。这里的堆大小就需要特别大,如果没有充足的空间,程序将无法执行。但是如果INT_HEAP_LEN值改的太大,又影响了运行中的数据处理。所以一个合适的INT_HEAP_LEN值,是比较难找的。
Heap size is reserved for dynamic memory allocation in the stack. Reduced
heap size may reduce the performance and may reject packets in the heavily
loaded system especially for Coordinator. 1K heap would be enough for some
small demo i.e. LIGHT – SWITCH demo, it depends on the application and how
much data to send.

*************************************************************************
那么为什么我们把INT_HEAP_LEN的值改小以后,程序就能正常执行了呢?
在OSAL_Memory.c中我们找到了
{
static __no_init osalMemHdr_t theHeap[MAXMEMHEAP / OSALMEM_HDRSZ];
}
其中MAXMEMHEAP的定义,我们在Onboard.h中可以找到
{
// Memory Allocation Heap
#if defined( EXTERNAL_RAM )
  #define MAXMEMHEAP EXT_RAM_LEN   // Typically, 32K
#else
  #define MAXMEMHEAP INT_HEAP_LEN  // Typically, 0.70-1.50K
#endif
}

上面的代码就是定义了一个堆,大小为(MAXMEMHEAP / OSALMEM_HDRSZ)

所以,INT_HEAP_LEN的大小就决定了整个堆的大小,我们可以适当的减小INT_HEAP_LEN的值来达到减少程序大小的目的。

标签:CC2540 内存
高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

我的提问

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

DFRobot专区

树莓派论坛

智能硬件论坛

开发快智能硬件开发平台

Intel物联网开发者专区

Waveshare

乐美客SBC专区

Arduino论坛

BeagleBone论坛

机器人论坛

创客神器NanoPi

小钢炮CANNON

比派科技banana pi专区

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

个人版区

阿东Verilog技术专版

直流马达驱动电路设计

LabVIEW英雄联盟

特权同学FPGA专区

-

厂商专区

灵动微电子 MM32

盈鹏飞嵌入式

TI论坛

TI Deyisupport社区

芯灵思嵌入式论坛

Tisan

米尔科技

庆科社区

WIZnet技术专区

Cypress技术论坛

飞凌嵌入式

Qualcomm技术论坛

英创嵌入式

机智云GoKit论坛

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区