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