From 144b2d2d735d5b2e25894bdeacef7e03761025ad Mon Sep 17 00:00:00 2001 From: Davide Grohmann Date: Tue, 31 May 2022 15:24:02 +0200 Subject: Refactor message_handler app to be more test friendly Fix importing indexed models, the inclusion of header files was not working. Change-Id: Idab7e002abc31f57acc4eda6a2f1cf2defdfd5c4 --- .../message_handler/lib/core_driver_mutex.cpp | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 applications/message_handler/lib/core_driver_mutex.cpp (limited to 'applications/message_handler/lib/core_driver_mutex.cpp') 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 +#include + +extern "C" { + +void *ethosu_mutex_create(void) { + return xSemaphoreCreateMutex(); +} + +int ethosu_mutex_lock(void *mutex) { + SemaphoreHandle_t handle = reinterpret_cast(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(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(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(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 -- cgit v1.2.1