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.

[参考译文] TMS320F28388D:与 CLA 和 CPU 之间的通信/共享数据有关的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1347307/tms320f28388d-question-concerning-the-comunication-shared-data-between-cla-and-cpu

器件型号:TMS320F28388D
您好!

我对我的 CPU 和 CLA 代码中使用的共享变量有一个问题。

我在头文件中定义这些共享变量、该文件包含在我的 CPU 和 CLA 文件中。 不过、 CPU 和 CLA 之间的指针解释方式并不一致。

CLA 将指针解释为16位、而 CPU 将指针解释为22位。 这使我考虑填充 CPU 和 CLA 所使用的指针。

我的主要疑问是、我是否需要填充 CPU 和 CLA 之间共享的每个指针?


此外、CLA 将变量解释为32位、并且不会识别16位变量。 这是否意味着 CLA 和 CPU 之间共享的每个变量的大小至少需要为32位?

最后、我希望能够澄清数据类型是否size_t可以在 CLA 上安全使用。 我的理解是 CPU 会将size_t其解释为16位、而 CLA 会将其解释为32位。

感谢您的帮助。

此致、

维尔科

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

    尊敬的 Wilko:

    您要将这些变量放在 CPU/CLA 共享存储器的什么位置? MSGRAM 中还是 CLA 至 CPU MSGRAM 中?

    此致、

    德拉尼

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

    尊敬的 Delaney:

    我们联合了 RAMLS0和 RAMLS1、并将其称为存储器 CLA_CPU_SHARED。 为此、我们已将"MSEL_LSx"设置为"01"、并将"CLAPGM_LSx"设置为"0"。

    我们将其用于 CPU 和 CLA 都需要读取和写入的数据。

    CPUToCla1MsgRam 用于 CLA 仅需读取的数据。

    如果我尝试进一步澄清我不确定的信息、可能会有所帮助。

    https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/faq.html#how-is-data-shared-between-the-cla-and-c28x
    在上述4.6下的链接中、介绍了 CPU 和 CLA 之间的数据类型如何不同。

    该链接提到指针需要按照我的原始文章中所述进行填充。  我要进行的这种填充需要针对错误指针进行、错误指针由 CLA 和 CPU 共享。

    4.6中介绍的第二部分是数据类型的大小。 在我的理解中、CLA 仅使用32位数据类型。

    但阅读本文后、我不确定是否可以在共享存储器中使用 uint16_t 变量。 CLA 是否"理解",变量的大小只有一半?

    我对 size_t 的独特之处与之非常相似。 我有一个由 CPU 以及 CLA 调用的函数"doublebuffer"、我不确定 size_t 是否得到了正确解释。

    此致、

    维尔科

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

    P.S.我刚刚发现以下:" CLA 代码不能调用 C28x 函数"

    http://downloads.ti.com/docs/esd/SPRU514/#viewer?document=%257B%2522href%2522%253A%2522%252Fdocs%252Fesd%252FSPRU514%2522%257D&url=c-language-restrictions-spru5144314.html%23SPRU5144314

    这是否意味着我不能在 CLA 和 CPU 中使用相同的函数?

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

    尊敬的 Wilko:

    明白了、感谢您进行了澄清。 以下是您的问题的答案:

    • 正确、对于需要使用/理解的每个指针来通过 CPU 和 CLA 引用相同的地址、都需要进行这种填充。 您可以使用您创建的 CLA_fptr 联合体来定义所有这些指针。
    • 虽然 CLA 架构是为32位变量设计的、但它仍然可以"识别"内存中的16位变量。 uint16_t例如、当为 CLA 编译变量时、它会转换为unsigned short C 标准语言的变量、该变量以16位的形式存储在存储器中物理存储。 这些 typedef 转换可以在 stdint.h 文件中的代码中看到 #if defined(__TMS320C28XX_CLA__) [shown below]。 也就是说、如果编译器为 CLA 进行编译、那么unit16_t源代码中的变量会转换为unsigned short C 语言中的类型、而会转换为unsigned int C28x 的 IF 编译。
    • 当 CLA 对该变量进行计算时、处理器必须对16位数据执行符号扩展、从而产生额外的开销(与将变量存储在32位存储器中不需要符号扩展不同)。 所以,是的, CLA 会明白,这个变量只引用存储器中的16位,你应该看到使用没有问题uint16_t.  
    • 同样、如果您在 stddef.h 文件中查看size_t typedef 的定义位置、可以看到没有根据代码是为 CLA 还是 C28x 编译的单独定义、这意味着它在两种处理器上都具有相同的含义。
    • 可以在 CLA 和 C28x 之间共享和使用函数(同名)、只要它们是 内联 并放置在 CLA_CPU_shared 存储器中。 对于内联函数、编译器将直接用函数内容替换 CLA 和 C28x 源代码中的函数调用、因此实际上不会使用函数名称、这就是这不会导致任何形式冲突的原因。

    如果您有任何其他问题、请告诉我。 另外一个非常有用的资源是 TMS320C28x 优化 C/C++编译器 v22.6.0.LTS 用户指南(修订版 Z) 、供您了解更多信息。

    此致、

    德拉尼