woshisangao 发表于 2013-8-10 09:06:00

DSP2812代码长度超出RAM容量,有谁遇到过吗?

接触2812没多长时间,写了一段代码后编译出现如下错误:>>   error: can't allocate .text, size 000012db (page 0) in PRAMH0 (avail:
            00001000),网上找资料说的是代码长度超出RAM空间了,有几种解决办法,1、精简代码,直至不会出现此类错误,2、增加外部RAM,3、修改cmd文件,把代码放到不同的text段内,前面两种方法暂时不方便实现,第三种方法网上也有部分介绍,但是CMD文件不太一样,不是太理解,所以一直没能解决问题,不知道有谁遇到过此类状况,分享下经验,怎么配置CMD文件,万分感谢。。。
我的SRAM.CMD文件如下:

MEMORY
{
PAGE 0 :
   PRAMH0   : origin = 0x3f8000, length = 0x001000      
         
PAGE 1 :
   /* SARAM                     */   
   RAMM0    : origin = 0x000000, length = 0x000400
   RAMM1    : origin = 0x000400, length = 0x000400

   /* Peripheral Frame 0:   */
   DEV_EMU    : origin = 0x000880, length = 0x000180
   FLASH_REGS : origin = 0x000A80, length = 0x000060
   CSM      : origin = 0x000AE0, length = 0x000010
   XINTF      : origin = 0x000B20, length = 0x000020
   CPU_TIMER0 : origin = 0x000C00, length = 0x000008
   CPU_TIMER1 : origin = 0x000C08, length = 0x000008               
   CPU_TIMER2 : origin = 0x000C10, length = 0x000008               
   PIE_CTRL   : origin = 0x000CE0, length = 0x000020
   PIE_VECT   : origin = 0x000D00, length = 0x000100

   /* Peripheral Frame 1:   */
   ECAN_A   : origin = 0x006000, length = 0x000100
   ECAN_AMBOX : origin = 0x006100, length = 0x000100

   /* Peripheral Frame 2:   */
   SYSTEM   : origin = 0x007010, length = 0x000020
   SPI_A      : origin = 0x007040, length = 0x000010
   SCI_A      : origin = 0x007050, length = 0x000010
   XINTRUPT   : origin = 0x007070, length = 0x000010
   GPIOMUX    : origin = 0x0070C0, length = 0x000020
   GPIODAT    : origin = 0x0070E0, length = 0x000020
   ADC      : origin = 0x007100, length = 0x000020
   EV_A       : origin = 0x007400, length = 0x000040
   EV_B       : origin = 0x007500, length = 0x000040
   SPI_B      : origin = 0x007740, length = 0x000010
   SCI_B      : origin = 0x007750, length = 0x000010
   MCBSP_A    : origin = 0x007800, length = 0x000040

   /* CSM Password Locations */
   CSM_PWL    : origin = 0x3F7FF8, length = 0x000008

   /* SARAM                  */   
   DRAMH0   : origin = 0x3f9000, length = 0x001000         
}


SECTIONS
{
   /* Allocate program areas: */
   .reset         : > PRAMH0,      PAGE = 0
   .text            : > PRAMH0,      PAGE = 0


   .cinit         : > PRAMH0,      PAGE = 0

   /* Allocate data areas: */
   .stack         : > RAMM1,       PAGE = 1
   .bss             : > DRAMH0,      PAGE = 1
   .ebss            : > DRAMH0,      PAGE = 1
   .const         : > DRAMH0,      PAGE = 1
   .econst          : > DRAMH0,      PAGE = 1      
   .sysmem          : > DRAMH0,      PAGE = 1
   
   /* Allocate Peripheral Frame 0 Register Structures:   */
   DevEmuRegsFile    : > DEV_EMU,    PAGE = 1
   FlashRegsFile   : > FLASH_REGS, PAGE = 1
   CsmRegsFile       : > CSM,      PAGE = 1
   XintfRegsFile   : > XINTF,      PAGE = 1
   CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1      
   CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1      
   CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1      
   PieCtrlRegsFile   : > PIE_CTRL,   PAGE = 1      
   PieVectTable      : > PIE_VECT,   PAGE = 1

   /* Allocate Peripheral Frame 2 Register Structures:   */
   ECanaRegsFile   : > ECAN_A,      PAGE = 1   
   ECanaMboxesFile   : > ECAN_AMBOX   PAGE = 1

   /* Allocate Peripheral Frame 1 Register Structures:   */
   SysCtrlRegsFile   : > SYSTEM,   PAGE = 1
   SpiaRegsFile      : > SPI_A,      PAGE = 1
   SciaRegsFile      : > SCI_A,      PAGE = 1
   XIntruptRegsFile: > XINTRUPT,   PAGE = 1
   GpioMuxRegsFile   : > GPIOMUX,    PAGE = 1
   GpioDataRegsFile: > GPIODAT   PAGE = 1
   AdcRegsFile       : > ADC,      PAGE = 1
   EvaRegsFile       : > EV_A,       PAGE = 1
   EvbRegsFile       : > EV_B,       PAGE = 1
   ScibRegsFile      : > SCI_B,      PAGE = 1
   McbspaRegsFile    : > MCBSP_A,    PAGE = 1

   /* CSM Password Locations */
   CsmPwlFile      : > CSM_PWL,   PAGE = 1

}

