esp32_c3_s3/wifi_ble: Use nxsem_trywait to take semphr from ISR

Use the non-blocking `nxsem_trywait` to try to take the semaphore
during the interrupt handler.
This commit is contained in:
Tiago Medicci Serrano 2023-08-18 08:56:11 -03:00 committed by Xiang Xiao
parent e25fcb3bd5
commit 382debc996
6 changed files with 84 additions and 53 deletions

View File

@ -828,8 +828,9 @@ static void semphr_delete_wrapper(void *semphr)
static int semphr_take_from_isr_wrapper(void *semphr, void *hptw)
{
DEBUGPANIC();
return false;
*(int *)hptw = 0;
return esp_errno_trans(nxsem_trywait(semphr));
}
/****************************************************************************
@ -921,10 +922,6 @@ static int semphr_take_wrapper(void *semphr, uint32_t block_time_ms)
if (block_time_ms == OSI_FUNCS_TIME_BLOCKING)
{
ret = nxsem_wait(&bt_sem->sem);
if (ret)
{
wlerr("Failed to wait sem\n");
}
}
else
{
@ -938,6 +935,12 @@ static int semphr_take_wrapper(void *semphr, uint32_t block_time_ms)
}
}
if (ret)
{
wlerr("ERROR: Failed to wait sem in %lu ticks. Error=%d\n",
MSEC2TICK(block_time_ms), ret);
}
return esp_errno_trans(ret);
}

View File

@ -1191,34 +1191,39 @@ static void esp_semphr_delete(void *semphr)
* Wait semaphore within a certain period of time
*
* Input Parameters:
* semphr - Semaphore data pointer
* ticks - Wait system ticks
* semphr - Semaphore data pointer
* block_time_tick - Wait system ticks
*
* Returned Value:
* True if success or false if fail
*
****************************************************************************/
static int32_t esp_semphr_take(void *semphr, uint32_t ticks)
static int32_t esp_semphr_take(void *semphr, uint32_t block_time_tick)
{
int ret;
sem_t *sem = (sem_t *)semphr;
if (ticks == OSI_FUNCS_TIME_BLOCKING)
if (block_time_tick == OSI_FUNCS_TIME_BLOCKING)
{
ret = nxsem_wait(sem);
if (ret)
{
wlerr("ERROR: Failed to wait sem\n");
}
}
else
{
ret = nxsem_tickwait(sem, ticks);
if (ret)
if (block_time_tick > 0)
{
wlerr("ERROR: Failed to wait sem in %lu ticks\n", ticks);
ret = nxsem_tickwait(sem, block_time_tick);
}
else
{
ret = nxsem_trywait(sem);
}
}
if (ret)
{
wlerr("ERROR: Failed to wait sem in %lu ticks. Error=%d\n",
block_time_tick, ret);
}
return osi_errno_trans(ret);
@ -1271,7 +1276,7 @@ static int32_t esp_semphr_take_from_isr(void *semphr, void *hptw)
{
*(int *)hptw = 0;
return esp_semphr_take(semphr, 0);
return esp_errno_trans(nxsem_trywait(semphr));
}
/****************************************************************************

View File

@ -1192,6 +1192,8 @@ static void semphr_delete_wrapper(void *semphr)
static int IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw)
{
*(int *)hptw = 0;
return esp_errno_trans(nxsem_trywait(semphr));
}
@ -1267,14 +1269,23 @@ static int semphr_take_wrapper(void *semphr, uint32_t block_time_ms)
if (block_time_ms == OSI_FUNCS_TIME_BLOCKING)
{
ret = nxsem_wait(sem);
if (ret)
{
wlerr("Failed to wait sem %d\n", ret);
}
}
else
{
ret = nxsem_tickwait(sem, MSEC2TICK(block_time_ms));
if (block_time_ms > 0)
{
ret = nxsem_tickwait(sem, MSEC2TICK(block_time_ms));
}
else
{
ret = nxsem_trywait(sem);
}
}
if (ret)
{
wlerr("ERROR: Failed to wait sem in %u ticks. Error=%d\n",
MSEC2TICK(block_time_ms), ret);
}
return esp_errno_trans(ret);

View File

@ -1113,34 +1113,39 @@ static void esp_semphr_delete(void *semphr)
* Wait semaphore within a certain period of time
*
* Input Parameters:
* semphr - Semaphore data pointer
* ticks - Wait system ticks
* semphr - Semaphore data pointer
* block_time_tick - Wait system ticks
*
* Returned Value:
* True if success or false if fail
*
****************************************************************************/
static int32_t esp_semphr_take(void *semphr, uint32_t ticks)
static int32_t esp_semphr_take(void *semphr, uint32_t block_time_tick)
{
int ret;
sem_t *sem = (sem_t *)semphr;
if (ticks == OSI_FUNCS_TIME_BLOCKING)
if (block_time_tick == OSI_FUNCS_TIME_BLOCKING)
{
ret = nxsem_wait(sem);
if (ret)
{
wlerr("Failed to wait sem\n");
}
}
else
{
ret = nxsem_tickwait(sem, ticks);
if (ret)
if (block_time_tick > 0)
{
wlerr("Failed to wait sem in %d ticks\n", ticks);
ret = nxsem_tickwait(sem, block_time_tick);
}
else
{
ret = nxsem_trywait(sem);
}
}
if (ret)
{
wlerr("ERROR: Failed to wait sem in %u ticks. Error=%d\n",
block_time_tick, ret);
}
return osi_errno_trans(ret);
@ -1189,11 +1194,11 @@ static int32_t esp_semphr_give(void *semphr)
*
****************************************************************************/
static int32_t esp_semphr_take_from_isr(void *semphr, void *hptw)
static int32_t IRAM_ATTR esp_semphr_take_from_isr(void *semphr, void *hptw)
{
*(int *)hptw = 0;
return esp_semphr_take(semphr, 0);
return osi_errno_trans(nxsem_trywait(semphr));
}
/****************************************************************************
@ -1210,11 +1215,11 @@ static int32_t esp_semphr_take_from_isr(void *semphr, void *hptw)
*
****************************************************************************/
static int32_t esp_semphr_give_from_isr(void *semphr, void *hptw)
static int32_t IRAM_ATTR esp_semphr_give_from_isr(void *semphr, void *hptw)
{
*(int *)hptw = 0;
return esp_semphr_give(semphr);
return osi_errno_trans(nxsem_post(semphr));
}
/****************************************************************************

View File

@ -894,8 +894,9 @@ static void semphr_delete_wrapper(void *semphr)
static int IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw)
{
DEBUGPANIC();
return false;
*(int *)hptw = 0;
return esp_errno_trans(nxsem_trywait(semphr));
}
/****************************************************************************
@ -988,7 +989,8 @@ static int semphr_take_wrapper(void *semphr, uint32_t block_time_ms)
if (ret)
{
wlerr("Failed to take sem error=%d\n", ret);
wlerr("ERROR: Failed to wait sem in %u ticks. Error=%d\n",
MSEC2TICK(block_time_ms), ret);
}
return esp_errno_trans(ret);

View File

@ -1087,34 +1087,39 @@ static void esp_semphr_delete(void *semphr)
* Wait semaphore within a certain period of time
*
* Input Parameters:
* semphr - Semaphore data pointer
* ticks - Wait system ticks
* semphr - Semaphore data pointer
* block_time_tick - Wait system ticks
*
* Returned Value:
* True if success or false if fail
*
****************************************************************************/
static int32_t esp_semphr_take(void *semphr, uint32_t ticks)
static int32_t esp_semphr_take(void *semphr, uint32_t block_time_tick)
{
int ret;
sem_t *sem = (sem_t *)semphr;
if (ticks == OSI_FUNCS_TIME_BLOCKING)
if (block_time_tick == OSI_FUNCS_TIME_BLOCKING)
{
ret = nxsem_wait(sem);
if (ret)
{
wlerr("Failed to wait sem\n");
}
}
else
{
ret = nxsem_tickwait(sem, ticks);
if (ret)
if (block_time_tick > 0)
{
wlerr("Failed to wait sem in %d ticks\n", ticks);
ret = nxsem_tickwait(sem, block_time_tick);
}
else
{
ret = nxsem_trywait(sem);
}
}
if (ret)
{
wlerr("ERROR: Failed to wait sem in %u ticks. Error=%d\n",
block_time_tick, ret);
}
return osi_errno_trans(ret);
@ -2289,7 +2294,7 @@ static int IRAM_ATTR semphr_take_from_isr_wrapper(void *semphr, void *hptw)
{
*(int *)hptw = 0;
return esp_semphr_take(semphr, 0);
return osi_errno_trans(nxsem_trywait(semphr));
}
/****************************************************************************