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:使用共享 MSGRAM 时的数据对齐问题

Guru**** 2492385 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1558322/tms320f28388d-data-alignment-issues-when-using-shared-msgram

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

工具/软件:

尊敬的 TI 团队:

我的目标是将 8 位、16 位、32 位和浮点数据从 CPU1 传输到 CM。 我使用 CPU1toCMMSGRAM 来进行数据共享。我可以看到分配给结构体中变量的数据位于 ARM 内核的地址 0x039000 处和 C28x 内核的地址 0x20080000 处。这确认了数据共享已经发生在 C28x 的 2 字节字寻址和 CM 内核的 1 字节寻址处。 我尝试使用 enet_lwip_udp 通过以太网 UDP 通信将从 CM 共享的数据共享到我的 PC。

问题是我在两者之间获得了额外的字节(例如 0x00)、必须添加该字节以进行填充。但 Im 无法看到在不同数据之间如何添加填充的一致性。

例如:正确的数据是 41 47 71 12 34 56 78 A4 70 9D 3F 00 13 00 08 07 E9 3B D8 C6

但我会收到: 41 | 00 | 47 | 71 | 00 | 03 | 00 | 78 | 56 | 34 | 12 | A4 | 70 | 9D | 3F | 13 | 00 | 08 | 00。

    gSharedSettings.handshake.sourceID  = 0x41;
    gSharedSettings.handshake.destID    = 0x47;
    gSharedSettings.handshake.hndcmd    = 0x71;
    gSharedSettings.handshake.Checksum = 0x12345678;
    gSharedSettings.handshake.Version  = 1.23f;

    gSharedSettings.handshake.day   = 0x0013;
    gSharedSettings.handshake.month = 0x0008;
    gSharedSettings.handshake.year  = 0x07E9;
    gSharedSettings.handshake.ready = 1;
数据类型如下: 
typedef struct {
       uint8_t  sourceID;     // e.g., 0x41 (CPU1)
       uint8_t  destID;       // e.g., 0x47 (CPU2)
       uint8_t  hndcmd;       // cmd
       uint32_t Checksum;   // 4-byte checksum
       float    Version;    // IEEE-754 float (e.g., 1.23f)
       uint16_t day;          // DD
       uint16_t month;        // MM
       uint16_t year;         // YYYY
       uint16_t ready; 
} HandshakeSettings;
我 假设实际数据和接收到的数据之间不匹配是由于 C28x 和 CM 之间的存储器对齐差异所致。但如何纠正? 我尝试了#pragma Pack (1)。

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

    您好、Sapna、

    您是否恰好在使用 ipc_sendCommand? 如果是、您是否使用 addrCorrEnable 功能、这会处理两个内核之间的寻址差异。  

    此致、
    Aj Favela.  

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

    您好、

     我尚未使用 IPC 或  ipc_sendCommand。 IPC 中断是否基于? 我不熟悉 IPC.为了使事情简单,我使用了 CPU1 和 CM 之间的共享 MSGRAM。我尝试了现有代码中的各种选项。 但无法解决。  

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

    您好、

    是、IPC 是基于中断的、但也可以通过持续检查 IPC 标志来工作。 使用 IPC_sendCommand 时、IPC 还在 CPU1 和 CM 之间使用 MSGRAM。

    CPU1 和 CM 之间已经有一些有效的 IPC 通信示例、可在 C2000Ware 中 的 C2000Ware_VERSION#/driverlib/DEVICE_GPN/examples/CORE_IF_MULTICORE/ipc.位置找到  

    此外、我建议浏览 C28x Academy 的 IPC 一章、以便更好地了解外设的工作原理  

    此致、
    Aj Favela.