|
|
@ -45,7 +45,6 @@ |
|
|
typedef struct { |
|
|
typedef struct { |
|
|
MsgModule_t stModule; |
|
|
MsgModule_t stModule; |
|
|
rd_ringbuf_t *pstRingBuf; // 消息队列(ringbuffer)
|
|
|
rd_ringbuf_t *pstRingBuf; // 消息队列(ringbuffer)
|
|
|
rd_mutex_t stMutex; // 互斥锁(保护ringbuffer)
|
|
|
|
|
|
rd_sem_t stSem; // 信号量(阻塞等待)
|
|
|
rd_sem_t stSem; // 信号量(阻塞等待)
|
|
|
} MsgModuleEntry_t; |
|
|
} MsgModuleEntry_t; |
|
|
|
|
|
|
|
|
@ -129,17 +128,9 @@ uint32_t MsgCenter_Register(const char *pszName, MsgHandler_t pfHandler) |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 初始化互斥锁
|
|
|
|
|
|
if (Rd_MutexInit(&g_astModules[uiIndex].stMutex) != RD_SUCCESS) |
|
|
|
|
|
{ |
|
|
|
|
|
rd_RingbufferDestroy(g_astModules[uiIndex].pstRingBuf); |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 初始化信号量(初始值为0,表示无消息)
|
|
|
// 初始化信号量(初始值为0,表示无消息)
|
|
|
if (Rd_SemInit(&g_astModules[uiIndex].stSem, 0, 0) != RD_SUCCESS) |
|
|
if (Rd_SemInit(&g_astModules[uiIndex].stSem, 0, 0) != RD_SUCCESS) |
|
|
{ |
|
|
{ |
|
|
Rd_MutexDestroy(&g_astModules[uiIndex].stMutex); |
|
|
|
|
|
rd_RingbufferDestroy(g_astModules[uiIndex].pstRingBuf); |
|
|
rd_RingbufferDestroy(g_astModules[uiIndex].pstRingBuf); |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
@ -194,14 +185,9 @@ int MsgCenter_Send(const Msg_t *pstMsg) |
|
|
return RD_FAILURE; |
|
|
return RD_FAILURE; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 加锁保护ringbuffer
|
|
|
// MPSC安全写入(ringbuffer内部关中断+自旋锁)
|
|
|
Rd_MutexLock(&g_astModules[iDstIndex].stMutex, __func__, NULL); |
|
|
int iRet = rd_RingbufferPutSafe(g_astModules[iDstIndex].pstRingBuf, |
|
|
|
|
|
(const char *)pstMsg, sizeof(Msg_t)); |
|
|
// 写入ringbuffer
|
|
|
|
|
|
int iRet = rd_RingbufferPut(g_astModules[iDstIndex].pstRingBuf, |
|
|
|
|
|
(const char *)pstMsg, sizeof(Msg_t)); |
|
|
|
|
|
|
|
|
|
|
|
Rd_MutexUnlock(&g_astModules[iDstIndex].stMutex, __func__, NULL); |
|
|
|
|
|
|
|
|
|
|
|
if (iRet > 0) |
|
|
if (iRet > 0) |
|
|
{ |
|
|
{ |
|
|
@ -256,6 +242,53 @@ int MsgCenter_SendTo(const char *pszDstName, uint32_t uiMsgID, const void *pData |
|
|
return MsgCenter_Send(&stMsg); |
|
|
return MsgCenter_Send(&stMsg); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int MsgCenter_SendFromISR(const char *pszDstName, uint32_t uiMsgID, const void *pData, uint32_t uiDataLen) |
|
|
|
|
|
{ |
|
|
|
|
|
if (NULL == pszDstName) |
|
|
|
|
|
{ |
|
|
|
|
|
return RD_NULL; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
uint32_t uiDstModuleID = MsgCenter_FindModule(pszDstName); |
|
|
|
|
|
if (0 == uiDstModuleID) |
|
|
|
|
|
{ |
|
|
|
|
|
return RD_FAILURE; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int iDstIndex = FIND_MODULE_INDEX(uiDstModuleID); |
|
|
|
|
|
if (iDstIndex < 0 || NULL == g_astModules[iDstIndex].pstRingBuf) |
|
|
|
|
|
{ |
|
|
|
|
|
return RD_FAILURE; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Msg_t stMsg; |
|
|
|
|
|
RD_MEMSET(&stMsg, 0, sizeof(Msg_t)); |
|
|
|
|
|
stMsg.m_uiDstModule = uiDstModuleID; |
|
|
|
|
|
stMsg.m_uiMsgID = uiMsgID; |
|
|
|
|
|
|
|
|
|
|
|
if (NULL != pData && uiDataLen > 0) |
|
|
|
|
|
{ |
|
|
|
|
|
if (uiDataLen > MSG_CENTER_MAX_DATA_SIZE) |
|
|
|
|
|
{ |
|
|
|
|
|
uiDataLen = MSG_CENTER_MAX_DATA_SIZE; |
|
|
|
|
|
} |
|
|
|
|
|
RD_MEMCPY(stMsg.m_aucData, pData, uiDataLen); |
|
|
|
|
|
stMsg.m_uiDataLen = uiDataLen; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// MPSC安全写入(ringbuffer内部关中断+自旋锁)
|
|
|
|
|
|
int iRet = rd_RingbufferPutSafe(g_astModules[iDstIndex].pstRingBuf, |
|
|
|
|
|
(const char *)&stMsg, sizeof(Msg_t)); |
|
|
|
|
|
if (iRet > 0) |
|
|
|
|
|
{ |
|
|
|
|
|
// 信号量在CMSIS-RTOS2中自动识别ISR上下文
|
|
|
|
|
|
Rd_SemPost(&g_astModules[iDstIndex].stSem, __func__, NULL); |
|
|
|
|
|
return RD_SUCCESS; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return RD_FAILURE; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
/*****************************************************************************
|
|
|
函 数 名 : MsgCenter_ProcessOne |
|
|
函 数 名 : MsgCenter_ProcessOne |
|
|
功能描述 : 从ringbuffer读取一条消息 |
|
|
功能描述 : 从ringbuffer读取一条消息 |
|
|
@ -266,14 +299,9 @@ int MsgCenter_SendTo(const char *pszDstName, uint32_t uiMsgID, const void *pData |
|
|
*****************************************************************************/ |
|
|
*****************************************************************************/ |
|
|
static int MsgCenter_ProcessOne(int iIndex, Msg_t *pstMsg) |
|
|
static int MsgCenter_ProcessOne(int iIndex, Msg_t *pstMsg) |
|
|
{ |
|
|
{ |
|
|
// 加锁保护ringbuffer
|
|
|
|
|
|
Rd_MutexLock(&g_astModules[iIndex].stMutex, __func__, NULL); |
|
|
|
|
|
|
|
|
|
|
|
int iRet = rd_RingbufferGet(g_astModules[iIndex].pstRingBuf, |
|
|
int iRet = rd_RingbufferGet(g_astModules[iIndex].pstRingBuf, |
|
|
(char *)pstMsg, sizeof(Msg_t)); |
|
|
(char *)pstMsg, sizeof(Msg_t)); |
|
|
|
|
|
|
|
|
Rd_MutexUnlock(&g_astModules[iIndex].stMutex, __func__, NULL); |
|
|
|
|
|
|
|
|
|
|
|
return (iRet > 0) ? 1 : 0; |
|
|
return (iRet > 0) ? 1 : 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|