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:
daishengdong
2019-10-14 22:09:57 +08:00
parent 98b7434097
commit 3a8b03432f
48 changed files with 267 additions and 78 deletions

View File

@@ -17,7 +17,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x6000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x6000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x1000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x1000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -17,7 +17,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x6000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x6000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x8000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x8000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x6000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x6000
#define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN 1u

View File

@@ -17,7 +17,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x1000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x1000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -17,7 +17,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x6000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x6000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x6000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x6000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x8000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x8000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -17,7 +17,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x6000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x6000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -17,7 +17,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x2000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x2000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x6000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x6000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x400
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x400
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x2000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x2000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x2000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x2000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -13,7 +13,7 @@
#define TOS_CFG_MMHEAP_EN 1u // 配置TencentOS tiny是否开启动态内存模块
#define TOS_CFG_MMHEAP_POOL_SIZE 8192 // 配置TencentOS tiny动态内存池大小
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 8192 // 配置TencentOS tiny动态内存池大小
#define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否开启互斥锁模块

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x3000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x3000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x6000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x6000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -16,7 +16,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x8000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x8000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -7,7 +7,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x8000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x8000
#define TOS_CFG_PWR_MGR_EN 0u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x6000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x6000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,9 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x8000
#define TOS_CFG_MMHEAP_DEFAULT_POOL_EN 1u
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x8000
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -15,7 +15,7 @@
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_POOL_SIZE 0x100
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100
#define TOS_CFG_MUTEX_EN 1u

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View File

@@ -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

View File

@@ -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

View File

@@ -43,7 +43,9 @@ k_fault_log_writer_t k_fault_log_writer = fault_default_log_writer;
#endif
#if TOS_CFG_MMHEAP_EN > 0u
uint8_t k_mmheap_pool[TOS_CFG_MMHEAP_POOL_SIZE] __ALIGNED__(4);
#if TOS_CFG_MMHEAP_DEFAULT_POOL_EN > 0u
uint8_t k_mmheap_default_pool[TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE] __ALIGNED__(4);
#endif
k_mmheap_ctl_t k_mmheap_ctl;
#endif

View File

