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.

[参考译文] 编译器/EVMK2H:为什么C6000 v 8.2 ™︎2编译器会截断对象的大小>=512MB?

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

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/646784/compiler-evmk2h-why-does-the-c6000-v8-2-2-compiler-truncate-the-size-of-objects-512mbyte

部件号:EVMK2H

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

当使用C6000编译器v 8.2 时,在SYS/BIOS .cfg文件中为C66内核编译SYS/BIOS 6.50 .1.12 程序时,尝试将堆大小设置为以下值,这将使用大部分的2GB区域:

bios.heapSize = 0x7fe0万; 

这将使SYS/BIOS生成以下阵列,为SYS/BIOS生成的configPkg/package/cfg/<project_name>_pe66.c源文件中的堆分配空间:

/*--> ti_SysBIOS_States_HeapMem_Instance_0_buf__a */
__t1_ti_SysBIOS_States_HeapMem_Instance_State__buf ti_SysBIOS_States_HeapMem_Instance_Instance_State_0_buf_a_2145386496]; 

编译程序时未生成警告,但查看映射文件时,堆数组的大小被截断为0x1fe0万字节,而不是源文件中指定的大小0x7fe0万:

远 08000000000 1fe00c08 未初始化
800万 1fe0万 (.common:ti_SysBIOS_States_HeapMem_Instance_0_Buf_A)
9{0万,0.08万 66AK2H14_C66_max_SysBIOS_heap_size_pe66.oe66 (_far:taskStackSection)
9fe0.08万 00000200 (.common:xdc_runtime日志Buf_instance_State_0_entryArr__A)
9fe00a0万 0000.02万 (.COMMON:XDC_Runtime_SYSMIN_Module_State_0_outbuf__A)
9fe00c0万 0000.0008万 (.common:parmbuf) 

使用nm --print-size检查目标文件中符号的大小,显示编译器已截断 ti_SysBIOS_States_HeapMem_Instance_State_0_buf_a数组的大小。

我认为此问题是未解决缺陷 SDSCM4.3877万的主题。 C6000编译器是根据设计截断对象>=512 MB的大小,还是一个错误?

 SDSCM4.3877万的标题表明,预期的修复方法是使编译器在对象大小被截断时发出警告,而不是生成请求的对象大小。

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

    这是由于工具的限制造成的。  现有的未结缺陷记录用于发出诊断,并被归类为次要严重级别,因此它仍保留在后备日志中。  我们将再次了解此问题并回复给您。

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

    这是由于工具的限制。

    感谢您提供信息。

    我发现编译器截断用于分配SYS/BIOS堆的数组的限制的一个变通办法是更改.cfg文件,以便以链接程序分配所需空间的不同方式分配SYS/BIOS:

    /*
    *创建使用大多数2GB DDR3区域的堆。
    *
    *堆是通过让链接器分配所需空间来创建的,
    *因为简单地设置BIOS.heapSize会导致使用C数组分配空间。
    *从C6000编译器v 8.2 2开始,工具的限制是C数组的大小被截断
    *为最不重要的29位(SDSCM4.3877万)
    */
    var heapSize = 0x7fe0万;
    Program.sectMap[".sysmem: align="+ Memory.getMaxDefaultTypeAlignMeta()+",type=NOINIT {__primary_heap_start__。 ++"+ heapSize +";__primary_heap_end__=.;}"]="DDR3";
    
    var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    HeapMem.primaryHeapBaseAddr ="&__primary_heap_start_";
    HeapMem.primaryHeapParAddr ="&__primary_Heapams.mem
    
    
    heapMemParams.usePrimaryHeap =
    
    Memory.defaultHeapInstance;Heapheappheams_ 

    如果将BIOS.heapSize设置为大于=512 MB的值,则可能可以将C6000的SYS/BIOS堆分配更改为绕过工具对最大对象大小的限制。

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

    我已升级CodeGen-449的优先级,当 大小为256 MB 或更大的对象被截断时发出警告消息,以便在活动分支上作为错误修复实施。  我还提交了一个增强请求CodeGen-4042,以添加对大小为256 MB +的对象分配的支持。   

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

    CodeGen-449已解决。  现在,如果遇到大小为512 MB 或更大的对象,编译器将发出错误。  程序将不会编译。  增强记录仍处于开放状态;我们希望在未来增加对更大物体尺寸的支持。

    谢谢!

    Anna

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

    CodeGen-449已解决。  如果遇到大小为512 MB 或更大的对象,编译器现在将发出错误。

    使用C6000编译器v 8.1 6 (包含 CodeGen-449的修复程序),我尝试编译大小为512 MB的对象:

    __t1_ti_SysBIOS_States_HeapMem_Instance_State__buf ti_SysBIOS_States_HeapMem_Instance_0_buf__A[5.36870912亿]; 

    __t1_ti_SysBIOS_States_HeapMem_Instance_State__buf属于char类型。

    这会产生预期的编译器错误,但最初由于错误消息中的大小大于对象大小(以字节为单位)而感到困惑:

    [报价]"C:/ti/bios_6_50_01_12/packages/ti/SysBIOS/sapMem.h",第90行(列 18):错误:对象大小4294967296大于支持的最大大小4294967295[/QUOT]

    报告的对象大小似乎以位而不是字节为单位,但错误消息并未明确说明这一点。 也许可以澄清错误信息。

    代码生成工具将对象的大小作为32位变量中的位数,这是否是对象大小限制的根本原因?

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

    是的,其大小以位为单位进行报告,是的,其根本原因是内部表示的遗留问题。  我们有一个单独的开放式增强功能,可为新版本修复此问题。