Browse Source

【主线待合】freeRTOS增加不阻塞的带超时信号量

master
Lizongdi 12 hours ago
parent
commit
cbe236c430
  1. 7
      RBcore/msg_center.c
  2. 15
      bspMCU/My_freeRTOS.c
  3. 1
      library/common/include/rd_thread.h
  4. 7
      library/common/rd_thread.c

7
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
{

15
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;

1
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);
/**

7
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;

Loading…
Cancel
Save