Thread 中讨论的其他器件:SysConfig、 C2000WARE
工具/软件:
我定义了一个变量
static uint16_t myvar = 0;
我需要这个变量位于共享 ram (RAM_GS) 中
因此、我在 SysConfig 中添加了一个名为 LOCAL_RAM_GS 的用户节、在 CMD 文件中将这一行指定给该行
LOCAL_RAM_GS { } > RAM_GS
并向变量声明中添加了一个 pragma、看起来像这样。
#pragma DATA_SECTION( myvar, "LOCAL_RAM_GS" ) static bq_size_t myvar = 0;
一切都很好,直到我开始得到 ITRAP 例外。
我使用调试器发现另一个模块中 ramfunction 的第一个字节已被零覆盖 (ITRAP0)。
我的调查结果:
链接器为此变量分配 1 个字节、与映射文件中的这些片段一致
GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name
page address name
---- ------- ----
0 00011774 foo_readData 00091204
0 00011770 foo_sendData 00091200
0 00088c0d bar_sendData
zoo.obj
Run/Load
Value Binding Name (Section)
-------- -------- ---------------
0009017d global Isr_IpcFlag0 (.text:retain)
0001176f local LOCAL_RAM_GS (LOCAL_RAM_GS)
00015980 local other_var (.bss)
...
0001176f local myvar (LOCAL_RAM_GS)
LINKER GENERATED COPY TABLES
__TI_cinit_table @ 0009432c records: 6, size/record: 4, table size: 24
.data: load addr=00093e10, load size=00000500 bytes, run addr=00015992, run size=00002d61 bytes, compression=lzss
LOCAL_RAM_GS: load addr=00094316, load size=00000005 bytes, run addr=0001176f, run size=00000001 bytes, compression=copy
...
binit @ 00094348 records: 4, size/record: 6, table size: 26
...
FOO_OBJ_TO_RAM: load addr=00091200, load size=0000010a, run addr=00011770, run size=0000010a, compression=none
...
因此、`myvar`应置于 0x0001176f、且长度为 1
`foo_sendData`应放置在 0x00011770
我在使用调试器从存储器读取的实际复制表中找到了`foo_sendData`被覆盖的原因。

来查看我找到的加载地址

`到 32 位、因为这就是 Δ___TI_auto_init`读取它的方式

`Handler_Table`是` TI_idx`的 idx、此 idx 指向 Δ__TI_decompress_none
第二个字是计数、通过`m __TI_decompress_none`传递到` emcpy`。 在这里、我发现一个“2",“,而、而不是映射文件中所示的 1。
这意味着 `__TI_decompress_none`->`memcpy`将写入地址 0x0001176f 和 0x00011770
0x00011770 是 foo_sendData 函数的第一个字节。
我尝试更改了用户段的配置、但在 SysConfig 中、我只能找到启用.align (2) 的选项、根据我的了解链接器手册、我需要使用.palign (2) 来确保为这种情况分配足够的存储器。
在一个短期的解决方案中、我看到如果我设置.align (2) 属性、它会将`myvar`放在后面有一个空洞。 但这很可能只是因为`myvar`之后的夹头也对齐了。 换言之、这是一个非常临时的解决办法。
请提供建议。
编辑:
几乎忘记了使用的工具版本:
Code Composer Studio 版本:12.8.1.00005