2020-09-08 10:21:39 +08:00
|
|
|
/*
|
2021-03-11 18:43:57 +08:00
|
|
|
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
|
|
|
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
2020-09-08 10:21:39 +08:00
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
|
|
* are permitted provided that the following conditions are met:
|
|
|
|
*
|
|
|
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
|
|
|
* conditions and the following disclaimer.
|
|
|
|
*
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
|
|
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
|
|
|
* provided with the distribution.
|
|
|
|
*
|
|
|
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
|
|
|
* to endorse or promote products derived from this software without specific prior written
|
|
|
|
* permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
|
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @defgroup los_memory Dynamic memory
|
|
|
|
* @ingroup kernel
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _LOS_MEMORY_H
|
|
|
|
#define _LOS_MEMORY_H
|
|
|
|
|
|
|
|
#include "los_config.h"
|
|
|
|
#include "los_base.h"
|
|
|
|
#include "los_toolchain.h"
|
|
|
|
#include "los_membox.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#if __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
|
|
#ifdef LOSCFG_MEM_LEAKCHECK
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* The omit layers of function call from call kernel memory interfaces
|
|
|
|
* such as LOS_MemAlloc/LOS_MemAllocAlign/LOS_MemRealloc/LOS_MemFree.
|
|
|
|
*/
|
|
|
|
#define LOS_OMIT_LR_CNT 2
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* The recored layes of function call.
|
|
|
|
*/
|
|
|
|
#define LOS_RECORD_LR_CNT 3
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* The start address of exc interaction dynamic memory pool address, when the exc
|
|
|
|
* interaction feature not support, m_aucSysMem0 equals to m_aucSysMem1.
|
|
|
|
*/
|
|
|
|
extern UINT8 *m_aucSysMem0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* The start address of system dynamic memory pool address.
|
|
|
|
*/
|
|
|
|
extern UINT8 *m_aucSysMem1;
|
|
|
|
|
|
|
|
#ifdef LOSCFG_MEM_MUL_POOL
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Deinitialize dynamic memory.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to deinitialize the dynamic memory of a doubly linked list.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] Starting address of memory.
|
|
|
|
*
|
|
|
|
* @retval #OS_ERROR The dynamic memory fails to be deinitialized.
|
|
|
|
* @retval #LOS_OK The dynamic memory is successfully deinitialized.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul>
|
|
|
|
* <li>los_memory.h: the header file that contains the API declaration.</li>
|
|
|
|
* </ul>
|
|
|
|
* @see None.
|
|
|
|
*/
|
|
|
|
extern UINT32 LOS_MemDeInit(VOID *pool);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Print infomation about all pools.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to print infomation about all pools.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @retval #UINT32 The pool number.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul>
|
|
|
|
* <li>los_memory.h: the header file that contains the API declaration.</li>
|
|
|
|
* </ul>
|
|
|
|
* @see None.
|
|
|
|
*/
|
|
|
|
extern UINT32 LOS_MemPoolList(VOID);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* Memory pool extern information structure
|
|
|
|
*/
|
|
|
|
typedef struct {
|
2021-03-11 18:43:57 +08:00
|
|
|
UINT32 totalUsedSize;
|
|
|
|
UINT32 totalFreeSize;
|
|
|
|
UINT32 maxFreeNodeSize;
|
|
|
|
UINT32 usedNodeNum;
|
|
|
|
UINT32 freeNodeNum;
|
2021-06-29 19:34:16 +08:00
|
|
|
#ifdef LOSCFG_MEM_WATERLINE
|
2021-03-11 18:43:57 +08:00
|
|
|
UINT32 usageWaterLine;
|
2020-09-08 10:21:39 +08:00
|
|
|
#endif
|
|
|
|
} LOS_MEM_POOL_STATUS;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Initialize dynamic memory.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to initialize the dynamic memory of a doubly linked list.</li>
|
|
|
|
* </ul>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The size parameter value should match the following two conditions :
|
|
|
|
* 1) Be less than or equal to the Memory pool size;
|
|
|
|
* 2) Be greater than the size of OS_MEM_MIN_POOL_SIZE.</li>
|
|
|
|
* <li>Call this API when dynamic memory needs to be initialized during the startup of Huawei LiteOS.</li>
|
|
|
|
* <li>The parameter input must be four byte-aligned.</li>
|
|
|
|
* <li>The init area [pool, pool + size] should not conflict with other pools.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] Starting address of memory.
|
|
|
|
* @param size [IN] Memory size.
|
|
|
|
*
|
|
|
|
* @retval #OS_ERROR The dynamic memory fails to be initialized.
|
|
|
|
* @retval #LOS_OK The dynamic memory is successfully initialized.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul>
|
|
|
|
* <li>los_memory.h: the header file that contains the API declaration.</li>
|
|
|
|
* </ul>
|
|
|
|
* @see None.
|
|
|
|
*/
|
|
|
|
extern UINT32 LOS_MemInit(VOID *pool, UINT32 size);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Enable memory pool to support dynamic expansion.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to enable the dynamic memory to expand size dynamically.</li>
|
|
|
|
* </ul>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The memory pool is default diabled dynamic expansion.
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] Starting address of memory.
|
|
|
|
*
|
|
|
|
* @retval node.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul>
|
|
|
|
* <li>los_memory.h: the header file that contains the API declaration.</li>
|
|
|
|
* </ul>
|
|
|
|
* @see None.
|
|
|
|
*/
|
|
|
|
extern VOID LOS_MemExpandEnable(VOID *pool);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Allocate dynamic memory.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to allocate a memory block of which the size is specified.</li>
|
|
|
|
* </ul>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
|
|
|
|
* <li>The size of the input parameter size can not be greater than the memory pool size that specified at the second
|
|
|
|
* input parameter of LOS_MemInit.</li>
|
|
|
|
* <li>The size of the input parameter size must be four byte-aligned.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] Pointer to the memory pool that contains the memory block to be allocated.
|
|
|
|
* @param size [IN] Size of the memory block to be allocated (unit: byte).
|
|
|
|
*
|
|
|
|
* @retval #NULL The memory fails to be allocated.
|
|
|
|
* @retval #VOID* The memory is successfully allocated with the starting address of the allocated memory block
|
|
|
|
* returned.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
|
|
|
|
* @see LOS_MemRealloc | LOS_MemAllocAlign | LOS_MemFree
|
|
|
|
*/
|
|
|
|
extern VOID *LOS_MemAlloc(VOID *pool, UINT32 size);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Free dynamic memory.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <li>This API is used to free specified dynamic memory that has been allocated.</li>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
|
|
|
|
* <li>The input ptr parameter must be allocated by LOS_MemAlloc or LOS_MemAllocAlign or LOS_MemRealloc.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] Pointer to the memory pool that contains the dynamic memory block to be freed.
|
|
|
|
* @param ptr [IN] Starting address of the memory block to be freed.
|
|
|
|
*
|
|
|
|
* @retval #LOS_NOK The memory block fails to be freed because the starting address of the memory block is
|
|
|
|
* invalid, or the memory overwriting occurs.
|
|
|
|
* @retval #LOS_OK The memory block is successfully freed.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
|
|
|
|
* @see LOS_MemAlloc | LOS_MemRealloc | LOS_MemAllocAlign
|
|
|
|
*/
|
|
|
|
extern UINT32 LOS_MemFree(VOID *pool, VOID *ptr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Re-allocate a memory block.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to allocate a new memory block of which the size is specified by size if the original memory
|
|
|
|
* block size is insufficient. The new memory block will copy the data in the original memory block of which the
|
|
|
|
* address is specified by ptr. The size of the new memory block determines the maximum size of data to be copied.
|
|
|
|
* After the new memory block is created, the original one is freed.</li>
|
|
|
|
* </ul>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
|
|
|
|
* <li>The input ptr parameter must be allocated by LOS_MemAlloc or LOS_MemAllocAlign.</li>
|
|
|
|
* <li>The size of the input parameter size can not be greater than the memory pool size that specified at the second
|
|
|
|
* input parameter of LOS_MemInit.</li>
|
|
|
|
* <li>The size of the input parameter size must be aligned as follows: 1) if the ptr is allocated by LOS_MemAlloc,
|
|
|
|
* it must be four byte-aligned; 2) if the ptr is allocated by LOS_MemAllocAlign, it must be aligned with the size of
|
|
|
|
* the input parameter boundary of LOS_MemAllocAlign.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] Pointer to the memory pool that contains the original and new memory blocks.
|
|
|
|
* @param ptr [IN] Address of the original memory block.
|
|
|
|
* @param size [IN] Size of the new memory block.
|
|
|
|
*
|
|
|
|
* @retval #NULL The memory fails to be re-allocated.
|
|
|
|
* @retval #VOID* The memory is successfully re-allocated with the starting address of the new memory block returned.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
|
|
|
|
* @see LOS_MemAlloc | LOS_MemAllocAlign | LOS_MemFree
|
|
|
|
*/
|
|
|
|
extern VOID *LOS_MemRealloc(VOID *pool, VOID *ptr, UINT32 size);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Allocate aligned memory.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to allocate memory blocks of specified size and of which the starting addresses are aligned on
|
|
|
|
* a specified boundary.</li>
|
|
|
|
* </ul>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
|
|
|
|
* <li>The size of the input parameter size can not be greater than the memory pool size that specified at the second
|
|
|
|
* input parameter of LOS_MemInit.</li>
|
|
|
|
* <li>The alignment parameter value must be a power of 2 with the minimum value being 4.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] Pointer to the memory pool that contains the memory blocks to be allocated.
|
|
|
|
* @param size [IN] Size of the memory to be allocated.
|
|
|
|
* @param boundary [IN] Boundary on which the memory is aligned.
|
|
|
|
*
|
|
|
|
* @retval #NULL The memory fails to be allocated.
|
|
|
|
* @retval #VOID* The memory is successfully allocated with the starting address of the allocated memory returned.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
|
|
|
|
* @see LOS_MemAlloc | LOS_MemRealloc | LOS_MemFree
|
|
|
|
*/
|
|
|
|
extern VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundary);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Get the size of memory pool's size.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to get the size of memory pool' total size.</li>
|
|
|
|
* </ul>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] A pointer pointed to the memory pool.
|
|
|
|
*
|
|
|
|
* @retval #LOS_NOK The incoming parameter pool is NULL.
|
|
|
|
* @retval #UINT32 The size of the memory pool.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
|
|
|
|
* @see None.
|
|
|
|
*/
|
|
|
|
extern UINT32 LOS_MemPoolSizeGet(const VOID *pool);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Get the size of memory totally used.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to get the size of memory totally used in memory pool.</li>
|
|
|
|
* </ul>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] A pointer pointed to the memory pool.
|
|
|
|
*
|
|
|
|
* @retval #LOS_NOK The incoming parameter pool is NULL.
|
|
|
|
* @retval #UINT32 The size of the memory pool used.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
|
|
|
|
* @see None.
|
|
|
|
*/
|
|
|
|
extern UINT32 LOS_MemTotalUsedGet(VOID *pool);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Get the infomation of memory pool.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to get the infomation of memory pool.</li>
|
|
|
|
* </ul>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] A pointer pointed to the memory pool.
|
|
|
|
* @param poolStatus [IN] A pointer for storage the pool status
|
|
|
|
*
|
|
|
|
* @retval #LOS_NOK The incoming parameter pool is NULL or invalid.
|
|
|
|
* @retval #LOS_OK Success to get memory infomation.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
|
|
|
|
* @see None.
|
|
|
|
*/
|
|
|
|
extern UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Get the number of free node in every size.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to get the number of free node in every size.</li>
|
|
|
|
* </ul>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] A pointer pointed to the memory pool.
|
|
|
|
*
|
|
|
|
* @retval #LOS_NOK The incoming parameter pool is NULL.
|
|
|
|
* @retval #UINT32 The address of the last used node that casts to UINT32.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
|
|
|
|
* @see None.
|
|
|
|
*/
|
|
|
|
extern UINT32 LOS_MemFreeNodeShow(VOID *pool);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @ingroup los_memory
|
|
|
|
* @brief Check the memory pool integrity.
|
|
|
|
*
|
|
|
|
* @par Description:
|
|
|
|
* <ul>
|
|
|
|
* <li>This API is used to check the memory pool integrity.</li>
|
|
|
|
* </ul>
|
|
|
|
* @attention
|
|
|
|
* <ul>
|
|
|
|
* <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
|
|
|
|
* <li>LOS_MemIntegrityCheck will be called by malloc function when the macro of LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK
|
|
|
|
* is defined in LiteOS.</li>
|
|
|
|
* <li>LOS_MemIntegrityCheck function can be called by user anytime.</li>
|
|
|
|
* </ul>
|
|
|
|
*
|
|
|
|
* @param pool [IN] A pointer pointed to the memory pool.
|
|
|
|
*
|
|
|
|
* @retval #LOS_NOK The memory pool (pool) is impaired.
|
|
|
|
* @retval #LOS_OK The memory pool (pool) is integrated.
|
|
|
|
* @par Dependency:
|
|
|
|
* <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
|
|
|
|
* @see None.
|
|
|
|
*/
|
|
|
|
extern UINT32 LOS_MemIntegrityCheck(const VOID *pool);
|
|
|
|
|
|
|
|
extern void *boot_alloc_mem(size_t len);
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#if __cplusplus
|
|
|
|
}
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
|
|
#endif /* _LOS_MEMORY_H */
|