器件型号:DK-TM4C129X
工具/软件:TI C/C++编译器
我使用 CCS 8.0.0.00016在 DK-TM4C129X 开发套件上开发代码。 我想知道是否有任何方法可以告诉链接器将所有剩余的内部 RAM 分配给堆、而不必指定绝对大小。 例如、类似"-heap_size=MAX"的内容。 需要检查映射文件以确定可用 RAM、然后更新堆大小选项有点困难。
此致、
Dave
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
工具/软件:TI C/C++编译器
我使用 CCS 8.0.0.00016在 DK-TM4C129X 开发套件上开发代码。 我想知道是否有任何方法可以告诉链接器将所有剩余的内部 RAM 分配给堆、而不必指定绝对大小。 例如、类似"-heap_size=MAX"的内容。 需要检查映射文件以确定可用 RAM、然后更新堆大小选项有点困难。
此致、
Dave
[引用 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 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、以更改如何确定堆的存储器区域。