-/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <----\r
-\r
- Copyright (c) 2014-2015 Datalight, Inc.\r
- All Rights Reserved Worldwide.\r
-\r
- This program is free software; you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License as published by\r
- the Free Software Foundation; use version 2 of the License.\r
-\r
- This program is distributed in the hope that it will be useful,\r
- but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty\r
- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- GNU General Public License for more details.\r
-\r
- You should have received a copy of the GNU General Public License along\r
- with this program; if not, write to the Free Software Foundation, Inc.,\r
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
-*/\r
-/* Businesses and individuals that for commercial or other reasons cannot\r
- comply with the terms of the GPLv2 license may obtain a commercial license\r
- before incorporating Reliance Edge into proprietary software for\r
- distribution in any form. Visit http://www.datalight.com/reliance-edge for\r
- more information.\r
-*/\r
-/** @file\r
- @brief Implements a synchronization object to provide mutual exclusion.\r
-*/\r
-#include <FreeRTOS.h>\r
-#include <semphr.h>\r
-\r
-#include <redfs.h>\r
-\r
-#if REDCONF_TASK_COUNT > 1U\r
-\r
-\r
-static SemaphoreHandle_t xMutex;\r
-\r
-\r
-/** @brief Initialize the mutex.\r
-\r
- After initialization, the mutex is in the released state.\r
-\r
- The behavior of calling this function when the mutex is still initialized\r
- is undefined.\r
-\r
- @return A negated ::REDSTATUS code indicating the operation result.\r
-\r
- @retval 0 Operation was successful.\r
-*/\r
-REDSTATUS RedOsMutexInit(void)\r
-{\r
- REDSTATUS ret;\r
-\r
- xMutex = xSemaphoreCreateMutex();\r
- if(xMutex != NULL)\r
- {\r
- ret = 0;\r
- }\r
- else\r
- {\r
- ret = -RED_ENOMEM;\r
- }\r
-\r
- return ret;\r
-}\r
-\r
-\r
-/** @brief Uninitialize the mutex.\r
-\r
- The behavior of calling this function when the mutex is not initialized is\r
- undefined; likewise, the behavior of uninitializing the mutex when it is\r
- in the acquired state is undefined.\r
-\r
- @return A negated ::REDSTATUS code indicating the operation result.\r
-\r
- @retval 0 Operation was successful.\r
-*/\r
-REDSTATUS RedOsMutexUninit(void)\r
-{\r
- vSemaphoreDelete(xMutex);\r
- xMutex = NULL;\r
-\r
- return 0;\r
-}\r
-\r
-\r
-/** @brief Acquire the mutex.\r
-\r
- The behavior of calling this function when the mutex is not initialized is\r
- undefined; likewise, the behavior of recursively acquiring the mutex is\r
- undefined.\r
-*/\r
-void RedOsMutexAcquire(void)\r
-{\r
- while(xSemaphoreTake(xMutex, portMAX_DELAY) != pdTRUE)\r
- {\r
- }\r
-}\r
-\r
-\r
-/** @brief Release the mutex.\r
-\r
- The behavior is undefined in the following cases:\r
-\r
- - Releasing the mutex when the mutex is not initialized.\r
- - Releasing the mutex when it is not in the acquired state.\r
- - Releasing the mutex from a task or thread other than the one which\r
- acquired the mutex.\r
-*/\r
-void RedOsMutexRelease(void)\r
-{\r
- BaseType_t xSuccess;\r
-\r
- xSuccess = xSemaphoreGive(xMutex);\r
- REDASSERT(xSuccess == pdTRUE);\r
- (void)xSuccess;\r
-}\r
-\r
-#endif\r
-\r
+/* ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
+
+ Copyright (c) 2014-2015 Datalight, Inc.
+ All Rights Reserved Worldwide.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; use version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+/* Businesses and individuals that for commercial or other reasons cannot
+ comply with the terms of the GPLv2 license may obtain a commercial license
+ before incorporating Reliance Edge into proprietary software for
+ distribution in any form. Visit http://www.datalight.com/reliance-edge for
+ more information.
+*/
+/** @file
+ @brief Implements a synchronization object to provide mutual exclusion.
+*/
+#include <FreeRTOS.h>
+#include <semphr.h>
+
+#include <redfs.h>
+#include <redosdeviations.h>
+
+#if REDCONF_TASK_COUNT > 1U
+
+
+static SemaphoreHandle_t xMutex;
+#if defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1)
+static StaticSemaphore_t xMutexBuffer;
+#endif
+
+
+/** @brief Initialize the mutex.
+
+ After initialization, the mutex is in the released state.
+
+ The behavior of calling this function when the mutex is still initialized
+ is undefined.
+
+ @return A negated ::REDSTATUS code indicating the operation result.
+
+ @retval 0 Operation was successful.
+*/
+REDSTATUS RedOsMutexInit(void)
+{
+ REDSTATUS ret = 0;
+
+ #if defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1)
+ xMutex = xSemaphoreCreateMutexStatic(&xMutexBuffer);
+
+ if(xMutex == NULL)
+ {
+ /* The only error case for xSemaphoreCreateMutexStatic is that the mutex
+ buffer parameter is NULL, which is not the case.
+ */
+ REDERROR();
+ ret = -RED_EINVAL;
+ }
+
+ #else
+ xMutex = xSemaphoreCreateMutex();
+ if(xMutex == NULL)
+ {
+ ret = -RED_ENOMEM;
+ }
+ #endif
+
+ return ret;
+}
+
+
+/** @brief Uninitialize the mutex.
+
+ The behavior of calling this function when the mutex is not initialized is
+ undefined; likewise, the behavior of uninitializing the mutex when it is
+ in the acquired state is undefined.
+
+ @return A negated ::REDSTATUS code indicating the operation result.
+
+ @retval 0 Operation was successful.
+*/
+REDSTATUS RedOsMutexUninit(void)
+{
+ vSemaphoreDelete(xMutex);
+ xMutex = NULL;
+
+ return 0;
+}
+
+
+/** @brief Acquire the mutex.
+
+ The behavior of calling this function when the mutex is not initialized is
+ undefined; likewise, the behavior of recursively acquiring the mutex is
+ undefined.
+*/
+void RedOsMutexAcquire(void)
+{
+ while(xSemaphoreTake(xMutex, portMAX_DELAY) != pdTRUE)
+ {
+ }
+}
+
+
+/** @brief Release the mutex.
+
+ The behavior is undefined in the following cases:
+
+ - Releasing the mutex when the mutex is not initialized.
+ - Releasing the mutex when it is not in the acquired state.
+ - Releasing the mutex from a task or thread other than the one which
+ acquired the mutex.
+*/
+void RedOsMutexRelease(void)
+{
+ BaseType_t xSuccess;
+
+ xSuccess = xSemaphoreGive(xMutex);
+ REDASSERT(xSuccess == pdTRUE);
+ IGNORE_ERRORS(xSuccess);
+}
+
+#endif
+