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:IPC 消息 RAM 中 CM 未分离短路的大小与我想象的不同。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/982738/tms320f28388d-the-size-of-unsinged-short-at-cm-in-the-ipc-message-ram-is-different-than-i-thought

器件型号:TMS320F28388D
主题中讨论的其他器件:C2000WARE

尊敬的工程师:

 我正在测试 IPC 的 EtherCAT。 Controlword0x6040定义为无符号短整型、位于 IPC 消息 RAM (0x20082400)中。 但是、在存储器浏览器中、其大小与我想象的不同。 它是32位。 您能告诉我原因吗?

CM 的景色

CPU1视图

此致、

Jeong (jjeon@glentek.com)

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

    [引用用户="Jeong Jote">但是,内存浏览器中的大小与我想象的不同。 它是32位的。我认为问题是 TargetVelocity0x60FF 的 int 类型:

    • 在 C28 CPU1上、int 为16位
    • 在 Cortex-M CM 上、int 为32位

    在 Cortex-M CM 上 、TargetVelocity0x60FF 的起始地址为32位对齐、这会使 CM 上的存储器浏览器产生一种印象、即前面的 Controlword0x6040为32位。

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

    尊敬的 Chester Gillon:

     感谢您的回复!

     如何在 Cortex-M CM 上分配8位或16位的数据类型?

    此致、

    Jeong (jjeon@glentek.com)

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

    [引用用户="Jeong Jote">如何在 Cortex-M CM 上分配8位或16位的数据类型?建议使用中的固定大小类型 和 C28xx 内核的性能。 例如 Int16_t 或 Int32_t

    请注意、虽然中有8位字节 INT8_t / uint8_t 对于 ARM 编译器、由于 C28xx 是16位可寻址的、因此 C2000编译器没有8位类型 。 有关  一些权变措施、请参阅 Unit8和 UINT16 Not Playing Nice。

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

    尊敬的 Chester Gillon:

     感谢您的建议。 我尝试使用 int16_t 分配"Controlword0x6040"、但"Controlword0x6040"的存储器分配了32位、而不是下图中的16位。 我想分配具有16位的存储器。 如果您有其他建议、请告诉我。

    此致、

    Jeong (jjeon@glentek.com)

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

    我附在这里的图。

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

    [引用 user="Jeong Jeon ]]我尝试使用 int16_t 分配"Controlword0x6040"、但"Controlword0x6040"的存储器分配了32位、而不是下图中的16位。[/引用]表达式视图显示 Controlword0x6040是 Cortex-M 上的16位短整型 存储器浏览器未显式给出变量的大小。

     TargetVelocity0x60FF 的类型是什么、您希望它是16位还是32位?

    此外、您能否展示如何在 IPC 消息 RAM 中定义变量?

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

    感谢您的快速回复。

    我按照你的要求附上了几个捕获的数字。 Yon 不需要关心 proto (=extern)。 int32由 int 定义。

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

    [引用用户="Jeong Jote">我在回答您的问题时只附上了几个捕获的数字。 [/引号]OK、Controlword0x6040和 TargetVelocity0x60FF 的定义方式、它们在 Cortex-M CM 和 C28 CPU 上应该具有相同的大小和对齐方式。

    您是否还可以为 Controlword0x6040、TargetVelocity0x60FF、Statuswors0x6041和 PositionActualValue0x6064变量的 ARM 和 C2800编译器发布链接器映射文件的输出?

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

    谢谢你。

    我连接了 ARM 和 C2800的 MAP 输出、如下所示。

    来自 ARM MAP 的输出

    来自 MAP 的 C2800输出

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

    我在 C2800上使用 uint32_t 分配了"Controlword0x6040"、如下所示。

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

    您好!

    我们将邀请 IPC 软件专家对此进行审核并返回。

    谢谢、

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

    尊敬的 Jong Jeon:

    从您共享的快照中、我看到您已将 Controlword0x6040定义为 Int16_t、它应该是 C28x 和 ARM 内核中的16位。

    在表达式窗口中 、Controlword0x6040被列为16位变量。 在存储器浏览器中、我看到您已搜索地址并将该视图设置为32nit Hex、因此您会看到32位值。 您可以将其更改为16位十六进制。

    此致、

    Veena

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

    您好、Veena、

     感谢你的答复。

     我有另一个问题。 我在 CM 上的 Controlword0x6040中输入"1"、从 CPU1的 Controlword0x6040中获取"1"。 没错。 然后、我在 CM 将"1"放置到 TargetVelocity0x60FF、并从 CPU1的 TargetVelocity0x60FF 获取"0x46C0"。 这与我预期的不同。 因此、我认为 CM 上的 Controlword0x6040被分配了32位。 请告诉我您的意见。

    此致、

    Jeong (jjeon@glentek.com)

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

    您好、Jeong、

    您能否详细介绍如何确保 CPU1应用程序中定义的 TargetVelocity0x60FF 和 CM 中具有相同名称的变量使用相同的物理位置。 由于 C28x 和 CM 具有不同的地址空间、 因此 CM 内核上的0x20086000与 CPU1中的0x00038000相同。  

    如果在两个应用中以相同的顺序定义变量、很可能、它们应该得到相同的位置。 但是、在启动期间将地址从一个内核共享到另一个内核可能是更好的方法。 另一个选项是使用#pragma 位置对要为变量分配的地址进行硬编码

    查看映射文件、我看到 TargetVelocity0x60FF 位于 CPU1中的0x20086404和 实际上是相同物理位置的0x00038202。 偏移量(404与202)的差异是由于 C28x 和 ARM 内核中的寻址不同。 但在您的原始帖子中、我看到 TargetVelocity0x60FF 位于偏移201处、这是错误的。 您能否确认两个内核上这些变量的地址?

    此致、

    Veena

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

    您好、Jeong、

    为了避免混乱、我建议您在      C28x 和 CM 应用中使用 int16_t、uint16_t、int32_t、uint32_t 类型、而不是 int、short 等

    此致、

    Veena

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

    您好、Veena、

     感谢您的建议。 我为 CM 和 CPU 分配了具有 uint16_t 的 Controlword0x6040和具有 Int32_t 的 TargetVelocity0x60FF。 我的成绩如下所示。

    查看 CM

    在 CPU 上查看

    我有另一个问题。 我使用 uint16_t 分配了 Controlword0x6040、但它似乎在存储器中分配了32位。 您能告诉我原因吗?

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

    您好、Jeong、

    如果选中"Expressions"视图、 则 Controlword0x6040 标识为16位整数。 由于您已将 TargetVelocity0x60FF 定义 为32位整数、因此它需要一个具有32位边界的地址、并被分配给偏移202 而不是201。 它给人的印象是 Controlword0x6040的长度是32位。 内存浏览器视图仅在 变量地址处添加变量名称。 它可能没有大小信息。 就像您在    TargetVelocity0x60FF 下看到超过4字节的值一样。  

    为了进行测试、您可以在 Controlword0x6040 和 TargetVelocity0x60FF 之间声明虚拟16位整数。 这将在地址201处分配。

    此致、

    Veena

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

    我对您的建议进行了测试。 是的、你是对的。 我将显示如下结果。

    查看 CM

    在 CPU 上查看

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

    您好、Jeong、

    感谢您的确认。

    只是想添加它、在使用共享变量时需要小心。 如前所述、如果在 两个内核中以相同的顺序声明变量、它们很可能 会获得相同的地址。 确保选中地图文件以确认它们使用 的位置相同。

    推荐的方法是在具有写入访问权限的内核中声明变量、并在启动时将地址共享给另一个内核。 您可以查看 C2000ware driverlib 中的 IPC 示例以了解更多详细信息。

    此致、

    Veena