DSP编译时内存溢出问题的解决

当DSP程序在RAM中运行时,由于程序大小超过配置的ramfunc限制导致内存溢出。通过分析错误提示和CMD文件,发现是RAML0长度不足。通过扩展RAML0和RAML2的长度至16K,并保留特定RAM段,成功解决了内存溢出问题。
AI助手已提取文章相关产品:

故障现象

由于DSP程序在RAM比Flash运行速度更快,所以一般会把中断里调用的程序搬运至RAM里运行。但是如果RAM里的程序占用的内存超过配置的ramfunc的长度,则会提醒内存溢出。今日,我再在28069上编译程序时,遇到了如下错误提示:

program will not fit into available memory. run placement with
alignment/blocking fails for section “ramfuncs” size 0x12a4 page 0.
Available memory ranges: F28069.cmd /SCRACController_28069_V30 line
131 C/C++ Problem

故障分析

上述故障信息大意是:程序需要的memory不足,不能将长度为0x12a4的程序搬运至RAM里运行, 我用的cmd文件名为F28069.cmd, 在此文件的 131行能看到故障位置,找到131行如下:
F28069.cmd 中提醒故障的位置
其中:

  • LOAD = FLASHD指的是现在程序在Flash中的位置段
  • RUN = RAML0指的是接收程序的RAM的位置段

打开编译后的map文件可以看到下面的信息

   name                  origin    length      used     unused   attr    fill
----------------------  --------  ---------  --------  --------  ----  --------
PAGE 0:
  RAML0                 00008000   00001200  00000000  00001200  RWIX
  FLASHD                003e8000   00004000  000012a4  00002d5c  RWIX

这个就是RAML0FLASHD的起始地址,长度,占用内存和未使用内存的描述。 可以看出,FLASHD的长度是0x4000,也就是16K,已占用的内存是0x12a4,还有0x2d5c的内存没用。RAML0的起始地址是0x8000,长度是0x1200, 还未使用。

这是因为FLASHD中程序长度是0x12a4,而RAML0的长度只有0x1200,如果将程序段搬运至RAML0中,会超过RAML0的长度,引起内存溢出。因此无法将程序搬运至RAML0中,这也就是为什么map文件中RAML0的内存还没有被使用。

在我的CMD文件中,可以看到RAML0的定义是这样的:

PAGE 0 :   /* Program Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
// RAML0       : origin = 0x008000, length = 0x000800     /* on-chip RAM block L0 */
   RAML0       : origin = 0x008000, length = 0x001200
// RAML1       : origin = 0x008800, length = 0x000400     /* on-chip RAM block L1 */

PS:其实RAML0初始的长度是0x800, RAML1的长度是0x400,我之前将RAML1注释掉,合并至RAML0了,因此这里RAML0的长度是0x1200。下图为datasheet中对RAM段的分配

技术手册中RAM段的描述

解决方案

首先,将RAML0的长度扩展至16k,也就是0x2000

PAGE 0 :   /* Program Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
// RAML0       : origin = 0x008000, length = 0x000800     /* on-chip RAM block L0 */
   RAML0       : origin = 0x008000, length = 0x002000

那么RAML0的起始地址是0x8000,结束地址是0x9FFF;后续的RAML2段起始地址就是0XA000,同理,将RAML2扩容到16K,注释掉了RAML3,RAML4。最终配置如下

PAGE 1 :   /* Data Memory */
           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
           /* Registers remain on PAGE1                                                  */
   BOOT_RSVD   : origin = 0x000000, length = 0x000040     /* Part of M0, BOOT rom will use this for stack */
   RAMM0       : origin = 0x000040, length = 0x0003C0     /* on-chip RAM block M0 */
   RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */
   RAML2       : origin = 0x00A000, length = 0x002000     /* on-chip RAM block L2 */
   RAML5       : origin = 0x00C000, length = 0x002000     /* on-chip RAM block L5 */
   RAML6       : origin = 0x00E000, length = 0x002000     /* on-chip RAM block L6 */
   RAML7       : origin = 0x010000, length = 0x002000     /* on-chip RAM block L7 */
   RAML8       : origin = 0x012000, length = 0x002000     /* on-chip RAM block L8 */

为什么保留了RAML2, RAML5,RAML6,RAML7和RAML8?看CMD文件中有如下描述

  /* Allocate uninitalized data sections: */
   .stack              : > RAMM0,      PAGE = 1
   .ebss               : > RAML2,      PAGE = 1
   .esysmem            : > RAML2,      PAGE = 1
  /* Allocate FPU math areas: */
   DMARAML5	           : > RAML5,      PAGE = 1
   DMARAML6	           : > RAML6,      PAGE = 1
   DMARAML7	           : > RAML7,      PAGE = 1
   DMARAML8	           : > RAML8,      PAGE = 1 

这几个RAM段是因为一些特殊目的,因此一定要保留的,我试过如果注释掉了。编译会报错的。

这样配置后,只要程序没问题编译就没问题了,map文件中的部分信息如下:

         name            origin    length      used     unused   attr    fill
----------------------  --------  ---------  --------  --------  ----  --------
PAGE 0:
  RAML0                 00008000   00002000  000012a4  00000d5c  RWIX
  FLASHD                003e8000   00004000  000012a4  00002d5c  RWIX

PAGE 1:
  RAML2                 0000a000   00002000  00000858  000017a8  RWIX
  RAML5                 0000c000   00002000  00000000  00002000  RWIX
  RAML6                 0000e000   00002000  00000000  00002000  RWIX
  RAML7                 00010000   00002000  00000000  00002000  RWIX
  RAML8                 00012000   00002000  00000000  00002000  RWIX

至此,RAM内存溢出的问题就解决了。

您可能感兴趣的与本文相关内容

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值