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.

[参考译文] CCS/TMS320F28335:编译器18.12中 C28x 器件允许的最小堆大小

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/939634/ccs-tms320f28335-minimum-allowable-heap-size-in-compiler-18-12-for-c28x-device

器件型号:TMS320F28335

工具/软件:Code Composer Studio

我正在尝试使用 CCS v7和编译器 v6.2.0将工程移植到默认编译器 v18.12.4.LTS 的 CCS v9.3。  

我们的项目不使用动态内存分配、因此我们将堆大小设置为零。 在编译器 v6.2下、允许使用-heap_size=0指令、并且工程编译时不会出现错误。  

在编译器 v18.12.4.LTS 下、不接受指令--heap_size=0。 错误消息是"ERROR #24011-D:参数到选项-heap (size) is out of range"。

在 C28x 编译器的较新版本中、是否有方法将堆大小设置为零? 如果没有、可接受的最小堆大小是多少?

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

    我无法重现此结果。

    请重建整个项目。  右键点击工程名称、然后选择 Rebuild Project。  在"Console"(不是问题)视图中、将所有构建消息和诊断保存到文本文件中。  使用  Copy Build Log  图标。  命名文件时、请使用扩展名.txt。  将该文本文件附加到下一个帖子。

    谢谢、此致、

    乔治

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

    感谢您的回复、George。 自发布原始问题以来、我继续讨论、问题已发生变化。 我确实发现编译器倾向于"-heap 0"到"-heap=0、这似乎提供了分配零堆空间的所需结果。

    我现在只从链接中获得一个故障、即 undefED __SYSMEM_SIZE。 当我比较6.2.0编译器中的映射文件与 v18.12.4.LTS 时、新编译器下所有主要存储器类别所消耗的 RAM 都比旧编译器少。 我不清楚在何处超出目标 DSP 的资源。 我已经查看了与 UNDEFED __SYSMEM_SIZE 相关的几个现有论坛主题帖,但这些情况似乎不直接适用,例如链接 printf,我们不会这样做。

    遗憾的是、这是一个安全项目、我无法与您共享地图文件、因为担心信息会被未经授权的人所察觉。  如果有用 、下面是一些展示链接结果的扩展代码段。

    "Console"面板中的链接结果:

    构建目标:"XXXXXX.OUT"
    调用:C2000链接器
    "c:/ti/ccs930/ccs/tools/compiler/ti-cgt-c2000_18.12.4.LTS/bin/cl2000 "-v28 -ml -mt ---float_support=fpu32 -O1 -opt_for_speed=2 -define=...  --define=__evaluate_stack_usage__=0 --diag_suppress=10063 --diag_suppress=16002 --diag_warning=225 --display_error_number --auto_inline=0 --asm_listing --src_interlist --gen_opt_info=2 -z -m"XXXXXX.map"---cn/size-size_sections:-0x300_stack_size_s=-ces... --reread_libs --display_error_number --xml_link_info="XXXXXXXX_linkInfo.xml"--entry_point=CsciCodeStart_asm --rom_model -o "./XXXXXX.out"…  "./XXXXXX.obj"

    "C:/.../rts2800_fpu32.lib "C:/.../rts2800_fpu32_fast_supplement.lib -lrts2800_fpu32.lib  


    未定义的首次引用  
    符号  
    ------ --------  
    _SYSMEM_SIZE C:/.../rts2800_fpu32.lib

    错误#10234-D:未解析的符号仍然存在
    错误#10010:链接期间遇到错误;未生成"XXXXXX.OUT"

    >>编译失败
    Makefile:210:目标'XXXXXX.OUT'的配方失败
    gmake:***[XXXXXX.OUT]错误1
    gmake:目标"全部"不会由于错误而重新生成。

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

      以上链接过程生成的映射文件的代码段:

    存储器配置

            名称           源   长度     使用    未使用  的属性   填充
    ------------  ----  ------  ----  ----  --------  
    第0页:
     PROG_RAM_L0          00008000  00000600 000004f6 0000010A RWIX
     PROG_RAM             00008600  00005a00 00005702 000002fe RWIX
     PDIG_RAM             0000fc00  00000300 000002b2 0000004e RWIX
     FLASH_BU1          00300000  00008000 00000000 00008000 RWIX
     FLASH_DEFG           00308000  00020000 00000000 00020000 RWIX
     FLASH_C_BU2          00328000  00008000 00000000 00008000 RWIX
     FLASH_B              00330000  00008000 00000000 00008000 RWIX
     FLASH_A_PRIMARY      00338000  00007f00 00000000 00007f00 RWIX
     Flash_a_loader       0033ff00  000000f1 00000046 000000ab RWIX
     FLASH_A_CRCS         0033ffF1  00000005 00000000 00000005 RWIX
     START_PROGRAM        0033fff6  00000002 00000002 00000000 RWIX
     密码            0033fff8  00000008 00000008 00000000 RWIX
     ADC_CAL              00380080  00000009 00000000 00000009 RWIX
     OTP                  00380400  00000400 00000000 00000400 RWIX
     IQTABLES             003fe000  00000b50 00000000 00000b50 RWIX
     IQTABLES2            003feb50  0000008c 00000000 0000008c RWIX
     FPUTABLES            003febdc  000006a0 000006a0 00000000 RWIX
     Bootrom              003ff27c  00000d44 00000000 00000d44 RWIX
     重置                003fffc0  00000002 00000000 00000002 RWIX

    第1页:
     M0M1SYSTM            00000000  00000140 00000115 0000002b RWIX
     M0M1SARAM            00000140  000006c0 00000680 00000040 RWIX
     DATA_RAM             0000e000  00001c00 00001425 000007db RWIX
     EXTERNALSRAM         00200000  00040000 00000000 00040000 RWIX


    部分分配映射

     输出                                 属性/
    段  页   原点     长度      输入段
    ----  --------   ------   --------
    .zerowaits
    *         0   00008000   000004f6     
                     00008000   00000043    rts2800_fpu32_fast_fincor.lib:sincos_F32.obj (.text)
                     00008043   00000019                                      :div_F32.obj (.text)
                     0000805c   00000200    rts2800_fpu32.lib:vec_newdel.obj (.text)
                     0000825c   000001d3                      :memory.obj (.text)
                     0000842f   00000046                      :boot.obj (.text)
                     00008475   00000020                      :new_.obj (.text)
                     00008495   00000019                      :args_main.obj (.text)
                     000084ae   00000019                      :exit.obj (.text)
                     000084c7   0000000c                      :memset.obj (.text)
                     000084d3   00000009                      :_lock.obj (.text)
                     000084dc   00000005                      :delete.obj (.text)
                     000084e1   00000004                      :memzero.obj (.text)
                     000084e5   00000004                      :pet_virt.obj (.text)
                     000084e9   00000003                      :array_del.obj (.text)
                     000084ec   00000003                      :array_new.obj (.text)
                     000084ef   00000003                      :error.obj (.text)
                     000084f2   00000003                      :memcpy.obj (.text)
                     000084f5   00000001                      :newhandler.obj (.text)

    (笑声)

    .stack    1   00000000   00000100    未初始化
                     00000000   00000100    --孔--

    .sysmem   1   00000114   00000001    未初始化
                     00000114   00000001    rts2800_fpu32.lib:memory.obj (.sysmem)

    fpusysmem
    1            00000100   00000014    未初始化
                     00000100   00000008    rts2800_fpu32.lib:memory.obj (.ebss)
                     00000108   00000004                      :_lock.obj (.ebss)
                     0000010c   00000004                      :exit.obj (.ebss)
                     00000110   00000002                      :vars.obj (.ebss)
                     00000112   00000002                      :vec_newdel.obj (.ebss)

    示例
    1            00000140   00000680    未初始化
                     00000140   00000480    bit.obj (.osstacks)
                     000005c0   00000200    watchdog.obj (.osstacks)

    (笑声)

    不适用  undefED  __SYSMEM_SIZE     

     

    如果您想查看地图的其他部分、请告诉我。

    谢谢!

     

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

    您说您使用了...

    [引用 user="Thomas Cox"]编译器首选"-heap 0"到"-heap=0"、这似乎提供了分配零堆空间的所需结果。

    但是,当我查看您的链接器选项时...

    [引用 user="Thomas Cox"]-z -m"XXXXXX.map"--stack_size=0x300 --warn_sections -i"C:/..." --reread_libs --display_error_number --xml_link_info="XXXXXXXX_linkInfo.xml"--entry_point=CsciCodeStart_asm --rom_model -o "./XXXXXX.out"…  "./XXXXXX.obj "[/QUERP]

    我看不到-heap。  使用此选项会使链接器定义符号__SYSMEM_SIZE。  有关更多详细信息、请在 C28x 汇编工具手册中搜索 标题为 定义堆大小的子章节。  请注意、所有这些选项都是等效的: --heap_size、-heap、--heap

    请告诉我此建议是否解决了问题。

    谢谢、此致、

    乔治

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

    我已检查 CCSv7和 CCSv8项目的项目属性。 在 C2000 Linker / Basic 选项下、尚未设置堆大小、但在 CCSv7和 CCSv9的链接命令文件中设置了堆大小。 从 CCSv7下的编译器 v6.2.0编译成功地定义了__SYSMEM_SIZE。 CCSv9下的编译器 v18.12.4.LTS 失败。 对于 CCv9项目、我在 Project properties /C2000 linker/Basic Options 中将堆大小设置为零。 编译仍然无法定义_SYSMEM_SIZE。

    在 CCSv7和 CCSv9工程的 CCS General 属性下的工程属性中、--ABI 设置为 Legacy COFF、因此内存段约定应遵循 COFF。 有趣的是、这两个编译器都生成.econst 和.ebss 段、并且都生成.sysmem 段。 您可以在上面的映射文件提取中看到 v18.12.4.LTS 生成的.sysmem 段。 在 COFF 下、汇编工具手册指出、该存储器段应命名为.esysmem。 v18.12.LTS 下的故障是什么吗? v6.2.0似乎会生成.sysmem、但很高兴、而 v18.12.4.LTS 会生成.sysmem、在链接时失败。 v18.12.4.LTS 是否需要定义.esysmem?

    链接器如何能够遵循.bss/.ebss 和.const/.econst 的 COFF 约定、但对.sysme/.esysmem 使用 EABI 约定?

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

    不幸的是,我看到的唯一办法是让我重现问题。  我理解您不愿意提交项目。  您是否能够将项目发送给我?  如果是、请按照文章 共享项目中的说明压缩项目。  将鼠标悬停在我的屏幕名称或头像上。 将弹出一个框。 单击 发送私人邮件。 在出现的消息撰写界面中,使用回形针图标附加 zip 文件。

    如果这不实用、也许您可以在一个较小的测试项目中重现问题、您可以将其发送给我吗?

    谢谢、此致、

    乔治

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

    我为我们的 TMS320F28335搜索了一个更简单的现有项目、我可以将其发送给您。 我发现一个相对简单的 RS485和 CAN 通信项目没有专有代码。 当我在 CCS9和编译器 v18.12.4.LTS 下构建它时、它会生成.esysmem、而不是.sysmem、并且它会干净地构建。  

    尽管编译器和链接器选项都指定了--abi=coffabi,但最近移植的未定义__SYSMEM_size 的较大工程的问题似乎与创建.sysmem 而不是.esysmem 有关。

    尽管在项目常规属性中设置了传统 COFF、是否有任何已知的编译器或链接选项可以生成.sysmem?  

    是否有任何已知的编译器错误会产生这种影响?

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

    [引用 user="Thomas Cox]尽管在项目常规属性中设置了传统 COFF、但是否有任何已知的编译器或链接选项可以生成.sysmem?  [/报价]

    否  在版本为18.12.4.LTS 的 COFF 编译的正常映射文件中,链接器映射文件中应包含与以下内容类似的行...

    .esysmem 1 00000000 00000400 未初始化
    00000000 00000004 rts2800_ml.lib:memory.c.obj (.esysmem)
    00000004 000003fc -孔-- 

    在失败的构建中、对于名为.sysmem/或.esysmem 的输出段、您应该在映射文件中看到类似的行。  请将这些行复制并粘贴到您的下一个帖子中。

    [引用 user="Thomas Cox"]是否有任何已知的编译器错误会产生这种影响?

    谢谢、此致、

    乔治

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

    乔治-  

    CcSv7和编译器版本6.2.0生成的映射文件在其映射文件中生成以下内容、并无错误地生成:

    .stack   1  00000000  00000140   未初始化
             00000000  00000140   --孔--
    fpusysmem  
    *      1  00000140  00000014   未初始化
             00000140  00000008   rts2800_fpu32.lib:memory.obj (.ebss)
             00000148  00000004             :_lock.obj (.ebss)
             0000014c  00000004             :exit.obj (.ebss)
             00000150  00000002             :vars.obj (.ebss)
             00000152  00000002             :vec_newdel.obj (.ebss)
    .sysmem  1  00000154  00000001   未初始化
             00000154  00000001   rts2800_fpu32.lib:memory.obj (.sysmem)
    示例  
    *      1  00000180  00000680   未初始化
             00000180  00000480   bit.obj (.osstacks)
             00000600  00000200   watchdog.obj (.osstacks)
    .bss    1  0000e000  00000000   未初始化
    .ebss   1  0000e000  000014ed   未初始化
    。 。 。  
    econst  0  0000d620  00000876    
    。 。 。
    地址   数据页       名称
    ----   --------   ----
    00000000    0 (00000000)   _STACK
    00000148    5 (00000140)   _UNLOCK
    0000014a    5 (00000140)   _lock
    0000014c    5 (00000140)   __TI_clean_ptr
    0000014e    5 (00000140)   __TI_dptors _ptr
    00000150    5 (00000140)   __new_handler
    00000152    5 (00000140)   __array_new_prefix_size
    00000154    5 (00000140)   _sys_memory
    。 。 。
    00000140  __STACK_END
    00000140  __STACK_SIZE
    00000001  __SYSMEM_SIZE
    。 。 。
    移植到 CCSv9和编译器版本18.12.04.LTS 的同一工程的编译会产生以下结果:
    .stack   1  00000000  00000140   未初始化
             00000000  00000140   --孔--
    .sysmem  1  00000154  00000001   未初始化
             00000154  00000001   rts2800_fpu32.lib:memory.obj (.sysmem)
    fpusysmem  
    *      1  00000140  00000014   未初始化
             00000140  00000008   rts2800_fpu32.lib:memory.obj (.ebss)
             00000148  00000004             :_lock.obj (.ebss)
             0000014c  00000004             :exit.obj (.ebss)
             00000150  00000002             :vars.obj (.ebss)
             00000152  00000002             :vec_newdel.obj (.ebss)
    示例  
    *      1  00000180  00000680   未初始化
             00000180  00000480   bit.obj (.osstacks)
             00000600  00000200   watchdog.obj (.osstacks)
    .bss    1  0000e000  00000000   未初始化
    .ebss   1  0000e000  00001425   未初始化
    。 。 。
    .econst  0  0000d546  00000769    
    。 。 。
    地址   数据页       名称
    ----   --------   ----
    00000000    0 (00000000)   _STACK
    00000148    5 (00000140)   _UNLOCK
    0000014a    5 (00000140)   _lock
    0000014c    5 (00000140)   __TI_clean_ptr
    0000014e    5 (00000140)   __TI_dptors _ptr
    00000150    5 (00000140)   __new_handler
    00000152    5 (00000140)   __array_new_prefix_size
    00000154    5 (00000140)   _sys_memory
    。 。 。
    1   00000140 _STACK_END                                         
    ABS  00000140 _STACK_SIZE                                        
    不适用  undefED  __SYSMEM_SIZE      
    两个项目都不会生成.esysmem。
    我无法理解的是 CCS v9工程或这两个工程为什么会生成.sysmem 而不是.esysmem。
    当 CCSv7版本生成.sysmem 而不是.esysmem 时、它如何成功?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想我知道问题的原因。  很抱歉、我之前没有注意到它。  在第二个帖子中,在链接器调用中,是以下内容...

    [引用 user="Thomas Cox"]:C:/.../rts2800_fpu32.lib "C:/.../rts2800_fpu32_fast_supplement.lib -lrts2800_fpu32.lib

    与编译器 RTS 库的链接仅一次。  并确保链接器和 RTS 库来自同一版本的编译器。  在本例中、我怀疑首先提到的 RTS 库来自早期版本的编译器。  请将其删除。

    最佳做法是在链接器调用中生成最后一个参数...

    -l libc.a

    这会告诉链接器自动确定哪个 RTS 库是最佳库。  最后放置意味着将选择任何旨在替换 rts2800_fpu32_fast_f늹 reary.lib 中标准 RTS 函数的函数、而不是编译器 RTS 库中的函数。

    请告诉我此更改是否可以解决问题。

    谢谢、此致、

    乔治

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

    乔治:

    感谢您注意 到 rts2800_fpu32.lib 链接列表中的重复条目

    我删除了与项目一同运行的 rts2800_fpu32.lib 副本。 在 Project Properties/CCS General 中、rts2800_fpu32.lib 在 Runtime support library 下的下拉菜单中指定、我认为这允许链接器使用编译器中的副本。 在 C2000 Linker/FileSearchPath 中还指定了它作为显式包含的库、该库看起来是多余的。 我删除了该内容、并根据您的建议在其位置添加了 libc.a。

    以下是构建的链接部分在控制台中的结果:

    构建目标:"SEU .OUT"
    调用:C2000链接器
    "c:/ti/ccs930/ccs/tools/compiler/ti-cgt-c2000_18.12.4.LTS/bin/cl2000 -v28 -ml -mt --float_support=fpu32 -O1 -opt_for_speed=2 -define=_ACE__-define=_nNo_hw__-define =__手套__offset=__nSAUSAGE__-define =-define MC_ENDLE_PRECT_PRECT_PRECTORS__-GE__-define -GE_END__PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECESD__-ITICESD__-GE__-GE__-GE__-GE__-GE_GE_END__PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_D__-ITICESD__-ITICESD__-ITICESD__-ITECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PRECT_PREC
    (笑声)
    "C://_svn/codebase/branches/NGJ_MC_01_10_CCS9/DSP/DSP/rts2800_fpu32_fast_补 码.lib"-llibc.a

    错误#10008-D:找不到文件"libc.a"

    生成的映射文件没有明显变化。 编译仍会定义.sysmem 而不是.esysmem、并且仍会发生链接错误未定义符号_SYSMEM_SIZE。

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

    专注于修复...

    [引用 user="Thomas Cox"]错误#10008-D:找不到文件"libc.a"

    链接器选项不显示选项 --search_path 的设置。  此选项指示编译器 RTS 库的位置。  下面的屏幕截图显示了典型设置。

    谢谢、此致、

    乔治

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

    您是否解决了此问题?

    [引用 user="Thomas Cox"]错误#10008-D:找不到文件"libc.a"

    构建现在是否正常?

    谢谢、此致、

    乔治

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

    乔治:

    感谢您的提示。 我添加了搜索路径、如您的屏幕截图所示。 该编译现在会找到 libc.a. 但链接失败未定义的符号_SYSMEM_SIZE 仍然会发生。

    Thomas Cox

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

    我将与您私下联系。   

    谢谢、此致、

    乔治

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

    此问题现在通过专用消息处理。  我现在将其标记为已解决、尽管情况并非如此。  最终解决后、我将发布一个简短的摘要。

    谢谢、此致、

    乔治

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

    乔治-

    今天下午、我能够将事情推向更远的距离。 我检查了项目属性、发现它仍在从项目开发中加载库 rts2800_fpu32.lib。 路径。 我将其更改为使用 C:/ti/ccs930/tools/compiler/ti-cgt-c2000_18.12.4.LTS/lib.中的 rts2800_fpu32.lib 该错误现在显示“fatal error #16000:object files have incompatible formats"(致命错误#16000:目标文件格式不兼容)。 如果我尝试 rts2800_fpu32_eabi.lib、我会得到相同的结果。 它会生成相同的错误消息。  

    Thomas Cox

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

    [引用 user="Thomas Cox"]我检查了项目属性,发现它仍在从项目开发中加载库 rts2800_fpu32.lib。 路径。[/报价]

    这不应该发生。  这种情况的细节可能很重要。  这种获取库的方法应该被撤消、因此所做的更改总是来自用于编译工程的编译器。  我建议我们继续通过私人传播来处理细节。

    谢谢、此致、

    乔治