Part Number:TMS320F28388D
大家好,
我在使用CLA时发现ClaProg的内存空间不够,编译时会出现下面信息:
../2838x_FLASH_CLA_lnk_cpu1.cmd", line 161: error #10099-D: program will not fit into available memory, or the section contains a call site that requires a trampoline that can't be generated for this section. run placement with alignment/blocking fails for section "Cla1Prog" size 0x1e98 page 0. Available memory ranges:RAMLS5_6_7size: 0x1800unused: 0x1800max hole: 0x1800
主要问题是ClaProg在Flash是够用的,但是在运行时需要复制到RAM中执行,但我的RAM空间不够,所以才有了上述错误,cmd文件配置如下:
/* BEGIN is used for the "boot to Flash" bootloader mode*/BEGIN: origin = 0x080000, length = 0x000002BOOT_RSVD: origin = 0x000002, length = 0x0001AF/* Part of M0, BOOT rom will use this for stack */RAMM0: origin = 0x0001B1, length = 0x00024FRAMM1: origin = 0x000400, length = 0x0003F8/* on-chip RAM block M1 */ //RAMM1_RSVD: origin = 0x0007F8, length = 0x000008/* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */RAMD0: origin = 0x00C000, length = 0x000800RAMD1: origin = 0x00C800, length = 0x000800RAMLS0: origin = 0x008000, length = 0x000800RAMLS1: origin = 0x008800, length = 0x000800RAMLS2: origin = 0x009000, length = 0x000800RAMLS3: origin = 0x009800, length = 0x00800RAMLS4: origin = 0x00A000, length = 0x000800 //RAMLS5: origin = 0x00A800, length = 0x000800 //RAMLS6: origin = 0x00B000, length = 0x000800 //RAMLS7: origin = 0x00B800, length = 0x000800RAMLS5_6_7: origin = 0x00A800, length = 0x001800
CLADataLS0: > RAMLS0 CLADataLS1: > RAMLS1 Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW, type=NOINIT CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH, type=NOINIT Cla1ToDmaMsgRAM : > CLA1_DMA_MSGRAM, type=NOINIT DmaToCla1MsgRAM : > DMA_CLA1_MSGRAM, type=NOINIT Cla1DataRam: >> RAMLS0 | RAMLS1
/* CLA specific sections */ #if defined(__TI_EABI__) Cla1Prog: LOAD = FLASH4, // RUN = RAMLS5,RUN = RAMLS5_6_7,LOAD_START(Cla1funcsLoadStart),LOAD_END(Cla1funcsLoadEnd),RUN_START(Cla1funcsRunStart),LOAD_SIZE(Cla1funcsLoadSize),ALIGN(8) #else Cla1Prog:LOAD = FLASH4, // RUN = RAMLS5,RUN = RAMLS5_6_7,LOAD_START(_Cla1funcsLoadStart),LOAD_END(_Cla1funcsLoadEnd),RUN_START(_Cla1funcsRunStart),LOAD_SIZE(_Cla1funcsLoadSize),ALIGN(8) #endif
在cla文件中,我定义了一些功能函数(函数代码是从c28核移植过去的),并在Task1中调用,为什么这些代码会在ClaProg占用这么大空间,同样在c文件调用却没有这么大,不明白ClaProg中代码量是怎么算的,在CCS的内存分配中看到:
Cla1Prog:__claabi_addd(rts2800_fpu64_eabi.lib<addd.cla.obj>) 1904
这个文件就占用了1904个地址,我在cla文件中定义的那些函数,每个函数也就30行左右代码,为什么会占用这么大空间?有没有能缩减代码空间的配置或者其他方法?
请求帮忙解答一下,第一次用CLA,有好多不懂。
Yale Li:
第一个信息显示你为CLA分配的运行空间压根就没有被使用。
load start/end、run start/end分别对应的是什么?
,
TFTMing:
Yale Li 说:第一个信息显示你为CLA分配的运行空间压根就没有被使用。
那个是因为编译器编译时判断运行RAM空间不够,没有编译成功,运行RAM也就没有被分配,所以报错。
Yale Li 说:load start/end、run start/end分别对应的是什么?
这个要怎么看对应的是啥,还不太懂你的意思。
,
Yale Li:
就是你上传的最后一段linker代码中,那些宏对应的具体地址是什么
,
TFTMing:
Yale Li 说:就是你上传的最后一段linker代码中,那些宏对应的具体地址是什么
abs00000cd2Cla1funcsLoadSize000088000Cla1funcsLoadStart00000a800Cla1funcsRunStart 000088cd2Cla1funcsLoadEndabs00000000Cla1ConstLoadSize000008800Cla1ConstLoadStart000008800Cla1ConstRunStart00000ab18Cla1Task100000b45eCla1Task200000b470Cla1Task300000b482Cla1Task400000b494Cla1Task500000b4a6Cla1Task600000b4b8Cla1Task700000b4caCla1Task8000088cd2Cla1funcsLoadEnd我在cla上用了双精度浮点型,发现cla调用rts2800_fpu64_eabi.lib库才导致代码空间变大,取消双精度浮点型后就没有了,但是经过测试发现在cla中一个简单的赋值语句都占用了40多个字节。