diff options
author | Davide Grohmann <davide.grohmann@arm.com> | 2022-05-31 15:24:02 +0200 |
---|---|---|
committer | Kristofer Jonsson <kristofer.jonsson@arm.com> | 2022-06-13 10:35:57 +0000 |
commit | 144b2d2d735d5b2e25894bdeacef7e03761025ad (patch) | |
tree | 39cad431f3f0bbc1491765257d2bd77ddbbf558d /applications/message_handler/lib/core_driver_mutex.cpp | |
parent | 922d2992bbb2dae379bde9b16a3714e19b698dc5 (diff) | |
download | ethos-u-core-platform-144b2d2d735d5b2e25894bdeacef7e03761025ad.tar.gz |
Refactor message_handler app to be more test friendly
Fix importing indexed models, the inclusion of header files was not
working.
Change-Id: Idab7e002abc31f57acc4eda6a2f1cf2defdfd5c4
Diffstat (limited to 'applications/message_handler/lib/core_driver_mutex.cpp')
-rw-r--r-- | applications/message_handler/lib/core_driver_mutex.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/applications/message_handler/lib/core_driver_mutex.cpp b/applications/message_handler/lib/core_driver_mutex.cpp new file mode 100644 index 0000000..bc043fa --- /dev/null +++ b/applications/message_handler/lib/core_driver_mutex.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2022 Arm Limited. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined(ETHOSU) + +#include "FreeRTOS.h" +#include "semphr.h" + +#include <ethosu_driver.h> +#include <stdio.h> + +extern "C" { + +void *ethosu_mutex_create(void) { + return xSemaphoreCreateMutex(); +} + +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; +} + +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) { + return xSemaphoreCreateBinary(); +} + +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; +} + +int ethosu_semaphore_give(void *sem) { + SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(sem); + 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; +} +} + +#endif |