Committer:
donatien
Date:
Thu May 31 15:46:30 2012 +0000
Revision:
0:e6ccf0b3d718

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:e6ccf0b3d718 1 /* Copyright (c) 2012 mbed.org */
donatien 0:e6ccf0b3d718 2 #ifndef MEMORYPOOL_H
donatien 0:e6ccf0b3d718 3 #define MEMORYPOOL_H
donatien 0:e6ccf0b3d718 4
donatien 0:e6ccf0b3d718 5 #include <stdint.h>
donatien 0:e6ccf0b3d718 6 #include <string.h>
donatien 0:e6ccf0b3d718 7
donatien 0:e6ccf0b3d718 8 #include "cmsis_os.h"
donatien 0:e6ccf0b3d718 9
donatien 0:e6ccf0b3d718 10 namespace rtos {
donatien 0:e6ccf0b3d718 11
donatien 0:e6ccf0b3d718 12 /*! Define and manage fixed-size memory pools of objects of a given type.
donatien 0:e6ccf0b3d718 13 \tparam T data type of a single object (element).
donatien 0:e6ccf0b3d718 14 \tparam queue_sz maximum number of objects (elements) in the memory pool.
donatien 0:e6ccf0b3d718 15 */
donatien 0:e6ccf0b3d718 16 template<typename T, uint32_t pool_sz>
donatien 0:e6ccf0b3d718 17 class MemoryPool {
donatien 0:e6ccf0b3d718 18 public:
donatien 0:e6ccf0b3d718 19 /*! Create and Initialize a memory pool. */
donatien 0:e6ccf0b3d718 20 MemoryPool() {
donatien 0:e6ccf0b3d718 21 #ifdef CMSIS_OS_RTX
donatien 0:e6ccf0b3d718 22 memset(_pool_m, 0, sizeof(_pool_m));
donatien 0:e6ccf0b3d718 23 _pool_def.pool = _pool_m;
donatien 0:e6ccf0b3d718 24
donatien 0:e6ccf0b3d718 25 _pool_def.pool_sz = pool_sz;
donatien 0:e6ccf0b3d718 26 _pool_def.item_sz = sizeof(T);
donatien 0:e6ccf0b3d718 27 #endif
donatien 0:e6ccf0b3d718 28 _pool_id = osPoolCreate(&_pool_def);
donatien 0:e6ccf0b3d718 29 }
donatien 0:e6ccf0b3d718 30
donatien 0:e6ccf0b3d718 31 /*! Allocate a memory block of type T from a memory pool.
donatien 0:e6ccf0b3d718 32 \return address of the allocated memory block or NULL in case of no memory available.
donatien 0:e6ccf0b3d718 33 */
donatien 0:e6ccf0b3d718 34 T* alloc(void) {
donatien 0:e6ccf0b3d718 35 return (T*)osPoolAlloc(_pool_id);
donatien 0:e6ccf0b3d718 36 }
donatien 0:e6ccf0b3d718 37
donatien 0:e6ccf0b3d718 38 /*! Allocate a memory block of type T from a memory pool and set memory block to zero.
donatien 0:e6ccf0b3d718 39 \return address of the allocated memory block or NULL in case of no memory available.
donatien 0:e6ccf0b3d718 40 */
donatien 0:e6ccf0b3d718 41 T* calloc(void) {
donatien 0:e6ccf0b3d718 42 return (T*)osPoolCAlloc(_pool_id);
donatien 0:e6ccf0b3d718 43 }
donatien 0:e6ccf0b3d718 44
donatien 0:e6ccf0b3d718 45 /*! Return an allocated memory block back to a specific memory pool.
donatien 0:e6ccf0b3d718 46 \param address of the allocated memory block that is returned to the memory pool.
donatien 0:e6ccf0b3d718 47 \return status code that indicates the execution status of the function.
donatien 0:e6ccf0b3d718 48 */
donatien 0:e6ccf0b3d718 49 osStatus free(T *block) {
donatien 0:e6ccf0b3d718 50 return osPoolFree(_pool_id, (void*)block);
donatien 0:e6ccf0b3d718 51 }
donatien 0:e6ccf0b3d718 52
donatien 0:e6ccf0b3d718 53 private:
donatien 0:e6ccf0b3d718 54 osPoolId _pool_id;
donatien 0:e6ccf0b3d718 55 osPoolDef_t _pool_def;
donatien 0:e6ccf0b3d718 56 #ifdef CMSIS_OS_RTX
donatien 0:e6ccf0b3d718 57 uint32_t _pool_m[3+((sizeof(T)+3)/4)*(pool_sz)];
donatien 0:e6ccf0b3d718 58 #endif
donatien 0:e6ccf0b3d718 59 };
donatien 0:e6ccf0b3d718 60
donatien 0:e6ccf0b3d718 61 }
donatien 0:e6ccf0b3d718 62 #endif