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:
parent
e25fcb3bd5
commit
382debc996
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
Loading…
Reference in New Issue
Block a user