aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--applications/freertos/main.cpp33
-rw-r--r--applications/message_handler/main.cpp41
-rw-r--r--applications/threadx_demo/main.cpp20
3 files changed, 64 insertions, 30 deletions
diff --git a/applications/freertos/main.cpp b/applications/freertos/main.cpp
index 81631ef..1e71e7f 100644
--- a/applications/freertos/main.cpp
+++ b/applications/freertos/main.cpp
@@ -120,18 +120,22 @@ void *ethosu_mutex_create(void) {
return (void *)sem;
}
-void ethosu_mutex_lock(void *mutex) {
+int ethosu_mutex_lock(void *mutex) {
SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(mutex);
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);
if (xSemaphoreGive(handle) != pdTRUE) {
printf("Error: Failed to unlock mutex.\n");
+ return -1;
}
+ return 0;
}
void *ethosu_semaphore_create(void) {
@@ -142,31 +146,32 @@ void *ethosu_semaphore_create(void) {
return (void *)sem;
}
-void ethosu_semaphore_take(void *sem) {
+int ethosu_semaphore_take(void *sem) {
SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(sem);
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);
- BaseType_t ret;
if (xPortIsInsideInterrupt()) {
- ret = xSemaphoreGiveFromISR(handle, NULL);
- if (ret != pdTRUE) {
- printf("Error: Failed to give semaphore from ISR. ret - 0x%08lx\n", ret);
+ if (xSemaphoreGiveFromISR(handle, NULL) != pdTRUE) {
+ printf("Error: Failed to give semaphore from ISR.\n");
+ return -1;
}
} else {
- ret = xSemaphoreGive(handle);
- if (ret != pdTRUE) {
- /* The next line is in comment because xSemaphoreGive returns pdFAIL when
- calling it twice in a row during this application run.
- This failure doesn't affect the final result of the FreeRTOS application. */
- /* printf("Error: Failed to give semaphore. ret - 0x%08x\n", ret); */
+ /* 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;
}
}
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;
}
}
diff --git a/applications/threadx_demo/main.cpp b/applications/threadx_demo/main.cpp
index bf65085..cbf1661 100644
--- a/applications/threadx_demo/main.cpp
+++ b/applications/threadx_demo/main.cpp
@@ -144,22 +144,24 @@ void *ethosu_mutex_create(void) {
return (void *)mutex;
}
-void ethosu_mutex_lock(void *mutex) {
+int ethosu_mutex_lock(void *mutex) {
UINT status;
status = tx_mutex_get(reinterpret_cast<TX_MUTEX *>(mutex), TX_WAIT_FOREVER);
if (status != TX_SUCCESS) {
printf("mutex get failed, error - %d\n", status);
+ return -1;
}
- return;
+ return 0;
}
-void ethosu_mutex_unlock(void *mutex) {
+int ethosu_mutex_unlock(void *mutex) {
UINT status;
status = tx_mutex_put(reinterpret_cast<TX_MUTEX *>(mutex));
if (status != TX_SUCCESS) {
printf("mutex put failed, error - %d\n", status);
+ return -1;
}
- return;
+ return 0;
}
void *ethosu_semaphore_create(void) {
@@ -176,28 +178,30 @@ void *ethosu_semaphore_create(void) {
return (void *)semaphore;
}
-void ethosu_semaphore_take(void *sem) {
+int ethosu_semaphore_take(void *sem) {
UINT status;
status = tx_semaphore_get(reinterpret_cast<TX_SEMAPHORE *>(sem), TX_WAIT_FOREVER);
if (status != TX_SUCCESS) {
printf("Semaphore get/take, error - %d\n", status);
+ return -1;
}
- return;
+ return 0;
}
-void ethosu_semaphore_give(void *sem) {
+int ethosu_semaphore_give(void *sem) {
UINT status;
status = tx_semaphore_put(reinterpret_cast<TX_SEMAPHORE *>(sem));
if (status != TX_SUCCESS) {
printf("Semaphore put/give, error - %d\n", status);
+ return -1;
}
- return;
+ return 0;
}
}