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.
你好
我正在将 IPC_ex1 (具有从 C28x 到 CM 的中断的 IPC 示例)修改为从 CM 到 C28x 的传输数据、但程序不起作用、当我读取数据时、它会读取下面的内容。 此外、代码将出错、在2个 IPC 后将不再运行。
您能帮助我检查代码以查看错误吗?
陈
您在哪里得到了此故障? 在 CPU1 (或) CM 侧? 您还能指出您看到故障的代码部分吗?
您是否获得了 CM IPC 触发的 CPU1 IPC 中断? MSGRAM_CM_TO_CPU 的物理地址是什么? 它实际上是从 CM 到 CPU1的消息 RAM 吗?
此致、
曼诺伊
你好
某些地址设置可能不正确。 我在运行代码时单击 SUSPEND、它在 ipc.h IPC_waitForAck()中停止。 我想知道为什么原始示例使用 flag31进行同步、而使用 flag0发送代码和 ACK。 我想使用它们将数据从 CPU1传输到 CM。 我认为在将数据从 CM 传输到 CPU1时需要选择另一对。 此外、我使用 0x1001和 0x2001作为 IPC_CMD_READ_MEM 和 IPC_CMD_RESP。 我想知道选择这些地址的原则是什么。 我使用这些函数将数据从 CPU1传输到 CM、还需要选择其他地址以从 CM 传输到 CPU1。
我参考了以下文档、但此处的信息非常有限、
https://software-dl.ti.com/C2000/docs/C2000_Multicore_Development_User_Guide/ipc_communication.html
谢谢
Yifu
您是否在 CPU1 (或) CM 内核中挂起? 另外、您还在等待哪个标志? 请提供更多信息以提供有用的调试提示。 这将有助于我们更快地找到根本原因。
[引用 userid="532605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1195728/tms320f28388d-ipc-from-cm-to-c28x-doesn-t-work/4508842 #4508842">此外、我使用 的是0x1001和 0x2001、并用作 IPC_CMD_READ_MEM 和 IPC_CMD_RESP。 我想知道选择这些地址的原则是什么。[/引述] [引用 userid="532605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1195728/tms320f28388d-ipc-from-cm-to-c28x-doesn-t-work/4508842 #4508842">我想知道原始示例为什么使用 flag31进行同步、而使用 flag0发送代码和 ACK。 [/报价]是的、标志31位用于同步 CPU1和 CM 内核。 IPC_SYNC 函数通常用作两个内核之间的握手信号、确保两个内核在同步发送之前不会进一步处理其应用程序代码。
[引用 userid="532605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1195728/tms320f28388d-ipc-from-cm-to-c28x-doesn-t-work/4508842 #4508842">我想使用它们将数据从 CPU1传输到 CM。 我认为、在将数据从 CM 传输到 CPU1[/引用]时、我需要选择另一对CM.IPC0和 CPU1.IPC0是两个不同的信号、因为每个 CPU 都有自己的 IPC 标志。
[引用 userid="532605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1195728/tms320f28388d-ipc-from-cm-to-c28x-doesn-t-work/4508842 #4508842">此外、我使用 的是0x1001和 0x2001、并用作 IPC_CMD_READ_MEM 和 IPC_CMD_RESP。 我想知道选择这些地址的原则是什么。 我使用这些函数将数据从 CPU1传输到 CM、还需要选择其他地址以从 CM 传输到 CPU1[/引用]0x1001 (IPC_CMD_READ_MEM)和0x2001 (IPC_CMD_RESP)是用作命令而不是地址的随机十六进制值。 在该示例中、仅使用0x1001 (IPC_CMD_READ_MEM)、如果读取该命令值、则使用 ReadData 缓冲区存储来自 CM 的数据。
if (command =IPC_CMD_READ_MEM)
{
状态= true;
//
//读取和比较数据
//
for (i=0;<data; i++)
{
ReadData[i]=*((uint8_t *) addr + i);
}
}
此致、
曼诺伊
大家好、我注意到数据传输需要为32位、并且我在 代码中添加了#pragma DATA_SECTION (ReadData、"MSGRAM_CM_TO_CPU")。 它仍然不起作用。 我正在等待 flag0、我正在使用 flag0在两个内核之间传输数据。
似乎它输入了 IPC_ISR 一次、addr 不正确、但命令(1001/2001)和数据正确。 此外、CM 代码将卡在其中 IPC_waitForAck (IPC_CM_L_CPU1_R、IPC_FLAG0);
我发现该错误是由一个拼写错误引起的。 我没有检查 cmd 文件。
现在、我可以成功接收来自 cm 的数据。 我无法再次进入 IPC 中断的原因是当 IPC_ISR 位于 C28x 中时, 需要在末尾调用 Interrupt_clearACKGroup()!
这是代码、如果有相同问题的人可以参考这些代码。 但请忽略这些评论、它们很凌乱。