IPC
代码集成分为两个部分组成,MCAL CddIPC和 TI DrvIPC。
CddIPC
CddIPC模块导入
1.打开EB工程右击项目图标,点击Module Configurations添加CddIPC模块。
2.双击Cdd_Ipc进入模块配置。
CddIPC参数配置
1.下面其他选项默认勾选即可,Dem可选择关联或者修改为无效Dem事件。
2.共享内存起始地址以及大小,第三个配置选项没有在静态代码中使用,前两个选项要与其他核地址保持一致。
3.IPC本地内核选择。
4.参加IPC通信对方核ID,供后面CommChs使用。
5.这里面需要注意的是,MaxNumMsgQueued和MaxMsgSize是不能够修改的。LocalEp与RemoteEp类似UDP通信本地与对方端口号,通信双方互掉。
6.硬件MailBox的个数,TDA4每个核都有一个对应的HostProcID是自己的MailBox。
7.每个MailBox都有自己对所有包括自己MailBox内部使用的关系,这里我也不需要修改,默认TI就好,255为无效值。
CddIPC集成
1.SDK代码路径:mcusw\mcal_drv\mcal\CddIpc
2.ipc_baremetal_hw为DrvIPC静态代码,后面要替换为最新的TI SDK的lib文件。
3.CddIPC保留下述文件,DrvIPC直接集成ipc_baremental.aerf库即可。
4.静态lib库路径:pdk_j784s4_08_06_01_03\packages\ti\drv\sciclient\lib\j784s4\mcu1_0\release
CddIPC接收
用户层plling接口函数非阻塞式。
FUNC(Std_ReturnType, CDD_IPC_CODE) Cdd_IpcReceiveMsg (VAR(uint32, AUTOMATIC) chId,
P2VAR(void, AUTOMATIC, CDD_APP_DATA) pBuf,
P2VAR(uint32, AUTOMATIC, CDD_APP_DATA) bufLen)
{
/*
1. Get the associated RemoteEp & RemoteProc
2. Initiate the transfer
*/
const Cdd_IpcChannelType *pChanCfg = CddIpcConfiguraions_PC.pChCfg;
remoteProcId = pChanCfg[chId].remoteProcId;
remoteEndPt = Cdd_IpcDrvObj.mapToCommId[remoteProcId][chId].remoteEp;
if (IPC_SOK == (int32_t)RPMessage_recvNb(Cdd_IpcDrvObj.rpmsgHndl[chId],
(void*)pBuf,
(void *)bufLen,
&remoteEndPt,
&remoteProcId))
{
UART_printf("recvNb,bufLen;%d,remoteEndPt:%d,remoteProcId:%d\n",
*((uint32*)bufLen),
remoteEndPt,
remoteProcId);
Cdd_IpcDrvObj.mapToCommId[remoteProcId][chId].remoteEp = remoteEndPt;
}
}
CddIPC发送
用户发送函数。
FUNC(Std_ReturnType, CDD_IPC_CODE) Cdd_IpcSendMsg(VAR(uint32, AUTOMATIC) chId,
P2CONST(void, AUTOMATIC, CDD_APP_DATA) pBuf,
VAR(uint32, AUTOMATIC) bufLen)
{
const Cdd_IpcChannelType *pChanCfg = CddIpcConfiguraions_PC.pChCfg;
remoteProcId = pChanCfg[chId].remoteProcId;
remoteEndPt = Cdd_IpcDrvObj.mapToCommId[remoteProcId][chId].remoteEp;
ownEp = pChanCfg[chId].localEp;
UART_printf("IpcSend,remoteProcId:%d,remoteEndPt:%d,ownEp:%d\n",remoteProcId,remoteEndPt,ownEp);
if (IPC_SOK == RPMessage_send(Cdd_IpcDrvObj.rpmsgHndl[chId],
remoteProcId,
remoteEndPt,
ownEp,
(Ptr)pBuf,
(uint16)bufLen))
{
rtnVal = (Std_ReturnType)E_OK;
}
}
DrvIPC
1.DrvIPC驱动链接库引用。
2.在CddIPC初始化过程中调用Ipc_mailboxRegister函数。
3.在V4版本的代码中,SCI配置中断路由,已经做在底层驱动代码,与之前手动调用已经不需要了。
4.如果系统使用Autosar的话,这里注册中断函数,也需要在AutoSar中进行配置,否则中断的入口函数不是Autosar函数的入口地址。
5.中断路由最终路由到MCU1_0,Main Domain映射到同一个clusterId 12,userId 0,A72映射到clusterId 0,userId 0。