add tos_mmheap_check & tos_mmheap_pool_check API and TOS_CFG_MMHEAP_DEFAULT_POOL_EN switch
tos_mmheap_check: get the information of the heap(space that is free and used) tos_mmheap_pool_check: get the information of a pool TOS_CFG_MMHEAP_DEFAULT_POOL_EN: enable the default pool of the heap(if user not set this, a default of 1u is set). if you wanna disable the default pool, you should call tos_mmheap_pool_add to add your own pool of the heap before tos_mmheap_alloc is called.
This commit is contained in:
@@ -28,6 +28,12 @@
|
||||
#error "INVALID config, tickless not supported in event-driven yet"
|
||||
#endif
|
||||
|
||||
#if (TOS_CFG_MMHEAP_EN > 0u) && (TOS_CFG_MMHEAP_DEFAULT_POOL_EN > 0u)
|
||||
#if !defined(TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE) || (TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE == 0u)
|
||||
#error "INVALID config, must define a valid TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#else /* TOS_CFG_EVENT_DRIVEN_EN */
|
||||
|
||||
#if TOS_CFG_TASK_PRIO_MAX < 8u
|
||||
@@ -42,6 +48,12 @@
|
||||
#error "UNDECLARED config, TOS_CFG_TIMER_AS_PROC"
|
||||
#endif
|
||||
|
||||
#if (TOS_CFG_MMHEAP_EN > 0u) && (TOS_CFG_MMHEAP_DEFAULT_POOL_EN > 0u)
|
||||
#if !defined(TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE) || (TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE == 0u)
|
||||
#error "INVALID config, must define a valid TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if (TOS_CFG_VFS_EN > 0u) && (TOS_CFG_MMHEAP_EN == 0u)
|
||||
#error "INVALID config, must enable tos_mmheap to use tos_vfs"
|
||||
#endif
|
||||
|
@@ -111,8 +111,8 @@
|
||||
#define TOS_CFG_MMHEAP_EN 1u
|
||||
#endif
|
||||
|
||||
#if (TOS_CFG_MMHEAP_EN > 0u) && !defined(TOS_CFG_MMHEAP_POOL_SIZE)
|
||||
#define TOS_CFG_MMHEAP_POOL_SIZE 0x1000
|
||||
#ifndef TOS_CFG_MMHEAP_DEFAULT_POOL_EN
|
||||
#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN 1u
|
||||
#endif
|
||||
/////////////////////////////////////////
|
||||
|
||||
@@ -198,10 +198,6 @@
|
||||
#define TOS_CFG_COMPLETION_EN 0u
|
||||
#endif
|
||||
|
||||
#ifndef TOS_CFG_MMHEAP_EN
|
||||
#define TOS_CFG_MMHEAP_EN 0u
|
||||
#endif
|
||||
|
||||
#if (TOS_CFG_QUEUE_EN > 0u) && !defined(TOS_CFG_MSG_EN)
|
||||
#define TOS_CFG_MSG_EN 1u
|
||||
#elif (TOS_CFG_QUEUE_EN == 0u) && !defined(TOS_CFG_MSG_EN)
|
||||
@@ -260,8 +256,8 @@
|
||||
#define TOS_CFG_MMHEAP_EN 0u
|
||||
#endif
|
||||
|
||||
#if (TOS_CFG_MMHEAP_EN > 0u) && !defined(TOS_CFG_MMHEAP_POOL_SIZE)
|
||||
#define TOS_CFG_MMHEAP_POOL_SIZE 0x1000
|
||||
#ifndef TOS_CFG_MMHEAP_DEFAULT_POOL_EN
|
||||
#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN 1u
|
||||
#endif
|
||||
|
||||
#ifndef TOS_CFG_PWR_MGR_EN
|
||||
|
@@ -47,6 +47,9 @@ typedef enum k_err_en {
|
||||
|
||||
K_ERR_MMHEAP_INVALID_POOL_ADDR = 800u,
|
||||
K_ERR_MMHEAP_INVALID_POOL_SIZE,
|
||||
K_ERR_MMHEAP_POOL_OVERFLOW,
|
||||
K_ERR_MMHEAP_POOL_ALREADY_EXIST,
|
||||
K_ERR_MMHEAP_POOL_NOT_EXIST,
|
||||
|
||||
K_ERR_MSG_QUEUE_FULL = 900u,
|
||||
K_ERR_MSG_QUEUE_EMPTY,
|
||||
|
@@ -60,7 +60,9 @@ extern k_fault_log_writer_t k_fault_log_writer;
|
||||
#endif
|
||||
|
||||
#if TOS_CFG_MMHEAP_EN > 0u
|
||||
extern uint8_t k_mmheap_pool[] __ALIGNED__(4);
|
||||
#if TOS_CFG_MMHEAP_DEFAULT_POOL_EN > 0u
|
||||
extern uint8_t k_mmheap_default_pool[] __ALIGNED__(4);
|
||||
#endif
|
||||
extern k_mmheap_ctl_t k_mmheap_ctl;
|
||||
#endif
|
||||
|
||||
|
@@ -90,6 +90,11 @@
|
||||
#define K_MMHEAP_BLOCK_SIZE_MASK ~(K_MMHEAP_BLOCK_CURR_FREE | K_MMHEAP_BLOCK_PREV_FREE)
|
||||
#define K_MMHEAP_BLOCK_STATE_MASK (K_MMHEAP_BLOCK_CURR_FREE | K_MMHEAP_BLOCK_PREV_FREE)
|
||||
|
||||
typedef struct k_mmheap_information_st {
|
||||
uint32_t used; /* space is used */
|
||||
uint32_t free; /* space is free */
|
||||
} k_mmheap_info_t;
|
||||
|
||||
/**
|
||||
* Block structure.
|
||||
*
|
||||
@@ -120,10 +125,15 @@ typedef struct mmheap_blk_st {
|
||||
#define K_MMHEAP_BLK_HEADER_OVERHEAD (sizeof(size_t))
|
||||
#define K_MMHEAP_BLK_START_OFFSET (TOS_OFFSET_OF_FIELD(mmheap_blk_t, size) + sizeof(size_t))
|
||||
|
||||
#define K_MMHEAP_POOL_MAX 3
|
||||
|
||||
/**
|
||||
* memory heap control
|
||||
*/
|
||||
typedef struct k_mmheap_control_st {
|
||||
int pool_cnt;
|
||||
void *pool_start[K_MMHEAP_POOL_MAX];
|
||||
|
||||
mmheap_blk_t block_null; /**< Empty lists point at this block to indicate they are free. */
|
||||
|
||||
uint32_t fl_bitmap; /**< Bitmaps for free lists. */
|
||||
@@ -142,9 +152,11 @@ typedef struct k_mmheap_control_st {
|
||||
* @param[in] pool_size size of the pool.
|
||||
*
|
||||
* @return errcode
|
||||
* @retval #K_ERR_MMHEAP_INVALID_POOL_ADDR start address of the pool is invalid.
|
||||
* @retval #K_ERR_MMHEAP_INVALID_POOL_SIZE size of the pool is invalid.
|
||||
* @retval #K_ERR_NONE return successfully.
|
||||
* @retval #K_ERR_MMHEAP_INVALID_POOL_ADDR start address of the pool is invalid.
|
||||
* @retval #K_ERR_MMHEAP_INVALID_POOL_SIZE size of the pool is invalid.
|
||||
* @retval #K_ERR_MMHEAP_POOL_OVERFLOW too many pools are added.
|
||||
* @retval #K_ERR_MMHEAP_POOL_ALREADY_EXIST the pool is already exist.
|
||||
* @retval #K_ERR_NONE return successfully.
|
||||
*/
|
||||
__API__ k_err_t tos_mmheap_pool_add(void *pool_start, size_t pool_size);
|
||||
|
||||
@@ -156,9 +168,12 @@ __API__ k_err_t tos_mmheap_pool_add(void *pool_start, size_t pool_size);
|
||||
*
|
||||
* @param[in] pool_start start address of the pool.
|
||||
*
|
||||
* @return None
|
||||
* @return errcode
|
||||
* @retval #K_ERR_OBJ_PTR_NULL start address of the pool is NULL
|
||||
* @retval #K_ERR_MMHEAP_POOL_NOT_EXIST the pool is not exist
|
||||
* @retval #K_ERR_NONE return successfully.
|
||||
*/
|
||||
__API__ void tos_mmheap_pool_rmv(void *pool_start);
|
||||
__API__ k_err_t tos_mmheap_pool_rmv(void *pool_start);
|
||||
|
||||
/**
|
||||
* @brief Alloc memory.
|
||||
@@ -216,7 +231,34 @@ __API__ void *tos_mmheap_realloc(void *ptr, size_t size);
|
||||
*/
|
||||
__API__ void tos_mmheap_free(void *ptr);
|
||||
|
||||
__KERNEL__ k_err_t mmheap_init(void *pool_start, size_t pool_size);
|
||||
/**
|
||||
* @brief Check the pool.
|
||||
*
|
||||
* @attention
|
||||
*
|
||||
* @param[in] pool_start start address of the pool.
|
||||
* @param[out] info pointer to the information struct.
|
||||
*
|
||||
* @return errcode.
|
||||
* @retval #K_ERR_NONE return successfully.
|
||||
*/
|
||||
__API__ k_err_t tos_mmheap_pool_check(void *pool_start, k_mmheap_info_t *info);
|
||||
|
||||
/**
|
||||
* @brief Check the heap.
|
||||
*
|
||||
* @attention
|
||||
*
|
||||
* @param[out] info pointer to the information struct.
|
||||
*
|
||||
* @return errcode.
|
||||
* @retval #K_ERR_NONE return successfully.
|
||||
*/
|
||||
__API__ k_err_t tos_mmheap_check(k_mmheap_info_t *info);
|
||||
|
||||
__KERNEL__ k_err_t mmheap_init(void);
|
||||
|
||||
__KERNEL__ k_err_t mmheap_init_with_pool(void *pool_start, size_t pool_size);
|
||||
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user