This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS320F2.8035万:使用7.2 的TMS320F2803x中RAM的自动分段

Guru**** 2595805 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/623333/compiler-tms320f28035-automatic-section-splitting-for-ram-in-tms320f2803x-with-ccs7-2

部件号:TMS320F2.8035万

工具/软件:TI C/C++编译器

大家好,

我的一位客户将CCS与TMS320F2.8035万一起用于他的太阳能电网连接逆变器应用,他正在寻找将多个非连续SRAM部分组合用于数据RAM,即.ebss,因为他的RAM使用率正在增加。 我已经浏览了spru513n部分的8.5 .5.6 和spraa46a.pdf,以便通过CCS自动拆分部分和分配。 因此,我已在7.2 中导入了默认的Example_2.8035万_Flash,并完成了以下更改:

在example_2803xFlash.c中,我声明了两个阵列,总计1200字节(两个阵列,因此一个阵列可以适合于一个部分,因为我的一个部分RAML2/RAMM1在TMS320F2.8035万中为1024字节)。

unsigned char Tempdata[400];

unsigned char Tempdata1[800];

 

现在,我将2.8035万.cmd更改如下:

.ebss              :{*(.ebss)}>>(RAML2| RAMM1)      page =1.

 

但此示例尚未编译,并给出如下错误:

________________________________________________________________

>>编译失败
Makefile:151:目标'Example_2.8035万_Flash.Out的配方失败
"../F2.8035万.cmd",第136行:错误:程序将不适合可用内存。
对于尺寸为0x52c的区域".ebss",使用对齐/阻塞的照射行程放置失败
第1页。 可用内存范围:
RAML2大小:0x400未使用:0x3f8最大孔:0x3f8
RAMM1大小:0x400未使用:0x400最大孔:0x400
.ebss:{*(.ebss)}>>(RAML2| RAMM1) page =1.
错误:链接期间遇到错误;未生成"Example_2.8035万_Flash.out
gmake:***[example_2.8035万_Flash.Out ]错误1
gmake:由于错误,目标'all'没有重制。

****构建已完成****

________________________________________________________________

我已与团队讨论过此问题,收到以下反馈:

给定文件或.obj中的所有全局变量都试图仅适合单个RAM块(即使同一文件中可能有多个变量)。

我可以理解,一个数组应该完全填写在一个部分中,但一个obj文件/one c文件只适合在一个部分中,这对许多客户来说可能是不能接受的。许多客户在单个文件中工作/在一个文件中可能创建一些特定的工作 问题。  

 请告知我应该执行什么设置来使CCS自动拆分.ebss部分,以便安装在不同 的非连续SRAM部分中。

此致,

Vikas Chola

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不确定,但这些数组定义似乎很可能...

    [报价用户="Vikas Chola"]

    unsigned char Tempdata[400];

    unsigned char Tempdata1[800];

    [/引述]

    ...出现在一个文件中。  这意味着它们位于大小为1200 (0x480)的一个输入部分中。  自动分节拆分不能拆分输入分节。  它只能在输入部分边界上拆分输出部分。  由于您的内存范围为1024 (0x400),因此无法分配此输入部分。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,George,

    我无法理解您在输入部分的含义... 我定义了两个彼此独立的阵列,因此它应该安装在由cmd文件声明的RAM中。 我从>>运算符中了解到,它将分割该部分,如.text,.ebss等... 因此,我的.ebss部分应查找RAM空间,以便分别容纳两个阵列。  由于这两个组合的数组是两个独立的数组,因此CCS/compiler不应为这两个组合的数组寻找空间。

    假设客户正在为其整个应用程序处理一个文件,那么在这种情况下,对于当前的CCS实施,编译器将只选择  SRAM的一个部分(可能是最大的部分),因此有效有用的RAM将减少,或者客户必须使用#pragma分配一些变量。 请调查此事,并建议我们是否可以做得更好....

    此致,

    Vikas Chola

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vikas Chola 说:
    我无法理解输入部分中您的含义[/QUOT]

    请从文章 链接器命令文件入门中的第一部分了解术语输入部分和输出部分。   

    Vikas Chola 说:
    我定义了两个彼此独立的阵列,因此应该将其安装在由cmd文件声明的RAM中。

    不正确。  由于这些数组定义位于同一文件中,因此它们位于同一个输入部分,因此无法拆分输入部分。

    解决方法是将这些数组放在单独的输入部分中。  一种方法是将它们放在不同的文件中。  这可能不切实际或不方便。  另一种方法是使用变量属性部分...

    unsigned char Tempdata[400]
    __attribute__((section(".ebss:Tempdata"));
    unsigned char Tempdata1[800]__attribute__
    ((section(".ebss:Tempdata1")); 

    如果您愿意,可以使用data_sectionpragma执行类似的操作。  这些属性将每个数组放入.ebss的子节中,名称如图所示。  尽管它们是.ebss的子节,但它仍被视为单独的输入节。  如果链接程序命令文件更改为not split .ebss,则不需要更改此代码。  这些小节将与其它.ebss输入部分组合,形成.ebss输出部分。

    谢谢,此致,

    -George