cs通信首先要知道IPCMSG之间的通信情况,IPCMSG之间采用的是共享内存;
server与client端的通信是以HI_MSG_SendSync函数来传递信息的
HI_S32 HI_MSG_SendSync(HI_S32 s32MsgID, const HI_VOID* pvRequest, HI_U32 u32ReqLen, HI_MSG_PRIV_DATA_S* pstPrivData, HI_VOID* pvResponse, HI_U32 u32RespLen)
{
HI_S32 s32Ret = HI_SUCCESS;
HI_IPCMSG_MESSAGE_S* pstReq = NULL;
HI_IPCMSG_MESSAGE_S* pstResp = NULL;
HI_APPCOMM_CHECK_EXPR(-1 != g_s32MsgFd, HI_ENOINIT);
// 创建消息
pstReq = HI_IPCMSG_CreateMessage(0, (HI_U32)s32MsgID, (HI_VOID*)pvRequest, u32ReqLen);
if (pstReq)
{
if(pstPrivData != NULL)
{
memcpy(pstReq->as32PrivData, pstPrivData->as32PrivData, sizeof(HI_S32)*HI_IPCMSG_PRIVDATA_NUM);
}
//发送同步消息,同步消息是阻塞接口,会等待对端消息命令处理完成后再返回,所以对端必须回复。
s32Ret = HI_IPCMSG_SendSync(g_s32MsgFd, pstReq, &pstResp, MSG_SEND_SYNC_TIMEOUT);
HI_IPCMSG_DestroyMessage(pstReq);
if (HI_SUCCESS != s32Ret || NULL == pstResp)
{
HI_LOG_PrintH32(s32MsgID);
HI_LOG_PrintFuncErr(HI_IPCMSG_SendSync, s32Ret);
return HI_EINTER;
}
else
{
s32Ret = pstResp->s32RetVal;
if (NULL != pvResponse && NULL != pstResp->pBody && 0 < u32RespLen)
{
memcpy(pvResponse, pstResp->pBody, u32RespLen);
}
HI_IPCMSG_DestroyMessage(pstResp);
return s32Ret;
}
}
return HI_EINTER;
}
消息发送1:【Linux端】--> 【LiteOS端】
vio_main.c 【Linux端】 线程运行,判断是白天黑夜模式,
-> DeinitMedia_vivpss();
-> 修改Config.framerate 帧率
-> InitMedia_vivpss(0);
-> YX_UART_Set_Staic3DNR() // yx_uartmsg.c
开始发送消息。马上进入【LiteOS端】。
-> HI_MSG_SendSync(HI_UARTMSG_COMM_MOD_OTHER, data, 1, &pstPrivData, NULL, HI_NULL);
// pstPrivData.as32PrivData[0]= HI_UARTMSG_SET_3DNR; // key设置
【LiteOS端】
HI_MSG_RegisterMsgProc(HI_UARTMSG_COMM_MOD_OTHER, MSG_UART_OTHER_PROC,NULL); // key 方法映射 MSG_UART_OTHER_PROC
{ HI_UARTMSG_SET_3DNR, YX_UARTMSG_Set3DNR }, // key 方法映射
hi_uartmsg_server.c // 运行在LiteOS端,调用方法。
MSG_UART_OTHER_PROC() 匹配key, 解析到参数ViPipe、VpssGrp
-> HI_UARTMSG_SET_3DNR【key=pstPrivData->as32PrivData[0]】
-> YX_UART_Set_Staic3DNR()
-> HI_MPI_VI_GetPipeAttr()
-> HI_MPI_VI_SetPipeAttr()
-> HI_MPI_VPSS_GetGrpAttr()
-> HI_MPI_VPSS_SetGrpAttr()
其他
lcd_main.c
InitMedia()-> HI_HAL_SCREEN_Init--> HI_MSG_SendSync(MSG_HAL_SCREEN_INIT)
-> HI_IPCMSG_CreateMessage()
-> HI_IPCMSG_SendSync()/HI_IPCMSG_SendAsync() 发送消息出去。
HI_MSG_CLIENT_Init-- HI_IPCMSG_AddService-- HI_IPCMSG_Connect——- MSG_CLIENT_Run-- HI_IPCMSG_Run(g_s32MsgFd);
网友评论