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.

[参考译文] 编译器/DK-TM4C129X:有什么方法可以最大化堆大小?

Guru**** 2537270 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/676981/compiler-dk-tm4c129x-any-way-to-maximize-the-heap-size

器件型号:DK-TM4C129X

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

我使用 CCS 8.0.0.00016在 DK-TM4C129X 开发套件上开发代码。 我想知道是否有任何方法可以告诉链接器将所有剩余的内部 RAM 分配给堆、而不必指定绝对大小。 例如、类似"-heap_size=MAX"的内容。 需要检查映射文件以确定可用 RAM、然后更新堆大小选项有点困难。

此致、

Dave

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

    [引用 user="Dave Hohl"]我想知道是否有任何方法可以告诉链接器将所有剩余的内部 RAM 分配给堆、而不必指定绝对大小。

    不幸的是、不

    谢谢、此致、

    乔治

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

    [引用 user="Dave Hohl"]我想知道是否有任何方法可以告诉链接器将所有剩余的内部 RAM 分配给堆、而不必指定绝对大小。我找不到任何正式的记录方法来执行该操作、 但是、作为一个实验、使用 TI ARM v18.1.1对 TM4C129NCPDT 项目进行了以下更改:

    a)在项目属性中将--heap_size 选项设置为零。

    b)在链接器命令文件中、将单个段放置替换为一个组:

    部分
    {
    .intvecs:> 0x00000000
    .text:> FLASH
    .const:> FLASH
    .cinit:>闪存
    .pinit:> FLASH
    init_array:> FLASH
    
    .vtable:>0x20000000
    组:> SRAM
    {
    .data
    .bss
    堆栈
    .sysmem:
    {
    __SYSMEM_SIZE =结束(SRAM)-;}
    
    }
    

    该组将.sysmem 放置在 SRAM 的末尾、并且对 _SYSMEM_SIZE 的分配会覆盖链接器设置、以告知运行时库堆占用 SRAM 中的所有上部未使用空间。

    链接器映射文件显示以下段分配:

    段分配映射
    
    运行原点加载原点长度初始化长度对成员有吸引力
    --- ------ ------ ------ ---- ----
    00000000 00000000 00007948 00007948 r-x
    00000000 00000208 00000208 r-.intvecs
    00000208 00000208 000073f0 000073f0 r-x .text
    000075f8 000075f8 000002b2 000002b2 r-.const
    000078b0 000078b0 000078b0 000098- 00000098- .cinit
    20000000 20000000 00000bd0 00000000 rw-
    20000000 00000 000001f4 00000000 rw-.data
    200001f4 200001f4 000001cf 00000000 rw-.bss
    200008 200003cRW 8 00000800 00000000 -.stack
    20000bc8 20000bc8 00000008 00000008 00000003c0008 00000008 000000000000008 00000003cw 

    以及运行时库中的 memory.c 文件用于获取堆大小的__SYSMEM_size 符号的设置:

    0003f438 __SYSMEM_SIZE 

    在我测试时,这些更改显示 memory.c 确实看到一个堆占用了0x20000bc8中的可用 SRAM 空间... 0x2003ffff。

    但是、这会产生以下警告:

    说明重新
    定义资源路径位置类型#10190-D 绝对符号"__SYSMEM_SIZE"tm4c1294ncpdt.cmd/TM4C_READ_ROM_symbols行46C/C++问题 

    因此、在某些情况下、它可能会中断。

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

    此致、

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

    感谢您开展这项调查工作。 很高兴知道、或许可以实现我所要求的目标。 如果 TI 能够向 CCS 中添加此类功能、以便不会出现警告、我们就不需要担心发生故障。

    此致、

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

    [引用用户="Dave Hohl">如果 TI 能够向 CCS 添加此类功能、以便不会出现警告、我们无需担心发生故障。同意 TI 最好为此提出改进、 因为将堆大小调整到最大值似乎是合理的。

    我确实尝试使用 SPC 算术来设置.sysmem 的大小、但这只是导致错误。 虽然表达式可在链接器命令文件中用于设置程序可以引用的符号、但无法引用符号来设置段大小。 例如、尝试以下操作:

    组:> SRAM
    {
    .data
    .bss
    堆栈
    虚拟:
    {
    my_sysmem_start =.;
    }
    .sysmem:
    {
    。 =大小(SRAM)- my_sysmem_start;
    }
    } 

    导致错误:

    [引用]"../tm4c1294ncppdt.cmd"、第50行:错误#10194:符号"my_sysmem_start"在分配值之前在表达式中使用

    链接器 C6000:如何自动将段大小设置为空闲(未分配)存储器? 显示了如何使用链接器命令文件将存储器池大小调整为未使用的存储器、但要利用该文件、需要替换或修改运行时库中的 memory.c、以更改如何确定堆的存储器区域。

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

    谢谢!