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 MSG 共享 RAM CM - CPU2核心的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1078111/tms320f28388d-problem-with-ipc-msg-share-ram-cm---cpu2-core

部件号:TMS320F28388D
“线程:C2000WARE测试”中讨论的其它部件

您好,  

我正在研究使用 MCU F28388D 的项目,我的项目与 MCU 的所有3个内核一起使用。  

目前,我正在使用 SDK:C2000Ware_MotorControl_SDK_3_00_01_00 (其中包含 C2000ware 版本:3.02.00.00),  CCS v 9.3.0.00012,带有 C2000 C28x 的编译器:TI v18.12.4.LTS 和 ARM 内核:TI V18.12.4.LTS

第一次测试:

 我在  IPC MSG 共享 RAM CM 中将结构数据定义为 CM 和 CPU2中的 CPU2下图:

  在 CM 内核 中,我声明变量   SRAM_cm_to_CPU2, 在 CPU2内核中,我声明变量 ipcMToCPU2Data ,其结构数据如下( SRAM_cm_to_CPU2 ipcMToCPU2Data 在 IPC MSG RAM CM 中被分配给带有#pragma data_section 的 CPU2...)

我调试项目并检查 CCS 中的内存浏览器(下图),一切正常,数据可以从 CM - CPU2正常传输:

但在我进行第二次测试时,我只能将结构数据从 buer_data_CPU2[12]更改为  buer_data_CPU2[13] ,如下所示:

出现问题,数据无法从 CM -> CPU2正确传输,我在内存浏览器中检查内存映射下图:

以厘米为单位的磁芯可能所有东西都仍然正常, 但在 CPU2中,我不知道为什么 IPC_CPU_to_CM_GetBuffer 的大小增加到192个单词(384字节),我在驱动程序库代码 IPC.c 中检查了它,它是用大小为136个单词(272字节)的结构声明 的,就像第一次测试图片中显示的内存映射。

我不知道原因何在? 您能帮我解决这个问题吗?因为我的项目需要将数组  buer_data_CPU2增加到12个元素。

以下2个内核的 cmd 文件:

谢谢,

长磅

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

    我很抱歉 CMD 图片我使用 CPU2 cmd 文件(CMTOCPURAM 而不是 CMTOCPURAM_ECAT)加了错误的下划线

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

    Longpt,

    您是否对 ipc.h 和 IPC.c 驱动程序库文件进行了任何更改?

    IPC_CPU_to_CM_GetBuffer 的大小取决于 IPC.h 中的定义 此外,您在帖子中还不清楚 SRAM_CM_to_CPU2 ipcMToCPU2数据 与 IPC_CPU_to_CM_GetBuffer 之间的关系? 回答问题应能解决问题。

    typedef 结构

       UINT32_t 命令;
       UINT32_t 地址;
       UINT32_t 数据 aw1;
       UINT32_t 数据 aw2;
    } IPC_Message_t;

    typedef 结构

       IPC_Message_t 缓冲区[IPC_NUM_OF_interrupts ][IPC_buffer_size];
       UINT16_t     GetWriteIndex[IPC_NUM_OF_interrups];
       UINT16_t     PutReadIndex[IPC_NUM_OF_interrups];
    }IPC_GetBuffer_t;

    此致,

    马诺伊

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

    马诺伊

    我没有更改 ipc.h 和 IPC.c 驱动程序库文件中的任何内容?

     “此外,您在帖子中还不清楚 SRAM_CM_to_CPU2 和 ipcMToCPU2数据 与 IPC_CPU_to_CM_GetBuffer 之间的关系 ”

    我明确表示 CPU2和 CM 的来源,我声明结构数据正通过 IPC 共享 RAM CM 和 CPU2在 CPU2和 CM 核心之间传输数据,详情如下:

    在 CM 代码中:我声明名为  SRAM_cm_to_CPU2的结构 ,然后按 DATA_SECURE 将其分配给共享 RAM ...如下所示:

    在 CPU2代码(与 CM 代码相同)中,我声明一个名为  ipcCMToCPU2Data 的结构,然后按 data_section 将其分配给共享的 ram ...如下图所示: (您可以看到 CPU2中定义的结构在 CM 中具有结构的分布名称,但它们具有相同的结构):

    关于  IPC_CPU_to_CM_GetBuffer , 我看到在 IPC.c 中,它们还被分配给各核心之间的 IPC MSG 共享 RAM,如下图所示:

     在定义的结构中使用数组 buer_data_CPU2时,当我更改元素<=12时,一切都可能正常,如上一个 POST -第一次测试中的图片所示。但我更改了两个 CPU 代码中的元素>12,问题就像第二次测试中的图片一样出现。 这使得在 CM Core 中写入的数据无法在 CPU2中读取。

    长磅

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

    很抱歉,CPU2代码中的图片,结构中没有字段 do_send,我再次将正确的图片放在下面:

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

    朗·范

    我从我的末尾重新创建此问题时失败。对我而言,CPU 到 CM Get Buffer 始终只需要136个单词。 它的大小不会像您所看到的那样增加。 我通过将阵列分配给同一数据部分来尝试此操作。 对我来说,更改阵列大小不会影响 Get Buffer 的大小。

    根据您的快照,我认为地址0x38088 -0x38095似乎仍然具有正确的内容。 (所有0xffffff)。 可能会尝试发送不同的值,看看您是否从 CM 端收到正确的内容?

    此致,

    马诺伊

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

    马诺伊

    根据您的快照,我认为地址0x38088 -0x38095似乎仍然具有正确的内容。 (所有0xffffff)。 可能会尝试发送不同的值,看看您是否从 CM 端收到正确的内容?

    -->是的,你是对的, 地址0x38088中的内容是正确的,我尝试了不同的值,而地址0x38088中的 CPU2的值会发生变化,就像我从 CM 端变化一样。 但在 CPU2中,它以某种方式分配  了地址0x380C0的 ipcMToCPU2数据,使所有数据都像快照一样被读取为零。 我还通过 IPC CPU 的大小检查从 CPU2到 CM Get Buffer 的大小,它仍然正常返回136个字。

    通过检查从 CPU2发送到 CM 的数据(在我的项目中,数据从 CM 传输到 CPU2,从 CPU2传输到 CM),我发现问题相同, 我向 CM 数据声明了一个用于 CPU2的共享结构,并将其分配给从地址0x39000的共享 CPU2TOCM ram0的 cmd 文件中定义的共享 RAM,如果我将共享数据的大小更改为某个 限制大小。 它还为 共享数据分配了错误的地址,或者为 IPC_CPU_to_CM 置换缓冲区分配了错误的地址(如果为 IPC_CPU_to_CM 置换缓冲区设置了错误的地址 ,我仍然可以从 CU2向 CM 发送和接收正确的数据,但基本上很难理解)。 -->我不知道我 使用的编译器或 SDK,驱动程序库版本,是否存在一些错误?

    暂时,我通过将自己的共享数据分配给 CPU2TOCMRAM1 (0x39400)和 CMTOCPU2RAM1(0x38400)来解决此问题,它们不使用与 IPC CPU 使用的驱动程序库 CPU2所使用的相同的 ram0 (0x38000和0x39000),以 CM 置入和获取缓冲器。 一切都可以。

    但我仍然想找出问题的根源。

    注意:

    延时

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="377427" url="~ë/support/icc-intrlers-group/c2f/c2000-微控制器-forum/1078111/tms320f28388d- problem-with -IPC-msg-share-ram-cm---cpu2-core/3992475#3992475]ipc_cm_2将 错误  的数据发送到 ipc_ch_ip_2,但有时可能会让其无法从 ipc_cm2接收到错误的 CPU 地址,并在某个时间接收数据。 -->我不知道我 使用的编译器或 SDK 驱动程序库版本是否存在一些错误?

    很好的了解是,从 CPU2获取缓冲区的 IPC CPU 到 CM 的大小为136个字。 因此,很明显,链接器没有 在136个单词后立即放置 ipcMToCPU2Data 数组。 这就是您看到此问题的原因。 您不能将此错误称为错误,因为链接程序有权将变量放在分配的内存中的任何位置。

    CM 核心是可寻址的字节,C28x 核心不是。

    在 CM 核心中,在给定的内存位置存储1字节

    在 C28x 内核的给定内存位置中,存储1个字(16位)。

    这就是为什么在0x20086110中写入的数据在0x38088中可用的原因。

    0x20086110- 0x20086000 = 0x110。 如果除以0x110/2,则得到0x88。

    因此,如果要从0x380C0 (ipcMToCPU2Data 的地址)读取数据,则需要写入0x20086180

    此致,

    马诺伊

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

    因此,很明显,链接器没有  在136个单词后立即放置 ipcMToCPU2Data 数组。 这就是您看到此问题的原因。 您不能将此错误称为错误,因为链接程序有权将变量放在分配的内存中的任何位置。

    -->好的,正如你每次用共享 RAM 声明 CPU 之间的共享数据时所说的,我必须检查链接器将其分配给共享 RAM 的地址,然后在不匹配的情况下将其分配到正确的地址? 我认为 这是相当不便的。

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

    朗·范

    执行此命令应自动为您执行地址更正

    IPC_readMessageFromQueue (IPC_CM_L_CPU2_R,&messageQueue,IPC_ADDR_CORRECTED_ENABLE,
                                &RxMsg,IPC_nonblocking_call);

    RxMsg.address 应该具有收到的消息的起始地址。 请检查 IPC_ex2_msgqueue_c28x1和 IPC_ex2_msgqueue_cm C2000Ware 示例以了解所有这些功能的工作原理。

    此致,

    马诺伊

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

    马诺伊

    谢谢。