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.

[参考译文] 编译器/TMS320F28375D:旧编译器的这个已知错误吗?

Guru**** 2422790 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/791861/compiler-tms320f28375d-is-this-known-bug-of-old-compiler

器件型号:TMS320F28375D

工具/软件: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 寄存器访问存储器。

旧编译器的这个已知错误吗?
是否有办法避免这种情况?

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

    这是一个已知问题。  CLA 和 C28x CPU 之间共享的所有数据必须在 C 或 C++代码中定义、而不是 CLA 代码中定义。  有关更多背景信息、请参阅 此论坛主题

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想严格了解 CLA 代码的定义。 代码是否列在.cla 文件中? 还是在 LSxRAM 中放置的代码?
    2.这项限制在哪里? 我如何知道这些信息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请详细说明导致此问题的条件。
    只有 CLA 代码中定义的结构? 还是包含数组、多字节变量(long long、long double 等)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="user3941789"]我想严格了解 CLA 代码的定义。

    在.cla 文件中写入的代码。

    [引用 user="user3941789"]此限制规定在哪里?

    我们应该向你道歉。  我们尚未将此限制添加到我们的文档中。 我在 SDOWP 系统中提交了条目 CodeGen-6160、以更新文档。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。

    谢谢、此致、

    乔治

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

    [引用 user="user3941789">请详细说明导致此问题的条件。
    只有 CLA 代码中定义的结构? 还是包含数组、多字节变量(long long、long double 等)?

    CLA 和 C28x CPU 之间共享的所有数据必须在 C (或 C++)代码中定义、而不是在 CLA 代码中定义。   

    谢谢、此致、

    乔治