diff options
Diffstat (limited to 'applications/message_handler/main.cpp')
-rw-r--r-- | applications/message_handler/main.cpp | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/applications/message_handler/main.cpp b/applications/message_handler/main.cpp index d478ae6..dde5dc5 100644 --- a/applications/message_handler/main.cpp +++ b/applications/message_handler/main.cpp @@ -96,28 +96,53 @@ void *ethosu_mutex_create(void) { return xSemaphoreCreateMutex(); } -void ethosu_mutex_lock(void *mutex) { +int ethosu_mutex_lock(void *mutex) { SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(mutex); - xSemaphoreTake(handle, portMAX_DELAY); + if (xSemaphoreTake(handle, portMAX_DELAY) != pdTRUE) { + printf("Error: Failed to lock mutex.\n"); + return -1; + } + return 0; } -void ethosu_mutex_unlock(void *mutex) { +int ethosu_mutex_unlock(void *mutex) { SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(mutex); - xSemaphoreGive(handle); + if (xSemaphoreGive(handle) != pdTRUE) { + printf("Error: Failed to unlock mutex.\n"); + return -1; + } + return 0; } void *ethosu_semaphore_create(void) { return xSemaphoreCreateBinary(); } -void ethosu_semaphore_take(void *sem) { +int ethosu_semaphore_take(void *sem) { SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(sem); - xSemaphoreTake(handle, portMAX_DELAY); + if (xSemaphoreTake(handle, portMAX_DELAY) != pdTRUE) { + printf("Error: Failed to take semaphore.\n"); + return -1; + } + return 0; } -void ethosu_semaphore_give(void *sem) { +int ethosu_semaphore_give(void *sem) { SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(sem); - xSemaphoreGiveFromISR(handle, NULL); + if (xPortIsInsideInterrupt()) { + if (xSemaphoreGiveFromISR(handle, NULL) != pdTRUE) { + printf("Error: Failed to give semaphore from ISR.\n"); + return -1; + } + } else { + /* A FreeRTOS binary semaphore is fundamentally a queue that can only hold one item. If the queue is full, + * xSemaphoreGive will return a pdFALSE value. Ignoring the return value in here, as a semaphore give failure + * does not affect the application correctness. */ + if (xSemaphoreGive(handle) != pdTRUE) { + // do nothing + } + } + return 0; } } |