/** * Copyright (c) 2015, Realsil Semiconductor Corporation. All rights reserved. */ #ifndef _OS_POOL_H_ #define _OS_POOL_H_ #include #include #include #ifdef __cplusplus extern "C" { #endif /** * \addtogroup OS OSIF APIs * \defgroup Pool Pool Management * * \brief Manage task-safe and fixed-size blocks of dynamic memory. * \details Memory pools are fixed-size blocks of memory that are task-safe. They operate much * faster than the dynamically allocated heap and do not suffer from fragmentation. * Being task-safe, they can be accessed from tasks and ISRs alike.\n * Shared memory is one of the basic models to exchange information between tasks. * Using memory pools for exchanging data, you can share more complex objects between * taks if compared to the Message Queue. Memory pool management functions are used to * define and manage such fixed-sized memory pools.\n * * \image html OS-pool-overview.jpg "Memory Pool Overview" width=601px height=481px * * \ingroup OS */ /** * os_pool.h * * \brief The invalid pool handle. Valid pool handles should be less than OS_POOL_INVALID_HANDLE. * * \ingroup Pool */ #define OS_POOL_INVALID_HANDLE 0xFF bool os_pool_create_intern(uint8_t *p_handle, RAM_TYPE ram_type, uint16_t buf_size, uint16_t buf_count, const char *p_func, uint32_t file_line); bool os_pool_extend_intern(uint8_t handle, uint16_t buf_size, uint16_t buf_count, const char *p_func, uint32_t file_line); bool os_pool_delete_intern(uint8_t handle, const char *p_func, uint32_t file_line); void *os_buffer_get_intern(uint8_t handle, uint16_t buf_size, const char *p_func, uint32_t file_line); bool os_buffer_put_intern(void *p_buf, const char *p_func, uint32_t file_line); /** * os_pool.h * * \brief Creates and initialize a memory pool. * * \param[out] p_handle Used to pass back a handle by which the memory pool * can be referenced. * * \param[in] ram_type RAM type for the memory pool buffer. * \arg \c RAM_TYPE_DATA_ON Data ON RAM type. * \arg \c RAM_TYPE_DATA_OFF Data OFF RAM type. * \arg \c RAM_TYPE_BUFFER_ON BUFFER ON RAM type. * \arg \c RAM_TYPE_BUFFER_OFF BUFFER OFF RAM type. * * \param[in] buf_size The pool buffer size in bytes. * * \param[in] buf_count The number of pool buffers allocated. * * \return The status of the memory pool creation. * \retval true Pool was created successfully. * \retval false Pool was failed to create. * * Example usage * \code{.c} * #define BUF_SIZE 0x40 * #define BUF_NUM 16 * * int test(void) * { * uint8_t handle; * * // Create a memory pool capable of containing 16 buffers. * if (os_pool_create(&handle, RAM_TYPE_DATA_ON, BUF_SIZE, BUF_NUM) == true) * { * // Memory pool created successfully. * } * else * { * // Memory pool failed to create. * return -1; * } * * return 0; * } * \endcode * * \ingroup Pool */ #define os_pool_create(p_handle, ram_type, buf_size, buf_count) \ os_pool_create_intern(p_handle, ram_type, buf_size, buf_count, __func__, __LINE__) /** * os_pool.h * * \brief Extend a set of buffers to the created memory pool. The extended pool * buffers have the same RAM type with the created buffers. * * \param[in] handle The handle of the created memory pool. * * \param[in] buf_size The pool buffer size in bytes. * * \param[in] buf_count The number of pool buffers allocated. * * \return The status of the memory pool extension. * \retval true Pool was extended successfully. * \retval false Pool was failed to extend. * * Example usage * \code{.c} * #define BUF_SIZE1 0x40 * #define BUF_NUM1 16 * #define BUF_SIZE2 0x20 * #define BUF_NUM2 8 * * int test(void) * { * uint8_t handle; * * // Create a memory pool capable of containing 16 buffers. * if (os_pool_create(&handle, RAM_TYPE_DATA_ON, BUF_SIZE1, BUF_NUM1) == true) * { * // Memory pool created successfully. * } * else * { * // Memory pool failed to create. * return -1; * } * * // Extend the memory pool to have extra 8 buffers each in 0x20 bytes. * os_pool_extend(handle, BUF_SIZE2, BUF_NUM2); * * return 0; * } * \endcode * * \ingroup Pool */ #define os_pool_extend(handle, buf_size, buf_count) \ os_pool_extend_intern(handle, buf_size, buf_count, __func__, __LINE__) /** * os_pool.h * * \brief Delete a memory pool. * * \param[in] handle The handle of the memory pool to be deleted. * * \return The status of the memory pool deletion. * \retval true Pool was deleted successfully. * \retval false Pool was failed to delete. * * Example usage * \code{.c} * #define BUF_SIZE 0x40 * #define BUF_NUM 16 * * int test(void) * { * uint8_t handle; * * // Create a memory pool capable of containing 16 buffers. * if (os_pool_create(&handle, RAM_TYPE_DATA_ON, BUF_SIZE, BUF_NUM) == true) * { * // Memory pool created successfully. * } * else * { * // Memory pool failed to create. * return -1; * } * * // Delete the memory pool. * os_pool_delete(handle); * * return 0; * } * \endcode * * \ingroup Pool */ #define os_pool_delete(handle) os_pool_delete_intern(handle, __func__, __LINE__) /** * os_pool.h * * \brief Allocate a pool buffer from the specified memory pool. The allocated pool * buffer size may be larger than the required size. * * \param[in] handle The handle of the created memory pool. * * \param[in] buf_size The pool buffer size in bytes. * * \return The address of the allocated pool buffer. If the address is NULL, * the buffer allocation failed. * * Example usage * \code{.c} * #define BUF_SIZE1 0x40 * #define BUF_NUM1 16 * #define BUF_SIZE2 0x20 * #define BUF_NUM2 8 * * int test(void) * { * uint8_t handle; * void *p_buf; * * // Create a memory pool capable of containing 16 buffers. * if (os_pool_create(&handle, RAM_TYPE_DATA_ON, BUF_SIZE1, BUF_NUM1) == true) * { * // Memory pool created successfully. * } * else * { * // Memory pool failed to create. * return -1; * } * * // Extend the memory pool to have extra 8 buffers each in 0x20 bytes. * os_pool_extend(handle, BUF_SIZE2, BUF_NUM2); * * // Allocate a pool buffer in 0x30 bytes. While, the memory pool will * // give a buffer in 0x40 bytes. * p_buf = os_buffer_get(handle, 0x30); * * return 0; * } * \endcode * * \ingroup Pool */ #define os_buffer_get(handle, buf_size) \ os_buffer_get_intern(handle, buf_size, __func__, __LINE__) /** * os_pool.h * * \brief Free and return the pool buffer to the specified memory pool. * * \param[in] p_buf The address of the pool buffer allocated by os_buffer_get() * API function. * * \return The status of the pool buffer freeing. * \retval true Pool was freed successfully. * \retval false Pool was failed to free. * * Example usage * \code{.c} * #define BUF_SIZE1 0x40 * #define BUF_NUM1 16 * #define BUF_SIZE2 0x20 * #define BUF_NUM2 8 * * int test(void) * { * uint8_t handle; * void *p_buf; * * // Create a memory pool capable of containing 16 buffers. * if (os_pool_create(&handle, RAM_TYPE_DATA_ON, BUF_SIZE1, BUF_NUM1) == true) * { * // Memory pool created successfully. * } * else * { * // Memory pool failed to create. * return -1; * } * * // Extend the memory pool to have extra 8 buffers each in 0x20 bytes. * os_pool_extend(handle, BUF_SIZE2, BUF_NUM2); * * // Allocate a pool buffer in 0x30 bytes. While, the memory pool will * // give a buffer in 0x40 bytes. * p_buf = os_buffer_get(handle, 0x30); * * // Free the pool buffer by the address. * os_buffer_put(p_buf); * * return 0; * } * \endcode * * \ingroup Pool */ #define os_buffer_put(p_buf) \ os_buffer_put_intern(p_buf, __func__, __LINE__) /** * os_pool.h * * \brief Dump the pool buffers of the specified memory pool. * * \param[in] handle The handle of the memory pool buffer to be dumped. If the * memory pool handle is invalid, all created memory pools * will be dumped. * * \return None. * * Example usage * \code{.c} * #define BUF_SIZE1 0x40 * #define BUF_NUM1 16 * #define BUF_SIZE2 0x20 * #define BUF_NUM2 8 * * int test(void) * { * uint8_t handle; * void *p_buf; * * // Create a memory pool capable of containing 16 buffers. * if (os_pool_create(&handle, RAM_TYPE_DATA_ON, BUF_SIZE1, BUF_NUM1) == true) * { * // Memory pool created successfully. * } * else * { * // Memory pool failed to create. * return -1; * } * * // Extend the memory pool to have extra 8 buffers each in 0x20 bytes. * os_pool_extend(handle, BUF_SIZE2, BUF_NUM2); * * // Allocate a pool buffer in 0x30 bytes. While, the memory pool will * // give a buffer in 0x40 bytes. * p_buf = os_buffer_get(handle, 0x30); * * // Dump the memory pool. * os_pool_dump(handle); * * return 0; * } * \endcode * * \ingroup Pool */ void os_pool_dump(uint8_t handle); #ifdef __cplusplus } #endif #endif /* _OS_POOL_H_ */