IPC主要的作用是:
处理器之间的数据通信
本例背景
F28388D中的CPU1核与CM4核之间的简单数据通信。
本例主要是从CPU1向CM4核发送数据。
可以在之前的以太网通信例程中,加入IPC程序。
程序来源
IPC程序借鉴于C2000 WARE例程中的ipc_ex1_basic_c28x1.c与ipc_ex1_basic_cm.c
路径为:
C:\ti\c2000\C2000Ware_3_04_00_00\driverlib\f2838x\examples\c28x_cm\ipc
(例程给的特别好,稍微改一下,自己就可以用上了)
程序结构
两部分组成:
第一部分:
完成CPU1核中的IPC发送程序
(将上面的ipc_ex1_basic_c28x1.c程序移植进自己的CPU1核的例程中)
第二部分:
完成CM4核中的IPC接收程序(接收用的中断)
(将上面的ipc_ex1_basic_cm.c程序移植进自己的CM4核的例程中)
移植后,编译成功。然后根据上一篇文章中的下载方法下载到板子中去。
观察CPU1核的pass值,如果由0变为1,就代表IPC成功运行。
程序中,重点程序说明
自己的数据,可以先放到一个数组中,然后替换掉下面的readData数组。
#pragma DATA_SECTION(readData, “MSGRAM_CPU_TO_CM”);
下面IPC发送函数中的readData与前面的一样,可以被自己的数组替换。len代表给数组的长度,可以用#define定义一个常量,方便修改,也可以直接写数字。
IPC_sendCommand(IPC_CPU1_L_CM_R, IPC_FLAG0, IPC_ADDR_CORRECTION_ENABLE,
IPC_CMD_READ_MEM, (uint32_t)readData, len);
下面的是CM4核中的接收数据的函数。
&addr接收了来自CPU1的数据。 &data接收了来自CPU1的数组长度。
IPC_readCommand(IPC_CM_L_CPU1_R, IPC_FLAG0, IPC_ADDR_CORRECTION_ENABLE,
&command, &addr, &data);
下面的for循环中,UDPData1[i] =*((uint32_t )addr+i);可以通过i的依次增加,完成对地址对应数据的转存。
for(i=0; i<data; i++)
{
UDPData1[i] =((uint32_t *)addr+i);
}
想法与例程的提供
当然,在我的应用背景下,对于CPU1的例程而言,也可以将以太网的例程(ethernet_c28x_config)移植进ipc_ex1_basic_c28x1.c中。与上面的移植方法相比,都很简单。
但是CM4核的程序,建议将IPC程序移植进enet_lwip中。反过来移植的话,工作量有点大。
移植完的IPC+UDP协议的以太网数据通信例程见博客中的资源上传。(文章中压缩包上传有限制)