目前我的项目用的是28035芯片,因开发需要增加功能,增加代码后发现.EBSS内存空间不够用了,更改前CMD文件和更改后CMD文件见附件,更改CMD文件后程序编译正常,但实际运行时程序中好多变量的值却不对了。请问Ti工程师帮忙分析一下。目前.EBSS段分配到两个RAM区,且这两个RAM地址不连续,不认怀疑是地址不连续造成的。
cmd.zip
naughty boy:
纠正:目前我的项目用的是28035芯片,因开发需要增加功能,增加代码后发现.EBSS内存空间不够用了,更改前CMD文件和更改后CMD文件见附件,更改CMD文件后程序编译正常,但实际运行时程序中好多变量的值却不对了。请问Ti工程师帮忙分析一下。目前.EBSS段分配到两个RAM区,且这两个RAM地址不连续,个人怀疑是地址不连续造成的
Susan Yang:
Contiguous SARAM memory blocks can be combined if required to create a larger memory block.
您现在的 dataRAM: origin = 0x008000, length = 0x001000/* data RAM (L0-L2) */dataRAM1: origin = 0x3F8000, length = 0x000800
是不连续的,所以下面的语句不能成功combine
.ebss: >> dataRAM1|dataRAM,PAGE = 1在下面的帖子中提到了一种方法,您可以参考一下
e2e.ti.com/…/284770
naughty boy:
回复 Susan Yang:
那是否可以将FLASHH区作为RAM,将。ebss链接到H区
Susan Yang:
回复 naughty boy:
不可以的,需要在同一个page
naughty boy:
回复 Susan Yang:
我看了一下memory mapsL0 SARAM、L1DPSARAM、L2DPSARAM和L3DPSARAM的地址是连续,这就需要.ebss占用一部分L3 DPSARAM,但程序中使用CLA功能如果把CLAPROG起始指定为0x9000以外的地址是否可以,我试着将CLAPROG的起始地址改为0x9800,编译也没有错误,但CLA似乎不运行了,还有别的解决方法吗?
naughty boy:
回复 Susan Yang:
ti工程师我的问题还没有解决麻烦您回复一下
naughty boy:
回复 Susan Yang:
我按照链接上的方法试了一下,利用data_section将程序中大的数组指定到另一个ram区但运行时发现,程序中用到data_scetion指定的数据数组时,数据就会出错,请问是什么原因
Susan Yang:
回复 naughty boy:
很抱歉,漏掉了您的回复
https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/284770?28035-linker-file-problem-no-sufficient-memory-space-for-ebss
链接中提到了下面的方法
main.c:
volatile int x [64];volatile int y [64];void main(void){}
如果将y [64]的声明移动到另一个源文件(例如foo.c),则链接器将沿对象模块边界拆分.ebss节,并将其放入指定的内存中。生成的.map文件显示了拆分为两个不同的.ebss节
还有一种是使用#pragma DATA_SECTION
把变量放在一个特定的空间内,其中data_section是针对数据空间的,具体的使用办法是
#pragma DATA_SECTION(bufferB, ”my_sect”)char bufferB[512];
在.cmd文件中建立对应的section就可以使用了.
具体您可以看一下 6.10.7 The DATA_SECTION Pragma
https://www.ti.com/lit/ug/spru514t/spru514t.pdf
能给出您是如何在c文件以及cmd文件定义的吗?
naughty boy:
回复 Susan Yang:
我将我的C文件部分代码和cmd文件传至附件,我发现每当数据错误时只要注释掉一个DATAsection语句就可以解决,我怀疑还是CMD文件RAM 内存分配问题,我的项目使用了CLA功能我将RANL3的一部分分配给了CLA的代码指令,另一部分分配给了.cio和.sysmem
.bss_cla .scratchpadcmd文件.zip