工具/软件:TI C/C++编译器
我再次遇到奇怪的行为...
我使用的是旧版 C2000编译器 TI v6.2.8。
我使用 DATA_SECTION pragma 将两个结构设置为 CLARAM 区域、以便在 CPU 和 CLA 之间进行数据交换。
我将 CPURAM 中的数据复制到 CLARAM 中的结构成员。
但没有复制结构的一个菜单。
C 源代码如下所示。
[源]
#pragma DATA_SECTION (RD_CPU1、"CLARAM");
#pragma DATA_SECTION (wr_CPU1、"CLARAM");
WR_CPU1.menber11 = A;
WR_CPU1.menber14 = B;
WR_CPU1.menber19 = C;
WR_CPU1.menber13 = D;
这是非常简单的代码、但复制到 member19失败。 我检查了汇编代码。
[汇编源文件]
MOV PL、_A
MOV T、_B
MOV PH、_D
MOV AH、_C
(笑声)
MOVW DP、#_wr_CPU1+11
MOV @电源 CPU1+11、P
MOV @电源 CPU1+14、T
MOV @电源 CPU1+19、AH
MOVH @电源 CPU1+13、P
(笑声)
这看起来也是正确的、但工作不正确。
因此、我使用 CCS 调试在插入器件上逐步执行汇编代码。
当时、我在"Disassembly"视图中找到了该异常的原因。
[反汇编视图]
00b611: 761F020F MOVW DP、#0x20f
00b613: 3F39 MOV @0x39、P
00b614: 213C MOV @0x3c、T
00b615: 9701 MOV @0x1、AH
00b616: 573B MOVH @0x3b、P
Member19的结构顶部有一个偏移19字。
但在上面的代码中、member19的偏移为1。
其他成员的偏移也是错误的。
执行代码上面的第00b615行的结果、_rd_CPU1.member1被 AH 的内容覆盖。
我在 CCS 表达式视图中检查了.map 文件和结构的绝对地址。
[映射文件]
000083c0 20f (000083c0) _rd_CPU1
000083ee 20f (000083c0) _wr_CPU1
[表达式]
WR_CPU1.member11... 地址0x000083F9@数据
WR_CPU1.member13... 地址0x000083FB@数据
WR_CPU1.member14... 地址0x000083FC@数据
WR_CPU1.member19... 地址0x00008401@数据
CLARAM 处的 structure wr_CPU1可能不是数据页的顶部、因此 C2000编译器错误地从结构顶部进行偏移消除。
这导致了 C2000 CPU 内核与 CLA 内核之间的架构差异、即是否使用 DP 寄存器访问存储器。
旧编译器的这个已知错误吗?
是否有办法避免这种情况?