diff --git a/RBcore/msg_center.c b/RBcore/msg_center.c index aca5068..e0ca677 100644 --- a/RBcore/msg_center.c +++ b/RBcore/msg_center.c @@ -327,8 +327,11 @@ int MsgCenter_ProcessWait(uint32_t uiModuleID, uint32_t uiTimeoutMs) // 等待信号量(有新消息到达) if (uiTimeoutMs > 0) { - // 带超时等待 - Rd_SemWait(&g_astModules[iIndex].stSem, __func__, NULL); + // 带超时等待,超时返回 -1 让调用方继续轮询 + if (Rd_SemWaitTimeout(&g_astModules[iIndex].stSem, uiTimeoutMs) != 0) + { + return -1; + } } else { diff --git a/bspMCU/My_freeRTOS.c b/bspMCU/My_freeRTOS.c index 3e064d2..10b3b3a 100644 --- a/bspMCU/My_freeRTOS.c +++ b/bspMCU/My_freeRTOS.c @@ -114,6 +114,21 @@ void Rd_SemWait(void *_sem, const char *_pcFunc, int *_piCnt) } } +int Rd_SemWaitTimeout(void *_sem, uint32_t _uiTimeoutMs) +{ + rd_sem_t *pSem = (rd_sem_t *)_sem; + uint32_t ticks = (_uiTimeoutMs * osKernelGetTickFreq()) / 1000; + if (ticks == 0) ticks = 1; + osStatus_t status = osSemaphoreAcquire(pSem->sem_id, ticks); + if (status == osOK) { + return 0; + } else if (status == osErrorTimeout || status == osErrorResource) { + return -1; + } else { + return -2; + } +} + void Rd_SemPost(void *_sem, const char *_pcFunc, int *_piCnt) { rd_sem_t *pSem = (rd_sem_t *)_sem; diff --git a/library/common/include/rd_thread.h b/library/common/include/rd_thread.h index 9643ae3..5cc59c4 100644 --- a/library/common/include/rd_thread.h +++ b/library/common/include/rd_thread.h @@ -155,6 +155,7 @@ int Rd_MutexDestroy(void *_pMutex); int Rd_SemInit(void *_sem, int _iPshared, int _iValue); void Rd_SemPost(void *_sem, const char *_pcFunc, int *_piCnt); void Rd_SemWait(void *_sem, const char *_pcFunc, int *_piCnt); +int Rd_SemWaitTimeout(void *_sem, uint32_t _uiTimeoutMs); int Rd_SemDestroy(void *_sem); /** diff --git a/library/common/rd_thread.c b/library/common/rd_thread.c index 853aebc..49c7ea4 100644 --- a/library/common/rd_thread.c +++ b/library/common/rd_thread.c @@ -55,6 +55,13 @@ WEAK void Rd_SemWait(void *_sem, const char *_pcFunc, int *_piCnt) return; } +WEAK int Rd_SemWaitTimeout(void *_sem, uint32_t _uiTimeoutMs) +{ + (void)_sem; + (void)_uiTimeoutMs; + return -1; +} + WEAK void Rd_SemPost(void *_sem, const char *_pcFunc, int *_piCnt) { return;