woshisangao 发表于 2013-8-10 09:09:30

自己顶下先,坐等能人出现

NJ8888 发表于 2013-8-10 09:44:46

你的是RAM调试,代码全在RAM中当然大不了,如果只是想做试验,怕反复烧FLASH,那你就临时屏蔽部分代码。其实FLASH没有那样脆弱,就用FLASH烧写调试,只是想断点的话,FLASH中的代码没法断,你要把你关心的部分函数用__ramfunc修饰,这样这个函数就能大断点调试了,你要找个FLASH的CMD模版

NJ8888 发表于 2013-8-10 09:45:41

话说2812毕竟老了,新产品建议换其他

woshisangao 发表于 2013-8-10 10:30:53

NJ8888 发表于 2013-8-10 09:44 static/image/common/back.gif
你的是RAM调试,代码全在RAM中当然大不了,如果只是想做试验,怕反复烧FLASH,那你就临时屏蔽部分代码。其 ...

我就是考虑到FALSH没法调试,所以才想解决ram的问题,大神说的__ramfunc和打断点调试是什么,小弟菜鸟愚昧,可否加以解释或者资料指示?万分感谢

woshisangao 发表于 2013-8-10 10:32:07

NJ8888 发表于 2013-8-10 09:45 static/image/common/back.gif
话说2812毕竟老了,新产品建议换其他

刚刚入门DSP,所以花了200块钱买了块2812 的开发板,板子还各种有问题,等以后条件成熟了,定会换个系列

qjs412_avr 发表于 2013-8-10 10:43:58

修改为:
PRAMH0   : origin = 0x3f8000, length = 0x002000

qjs412_avr 发表于 2013-8-10 10:45:37

woshisangao 发表于 2013-8-10 10:32 static/image/common/back.gif
刚刚入门DSP,所以花了200块钱买了块2812 的开发板,板子还各种有问题,等以后条件成熟了,定会换个系列 ...

你的长度定义为4K,实际代码超出4k,H0 SARAM有8K的空间

woshisangao 发表于 2013-8-10 10:50:57

qjs412_avr 发表于 2013-8-10 10:43 static/image/common/back.gif
修改为:
PRAMH0   : origin = 0x3f8000, length = 0x002000

先谢过了,之前有这样改过,但是编译还是会出错,我考虑是不是后面有个   /* SARAM                  */   
   DRAMH0   : origin = 0x3f9000, length = 0x001000 起始地址是0x3f9000,如果长度设置为2000的话,会不会和起始地址冲突了

qjs412_avr 发表于 2013-8-10 11:14:49

woshisangao 发表于 2013-8-10 10:50 static/image/common/back.gif
先谢过了,之前有这样改过,但是编译还是会出错,我考虑是不是后面有个   /* SARAM                  * ...

你可以用L0 SARAM和L1 SARAM,粗略看了你上面的cmd文件,这两个空间好像没用,共有8K的长度

woshisangao 发表于 2013-8-10 11:18:37

qjs412_avr 发表于 2013-8-10 11:14 static/image/common/back.gif
你可以用L0 SARAM和L1 SARAM,粗略看了你上面的cmd文件,这两个空间好像没用,共有8K的长度 ...

你说的是在原来的基础上新增加使用这个空间吗?具体的话应该如何实现呢?

qjs412_avr 发表于 2013-8-10 11:33:04

woshisangao 发表于 2013-8-10 11:18 static/image/common/back.gif
你说的是在原来的基础上新增加使用这个空间吗?具体的话应该如何实现呢? ...

MEMORY:
PAGE 0 :
   PRAMH0   : origin = 0x3f8000, length = 0x001000      
   PRAMH1   : origin = 0x009000, length = 0x001000

SECTIONS:
.text            : {*(.text)} >> PRAMH0|PRAMH1,      PAGE = 0

woshisangao 发表于 2013-8-10 12:01:26

qjs412_avr 发表于 2013-8-10 11:33 static/image/common/back.gif
MEMORY:
PAGE 0 :
   PRAMH0   : origin = 0x3f8000, length = 0x001000      


我试了试,果然可以了,感谢你的热心帮助,愿你一切顺利。{:handshake:}

qjs412_avr 发表于 2013-8-10 13:54:36

woshisangao 发表于 2013-8-10 12:01 static/image/common/back.gif
我试了试,果然可以了,感谢你的热心帮助,愿你一切顺利。

呵呵...共同学习{:victory:}

wangfei1956 发表于 2013-8-10 22:31:34

学习了,有收获了一些!
页: [1]
查看完整版本: DSP2812代码长度超出RAM容量,有谁遇到过吗?