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.

[参考译文] 编译器/CCStudio-Sitara:堆增加二进制文件。

Guru**** 2581345 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/599828/compiler-ccstudio-sitara-heap-increase-the-binary-file

部件号:CCStudio-Sitara
“Thread:SysBIOS”中讨论的其它部件

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

您好,

我的配置如下:

- Sitara ARM3359
-Code Composer Studio版本CCS 7.1 .........0
-SYS/BIOS 6.45 .01.29 实时操作系统
- XDC工具3.32。00.06
-编译器GNU v 4.9 3 (Linaro)
-- SysBIOS SDK 2.1 .3.2

*为了监视信息,我将数据存储在由new()指令分配的数组中(此大小:0x100万字节)。

如您所知,new()指令在堆段中分配对象。

*我创建一个包含多个部分的平台,其中包括堆的部分:DDR3Heap部分(RAM末尾的0x8100万):

*在am335x_app.cfg文件中,我使用以下指令初始化堆:

bios.heapSize = 0x100万;

bios.heapSection ="systemHeap";
Program.sectMap["systemHeap"]="DDR3Heap";

 

*可以在映射文件中看到结果:

系统堆    0x8100万 0x100万 D:\projects\Pilotage\6_Products\CNumDsp2015\src\AxisDriver\AM335x_debug\configPkg\package\config\AM335x_app_pa8fg.oa8fg.
               0x8100万               ti_SysBIOS_States_HeapMem_Instance_State_0_buf__A

*我的问题是生成的二进制文件(AxisDriver_SPI.bin)的大小异常增加(34 MB而不是900Kb)。

经过多次试验后,我发现此大小取决于:

- DDR3Slow结束和DDR3Heap开始之间的偏移(0x8001000000 -(0x800E5000+ 0x9000))。

-DDR3Heap部分的大小(0x100万)。

我用这个文件来编程Sitara,不可能对它进行编程,使它变慢。

我不明白为什么在数据空间(平台窗口)中配置的堆 会影响二进制文件。

是否有强制链接程序从链接程序映射中删除DDr3Heap部分的选项?

感谢你的帮助。

JMV

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

    在平台中删除DDR3Heap。

     

    在.cfg文件中,我尝试使用以下代码:

    Program.sectMap["systemHeap"].loadAddress = 0x8100万;

    但我有一个编译错误...

    您知道语法吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    也可以更轻松地在静态变量中保留数组并将其分配给DDR3Spy部分:

    在spy.cpp文件中:
    Int32 m_spyData[0x10万]__attribute__(section("spy_data"));

    在.cmd文件中:
    spy_data:

    。 =对齐(4);

    *(spy_data*)

    }> DDR3Spy

    在Platform (平台)窗口中:我在RAM的末尾添加了DDRSpy部分。

    结果是相同的,文件大小为16MB。

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

    请查看 此论坛主题中的讨论 是否有用。

    谢谢,此致,

    -George

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

    感谢您的回答。


    对于“孔”,可以,那么在二进制文件中包含.bss段是否是正常的通信?

    如果我增加DDR3段的大小,并在静态变量中声明spy阵列,则阵列保留在.bss段中。

    静态内部32 m_spyData[SPYDATASIZE];


    我可以在映射文件中看到区域:


    .bss 0x8007b048    0x0     ./Axis/CommonInterface/commonInterface.o

    .bss 0x8007b048    0x100万   ./Axis/ConInterface/spy.o

    .bss 0x8107b048    0x0     ./Axis/Filters/cFilter.o

     

    注意使用CCS3编写器的旧项目中,我有相同的代码。 如果我尝试将数组的大小从8万减少到80整数,则.out文件的大小会更改。

    对于const 数组,将数据包含在二进制/输出文件中是有用的,也是相关的,但 对于变量,实用程序是什么?

    在我看来,二进制文件只包含要在闪存中编程的代码,而不是?。

    JM

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    也许,如果我删除零init (将变量初始化为零),链接程序不会重新复制.bin文件中的.bss段?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    调查后,如果我不使用平台中的部分,则问题不会出现。
    只有一个部分:DDR3,这是可以的。 如何强制链接器忽略datas部分?

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

    我可以解释几件事。  但最后我不能告诉你如何解决你的问题。

    Jean-Michel Vignolles 说:
    对于"洞",那么在二进制文件中包含.bss段是否正常?[/QUOT]

    如果初始化的部分存在于其任意一侧,则为yes。  如果所有已初始化的部分都在它之前或之后,则实际上会忽略它。

    Jean-Michel Vignolles 说:
    二进制文件仅包含要在闪存中编程的代码,否?.[/QUOT]

    二进制文件通常用于对闪存进行编程。  但它们不只包含已初始化的部分。  

    如果内存映射中有一个孔,在初始化的部分之间,二进制文件有一种方法来表示该孔:用0填充。  引入此类孔的一种方法是将未初始化的部分(如.bss)放置在初始化的部分之间。  

    概括地说,解决方案是避免(或尽量减少)内存映射中出现漏洞。  在 我前面提到的另一个螺纹中,使用一种精心设计的技术来避免钻孔。  已初始化的问题部分分配两次。  一次用于装载,一次用于运行。  负载分配位于所有其他已初始化的部分旁边。  运行分配是执行所需的位置。  系统启动时采取的步骤之一是将此部分从加载地址复制到运行地址。

    您需要执行类似的操作。  很抱歉,我对您的系统或TI-RTOS不熟悉,因此无法提供任何具体建议。

    谢谢,此致,

    -George

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

    您好,George,

    感谢您的帮助和解释。

    我没有足够的时间寻找解决办法。

    我生成了一些部分来隔离合理的安全代码。

    我已经压缩了所有部分,现在没问题,部分会导致问题。  对于我的新添加,另一种方法是使用CRC/hashtable观察代码的完整性。

    祝你度过美好的一天!

    JM