From dad8b482d9e354103878bd83958236e747213bcc Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 7 Oct 2014 08:24:23 +0000 Subject: [PATCH] Added pools to CMSIS RTOS. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7381 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/rt/ports/ARMCMx/cmsis_os/cmsis_os.c | 54 +++++++++++++++++++++- os/rt/ports/ARMCMx/cmsis_os/cmsis_os.h | 62 +++++++++++++++++++++----- 2 files changed, 104 insertions(+), 12 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 /*===========================================================================*/ /* 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; +} + /** @} */ diff --git a/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.h b/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.h index 6de5830dd..66ceb2465 100644 --- a/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.h +++ b/os/rt/ports/ARMCMx/cmsis_os/cmsis_os.h @@ -60,7 +60,7 @@ * @{ */ #define osFeature_MainThread 1 -#define osFeature_Pool 0 +#define osFeature_Pool 1 #define osFeature_MailQ 0 #define osFeature_MessageQ 0 #define osFeature_Signals 31 @@ -170,7 +170,7 @@ typedef enum { /** * @brief Type of a timer mode. */ -typedef enum { +typedef enum { osTimerOnce = 0, osTimerPeriodic = 1 } os_timer_type; @@ -211,26 +211,31 @@ typedef binary_semaphore_t *osMutexId; */ typedef semaphore_t *osSemaphoreId; +/** + * @brief Type of pointer to memory pool control block. + */ +typedef memory_pool_t *osPoolId; + /** * @brief Type of an event. */ -typedef struct { +typedef struct { osStatus status; union { uint32_t v; void *p; int32_t signals; } value; -/* union { - osMailQId mail_id; + union { +/* osMailQId mail_id;*/ osMessageQId message_id; - } def;*/ + } def; } osEvent; /** * @brief Type of a thread definition block. */ -typedef struct os_thread_def { +typedef struct os_thread_def { os_pthread pthread; osPriority tpriority; uint32_t stacksize; @@ -239,24 +244,34 @@ typedef struct os_thread_def { /** * @brief Type of a timer definition block. */ -typedef struct os_timer_def { +typedef struct os_timer_def { os_ptimer ptimer; } osTimerDef_t; /** * @brief Type of a mutex definition block. */ -typedef struct os_mutex_def { +typedef struct os_mutex_def { uint32_t dummy; } osMutexDef_t; /** * @brief Type of a semaphore definition block. */ -typedef struct os_semaphore_def { +typedef struct os_semaphore_def { uint32_t dummy; } osSemaphoreDef_t; +/** + * @brief Type of a memory pool definition block. + */ +typedef struct os_pool_def { + uint32_t pool_sz; + uint32_t item_sz; + memory_pool_t *pool; + void *items; +} osPoolDef_t; + /*===========================================================================*/ /* Module macros. */ /*===========================================================================*/ @@ -336,6 +351,29 @@ const osTimerDef_t os_timer_def_##name = { \ */ #define osSemaphore(name) &os_semaphore_def_##name +/** + * @brief Define a Memory Pool. + */ +#if defined(osObjectsExternal) +#define osPoolDef(name, no, type) \ + extern const osPoolDef_t os_pool_def_##name +#else +#define osPoolDef(name, no, type) \ +static const type os_pool_buf_##name[no]; \ +static memory_pool_t os_pool_obj_##name; \ +const osPoolDef_t os_pool_def_##name = { \ + (no), \ + sizeof (type), \ + (void *)&os_pool_obj_##name, \ + (void *)&os_pool_buf_##name[0] \ +} +#endif + +/** + * @brief Access a Memory Pool definition. + */ +#define osPool(name) &os_pool_def_##name + /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ @@ -369,6 +407,10 @@ extern "C" { osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec); osStatus osMutexRelease (osMutexId mutex_id); osStatus osMutexDelete (osMutexId mutex_id); + osPoolId osPoolCreate (const osPoolDef_t *pool_def); + void *osPoolAlloc (osPoolId pool_id); + void *osPoolCAlloc (osPoolId pool_id); + osStatus osPoolFree (osPoolId pool_id, void *block); #ifdef __cplusplus } #endif