据我了解应该有3种方式,IPC中断,notify,MessageQ。
1、IPC中断
1)IPC中断事件号91
2)选择中断向量
#define IPC_VECTID 8
3)中断配置
Hwi_Params hwiParams;
/* 中断配置 */
Hwi_Params_init(&hwiParams);
hwiParams.arg = (UArg)IPC_VECTID;
hwiParams.eventId = 91;
hwiParams.enableInt = TRUE;
Hwi_create(IPC_VECTID, (Hwi_FuncPtr)IsrMultiIpc, &hwiParams, NULL);
中断处理函数可以post信号量为后续处理
4)触发IPC中断
IPCGRx寄存器bit0置位触发IPC中断,高28位可以携带信息
/* IPCGR Info */
static volatile UINT iIPCGRInfo[8] =
{
IPCGR0,
IPCGR1,
IPCGR2,
IPCGR3,
IPCGR4,
IPCGR5,
IPCGR6,
IPCGR7
};
ERR IpcSendEvent(UINT coreId, UINT payLoad)
{
*(volatile UINT *)(iIPCGRInfo[coreId]) = (payLoad & 0xfffffff0);
*(volatile UINT *)(iIPCGRInfo[coreId]) |= 1;
RET_OK;
}
5)携带信息从IPCARx读取
/* IPCAR Info */
static volatile UINT iIPCARInfo[8] =
{
IPCAR0,
IPCAR1,
IPCAR2,
IPCAR3,
IPCAR4,
IPCAR5,
IPCAR6,
IPCAR7
};
UINT IpcGetEvent(UINT coreId)
{
volatile UINT payLoad;
payLoad = *(volatile UINT *)(iIPCARInfo[coreId]);
payLoad = payLoad & 0xfffffff0;
return payLoad;
}
2、notify
多核通信采用主从方式,core0主,其余从核
1)注册notify事件,主核注册从核notify事件,从核注册主核notify事件
#define INTERRUPT_LINE 0
#define EVENTID 10
if (coreId == DSP_CORE_0)
{
for (idx = 1; idx < DSP_CORE_NUM; idx++)
{
Notify_registerEvent(idx, INTERRUPT_LINE, EVENTID, (Notify_FnNotifyCbck)IsrMultiNotify, NULL);
}
}
else
{
Notify_registerEvent(DSP_CORE_0, INTERRUPT_LINE, EVENTID, (Notify_FnNotifyCbck)IsrMultiNotify, NULL);
}
注册回调可以post信号量为后续处理
2)notify事件发送
ERR NotifySendEvent(UINT coreId, UINT payLoad)
{
Notify_sendEvent(coreId, INTERRUPT_LINE, EVENTID, payLoad, TRUE);
RET_OK;
}
3、IPC or notify 数据发送
IPC 和 notify能发送的数据有限,只能作为核间事件通知。当然MessageQ可以解决这个问题。本节更想探讨的是另外一种思路。