aboutsummaryrefslogtreecommitdiffstats
path: root/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2014-10-07 08:24:23 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2014-10-07 08:24:23 +0000
commitdad8b482d9e354103878bd83958236e747213bcc (patch)
tree20eb9bae7f9e08bddbbbf0215f1e5f30215aa581 /os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c
parent66ff6722d223a1fee94c13f2704dda48acc63e8e (diff)
downloadChibiOS-dad8b482d9e354103878bd83958236e747213bcc.tar.gz
ChibiOS-dad8b482d9e354103878bd83958236e747213bcc.tar.bz2
ChibiOS-dad8b482d9e354103878bd83958236e747213bcc.zip
Added pools to CMSIS RTOS.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7381 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c')
-rw-r--r--os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c54
1 files changed, 52 insertions, 2 deletions
diff --git a/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c b/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c
index 9cf601248..16a464777 100644
--- a/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c
+++ b/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c
@@ -30,6 +30,7 @@
*/
#include "cmsis_os.h"
+#include <string.h>
/*===========================================================================*/
/* Module local definitions. */
@@ -346,7 +347,7 @@ int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec) {
osStatus osSemaphoreRelease (osSemaphoreId semaphore_id) {
syssts_t sts = chSysGetStatusAndLockX();
- chSemSignalI((semaphore_t *)semaphore_id);
+ chSemSignalI((semaphore_t *)semaphore_id);
chSysRestoreStatusX(sts);
return osOK;
@@ -402,7 +403,7 @@ osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec) {
osStatus osMutexRelease (osMutexId mutex_id) {
syssts_t sts = chSysGetStatusAndLockX();
- chBSemSignalI((binary_semaphore_t *)mutex_id);
+ chBSemSignalI((binary_semaphore_t *)mutex_id);
chSysRestoreStatusX(sts);
return osOK;
@@ -421,4 +422,53 @@ osStatus osMutexDelete (osMutexId mutex_id) {
return osOK;
}
+/**
+ * @brief Create a memory pool.
+ * @note The pool is not really created because it is allocated statically,
+ * this function just re-initializes it.
+ */
+osPoolId osPoolCreate (const osPoolDef_t *pool_def) {
+
+ chPoolObjectInit(pool_def->pool, (size_t)pool_def->item_sz, NULL);
+ chPoolLoadArray(pool_def->pool, pool_def->items, (size_t)pool_def->pool_sz);
+
+ return (osPoolId)pool_def->pool;
+}
+
+/**
+ * @brief Allocate an object.
+ */
+void *osPoolAlloc (osPoolId pool_id) {
+ void *object;
+
+ syssts_t sts = chSysGetStatusAndLockX();
+ object = chPoolAllocI((memory_pool_t *)pool_id);
+ chSysRestoreStatusX(sts);
+
+ return object;
+}
+
+/**
+ * @brief Allocate an object clearing it.
+ */
+void *osPoolCAlloc (osPoolId pool_id) {
+ void *object;
+
+ object = chPoolAllocI((memory_pool_t *)pool_id);
+ memset(object, 0, pool_id->mp_object_size);
+ return object;
+}
+
+/**
+ * @brief Free an object.
+ */
+osStatus osPoolFree (osPoolId pool_id, void *block) {
+
+ syssts_t sts = chSysGetStatusAndLockX();
+ chPoolFreeI((memory_pool_t *)pool_id, block);
+ chSysRestoreStatusX(sts);
+
+ return osOK;
+}
+
/** @} */