@@ -135,37 +135,42 @@ __STATIC__ void mapping_search(size_t size, int *fli, int *sli)
mapping_insert(size, fli, sli);
}
__STATIC__ size_t blk_size(const mmheap_blk_t *blk)
__STATIC_INLINE__ size_t blk_size(const mmheap_blk_t *blk)
{
return blk->size & K_MMHEAP_BLOCK_SIZE_MASK;
}
__STATIC__ void blk_set_size(mmheap_blk_t *blk, size_t size)
__STATIC_INLINE__ int blk_is_last(const mmheap_blk_t* blk)
{
return blk_size(blk) == 0;
}
__STATIC_INLINE__ void blk_set_size(mmheap_blk_t *blk, size_t size)
{
blk->size = size | (blk->size & K_MMHEAP_BLOCK_STATE_MASK);
}
__STATIC__ int blk_is_free(const mmheap_blk_t *blk)
__STATIC_INLINE__ int blk_is_free(const mmheap_blk_t *blk)
{
return blk->size & K_MMHEAP_BLOCK_CURR_FREE;
}
__STATIC__ void blk_set_free(mmheap_blk_t *blk)
__STATIC_INLINE__ void blk_set_free(mmheap_blk_t *blk)
{
blk->size |= K_MMHEAP_BLOCK_CURR_FREE;
}
__STATIC__ void blk_set_used(mmheap_blk_t *blk)
__STATIC_INLINE__ void blk_set_used(mmheap_blk_t *blk)
{
blk->size &= ~K_MMHEAP_BLOCK_CURR_FREE;
}
__STATIC__ int blk_is_prev_free(const mmheap_blk_t *blk)
__STATIC_INLINE__ int blk_is_prev_free(const mmheap_blk_t *blk)
{
return blk->size & K_MMHEAP_BLOCK_PREV_FREE;
}
__STATIC__ void blk_set_prev_free(mmheap_blk_t *blk)
__STATIC_INLINE__ void blk_set_prev_free(mmheap_blk_t *blk)
{
blk->size |= K_MMHEAP_BLOCK_PREV_FREE;
}
@@ -175,24 +180,24 @@ __STATIC__ void blk_set_prev_used(mmheap_blk_t *blk)
blk->size &= ~K_MMHEAP_BLOCK_PREV_FREE;
}
__STATIC__ mmheap_blk_t *blk_from_ptr(const void *ptr)
__STATIC_INLINE__ mmheap_blk_t *blk_from_ptr(const void *ptr)
{
return (mmheap_blk_t *)((cpu_addr_t)ptr - K_MMHEAP_BLK_START_OFFSET);
}
__STATIC__ void *blk_to_ptr(const mmheap_blk_t *blk)
__STATIC_INLINE__ void *blk_to_ptr(const mmheap_blk_t *blk)
{
return (void *)((cpu_addr_t)blk + K_MMHEAP_BLK_START_OFFSET);
}
/* Return location of next block after block of given size. */
__STATIC__ mmheap_blk_t *offset_to_block(const void *ptr, int diff)
__STATIC_INLINE__ mmheap_blk_t *offset_to_block(const void *ptr, int diff)
{
return (mmheap_blk_t *)((cpu_addr_t)ptr + diff);
}
/* Return location of previous block. */
__STATIC__ mmheap_blk_t *blk_prev(const mmheap_blk_t *blk)
__STATIC_INLINE__ mmheap_blk_t *blk_prev(const mmheap_blk_t *blk)
{
return blk->prev_phys_blk;
}
@@ -235,17 +240,17 @@ __STATIC__ void blk_mark_as_used(mmheap_blk_t *blk)
blk_set_used(blk);
}
__STATIC__ size_t align_up(size_t x, size_t align)
__STATIC_INLINE__ size_t align_up(size_t x, size_t align)
{
return (x + (align - 1)) & ~(align - 1);
}
__STATIC__ size_t align_down(size_t x, size_t align)
__STATIC_INLINE__ size_t align_down(size_t x, size_t align)
{
return x - (x & (align - 1));
}
__STATIC__ void *align_ptr(const void *ptr, size_t align)
__STATIC_INLINE__ void *align_ptr(const void *ptr, size_t align)
{
return (void *)(((cpu_addr_t)ptr + (align -1)) & ~(align -1));
}
@@ -509,10 +514,52 @@ __STATIC__ void *blk_prepare_used(mmheap_blk_t *blk, size_t size)
return blk_to_ptr(blk);
}
__STATIC_INLINE__ int mmheap_pool_is_full(void)
{
return k_mmheap_ctl.pool_cnt == K_MMHEAP_POOL_MAX;
}
__STATIC__ int mmheap_pool_is_exist(void *pool_start)
{
int i = 0;
for (i = 0; i < k_mmheap_ctl.pool_cnt; ++i) {
if (k_mmheap_ctl.pool_start[i] == pool_start) {
return K_TRUE;
}
}
return K_FALSE;
}
__STATIC_INLINE__ void mmheap_pool_record(void *pool_start)
{
k_mmheap_ctl.pool_start[k_mmheap_ctl.pool_cnt++] = pool_start;
}
__STATIC__ void mmheap_pool_unrecord(void *pool_start)
{
int i = 0;
for (i = 0; i < k_mmheap_ctl.pool_cnt; ++i) {
if (k_mmheap_ctl.pool_start[i] == pool_start) {
break;
}
}
if (i != k_mmheap_ctl.pool_cnt - 1) {
k_mmheap_ctl.pool_start[i] = k_mmheap_ctl.pool_start[k_mmheap_ctl.pool_cnt - 1];
}
--k_mmheap_ctl.pool_cnt;
}
__STATIC__ void mmheap_ctl_init(void)
{
int i, j;
k_mmheap_ctl.pool_cnt = 0u;
for (i = 0; i < K_MMHEAP_POOL_MAX; ++i) {
k_mmheap_ctl.pool_start[i] = (void *)K_NULL;
}
k_mmheap_ctl.block_null.next_free = &k_mmheap_ctl.block_null;
k_mmheap_ctl.block_null.prev_free = &k_mmheap_ctl.block_null;
@@ -525,7 +572,13 @@ __STATIC__ void mmheap_ctl_init(void)
}
}
__KERNEL__ k_err_t mmheap_init(void *pool_start, size_t pool_size)
__KERNEL__ k_err_t mmheap_init(void)
{
mmheap_ctl_init();
return K_ERR_NONE;
}
__KERNEL__ k_err_t mmheap_init_with_pool(void *pool_start, size_t pool_size)
{
mmheap_ctl_init();
@@ -658,6 +711,14 @@ __API__ k_err_t tos_mmheap_pool_add(void *pool_start, size_t pool_size)
mmheap_blk_t *next_blk;
size_t size_aligned;
if (mmheap_pool_is_full()) {
return K_ERR_MMHEAP_POOL_OVERFLOW;
}
if (mmheap_pool_is_exist(pool_start)) {
return K_ERR_MMHEAP_POOL_ALREADY_EXIST;
}
size_aligned = align_down(pool_size - 2 * K_MMHEAP_BLK_HEADER_OVERHEAD, K_MMHEAP_ALIGN_SIZE);
if (((cpu_addr_t)pool_start % K_MMHEAP_ALIGN_SIZE) != 0u) {
@@ -669,11 +730,11 @@ __API__ k_err_t tos_mmheap_pool_add(void *pool_start, size_t pool_size)
return K_ERR_MMHEAP_INVALID_POOL_SIZE;
}
/*
** Create the main free block. Offset the start of the block slightly
** so that the prev_phys_block field falls outside of the pool -
** it will never be used.
*/
/*
** Create the main free block. Offset the start of the block slightly
** so that the prev_phys_block field falls outside of the pool -
** it will never be used.
*/
curr_blk = offset_to_block(pool_start, -K_MMHEAP_BLK_HEADER_OVERHEAD);
blk_set_size(curr_blk, size_aligned);
blk_set_free(curr_blk);
@@ -685,17 +746,75 @@ __API__ k_err_t tos_mmheap_pool_add(void *pool_start, size_t pool_size)
blk_set_size(next_blk, 0);
blk_set_used(next_blk);
blk_set_prev_free(next_blk);
mmheap_pool_record(pool_start);
return K_ERR_NONE;
}
__API__ void tos_mmheap_pool_rmv(void *pool_start)
__API__ k_err_t tos_mmheap_pool_rmv(void *pool_start)
{
int fl = 0, sl = 0;
mmheap_blk_t *blk;
TOS_PTR_SANITY_CHECK(pool_start);
if (!mmheap_pool_is_exist(pool_start)) {
return K_ERR_MMHEAP_POOL_NOT_EXIST;
}
blk = offset_to_block(pool_start, -K_MMHEAP_BLK_HEADER_OVERHEAD);
mapping_insert(blk_size(blk), &fl, &sl);
remove_free_block(blk, fl, sl);
mmheap_pool_unrecord(pool_start);
return K_ERR_NONE;
}
__API__ k_err_t tos_mmheap_pool_check(void *pool_start, k_mmheap_info_t *info)
{
mmheap_blk_t* blk;
TOS_PTR_SANITY_CHECK(pool_start);
TOS_PTR_SANITY_CHECK(info);
memset(info, 0, sizeof(k_mmheap_info_t));
blk = offset_to_block(pool_start, -K_MMHEAP_BLK_HEADER_OVERHEAD);
while (blk && !blk_is_last(blk)) {
if (blk_is_free(blk)) {
info->free += blk_size(blk);
} else {
info->used += blk_size(blk);
}
blk = blk_next(blk);
}
return K_ERR_NONE;
}
__API__ k_err_t tos_mmheap_check(k_mmheap_info_t *info)
{
int i;
k_err_t err;
k_mmheap_info_t pool_info;
TOS_PTR_SANITY_CHECK(info);
memset(info, 0, sizeof(k_mmheap_info_t));
for (i = 0; i < k_mmheap_ctl.pool_cnt; ++i) {
err = tos_mmheap_pool_check(k_mmheap_ctl.pool_start[i], &pool_info);
if (err != K_ERR_NONE) {
return err;
}
info->free += pool_info.free;
info->used += pool_info.used;
}
return K_ERR_NONE;
}
#endif

View File

@@ -26,7 +26,14 @@ __API__ k_err_t tos_knl_init(void)
readyqueue_init();
#if TOS_CFG_MMHEAP_EN > 0
mmheap_init(k_mmheap_pool, TOS_CFG_MMHEAP_POOL_SIZE);
#if TOS_CFG_MMHEAP_DEFAULT_POOL_EN > 0u
err = mmheap_init_with_pool(k_mmheap_default_pool, TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE);
#else
err = mmheap_init();
#endif
if (err != K_ERR_NONE) {
return err;
}
#endif
#if (TOS_CFG_MSG_EN) > 0

View File

@@ -29,7 +29,11 @@ __API__ evtdrv_err_t tos_evtdrv_sys_init(evtdrv_task_entry_t tasks[], evtdrv_ttb
evtdrv_poll = poll;
#if TOS_CFG_MMHEAP_EN > 0
mmheap_init(k_mmheap_pool, TOS_CFG_MMHEAP_POOL_SIZE);
#if TOS_CFG_MMHEAP_DEFAULT_POOL_EN > 0u
mmheap_init_with_pool(k_mmheap_default_pool, TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE);
#else
mmheap_init();
#endif
#else
return EVTDRV_ERR_MMHEAP_NOT_ENABLED;
#endif