/* * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. * Copyright (c) 2020-2022 Huawei Device Co., Ltd. All rights reserved. * * 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_list.h" #include "los_debug.h" #ifdef __cplusplus #if __cplusplus extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ #if (LOSCFG_PLATFORM_EXC == 1) UINT32 OsMemExcInfoGet(UINT32 memNumMax, MemInfoCB *memExcInfo); #endif /** * @ingroup los_memory * Starting address of the memory. */ #define OS_SYS_MEM_ADDR LOSCFG_SYS_HEAP_ADDR #if (LOSCFG_MEM_LEAKCHECK == 1) /** * @ingroup los_memory * @brief Print function call stack information of all used nodes. * * @par Description: * * * @param pool [IN] Starting address of memory. * * @retval none. * @par Dependency: * * @see None. */ extern VOID LOS_MemUsedNodeShow(VOID *pool); #endif #if (LOSCFG_MEM_MUL_POOL == 1) /** * @ingroup los_memory * @brief Deinitialize dynamic memory. * * @par Description: * * * @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: * * @see None. */ extern UINT32 LOS_MemDeInit(VOID *pool); /** * @ingroup los_memory * @brief Print information about all pools. * * @par Description: * * * @retval #UINT32 The pool number. * @par Dependency: * * @see None. */ extern UINT32 LOS_MemPoolList(VOID); #endif #if (LOSCFG_MEM_FREE_BY_TASKID == 1) /** * @ingroup los_memory * @brief Free memory nodes allocated by the specified task. * * @par Description: * * * @param pool [IN] The memory pool address. * @param taskID [IN] The task ID and all memory nodes allocated by this task will be freed. * * @retval #OS_ERROR The memory pool is NULL or the task ID is invalid. * @retval #LOS_OK All memory nodes allocated by this task are freed successfully. * @par Dependency: * * @see None. */ extern UINT32 LOS_MemFreeByTaskID(VOID *pool, UINT32 taskID); #endif #if (LOSCFG_MEM_MUL_REGIONS == 1) typedef struct { VOID *startAddress; UINT32 length; } LosMemRegion; /** * @ingroup los_memory * @brief Initialize multiple non-continuous memory regions. * * @par Description: * * * @attention * * * @param pool [IN] The memory pool address. If NULL is specified, the start address of first memory region will be * initialized as the memory pool address. If not NULL, it should be a valid address of a memory pool. * @param memRegions [IN] The LosMemRegion array that contains multiple non-continuous memory regions. The start address * of the memory regions are placed in ascending order. * @param memRegionCount [IN] The count of non-continuous memory regions, and it should be the length of the LosMemRegion array. * * @retval #LOS_NOK The multiple non-continuous memory regions fails to be initialized. * @retval #LOS_OK The multiple non-continuous memory regions is initialized successfully. * @par Dependency: * * @see None. */ extern UINT32 LOS_MemRegionsAdd(VOID *pool, const LosMemRegion * const memRegions, UINT32 memRegionCount); #endif /** * @ingroup los_memory * Memory pool extern information structure */ typedef struct { UINT32 totalUsedSize; UINT32 totalFreeSize; UINT32 maxFreeNodeSize; UINT32 usedNodeNum; UINT32 freeNodeNum; #if (LOSCFG_MEM_WATERLINE == 1) UINT32 usageWaterLine; #endif } LOS_MEM_POOL_STATUS; /** * @ingroup los_memory * @brief Initialize dynamic memory. * * @par Description: * * @attention * * * @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: * * @see None. */ extern UINT32 LOS_MemInit(VOID *pool, UINT32 size); /** * @ingroup los_memory * @brief Allocate dynamic memory. * * @par Description: * * @attention * * * @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: * * @see LOS_MemRealloc | LOS_MemAllocAlign | LOS_MemFree */ extern VOID *LOS_MemAlloc(VOID *pool, UINT32 size); /** * @ingroup los_memory * @brief Free dynamic memory. * * @par Description: *
  • This API is used to free specified dynamic memory that has been allocated.
  • * @attention * * * @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: * * @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: * * @attention * * * @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: * * @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: * * @attention * * * @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: * * @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: * * @attention * * * @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: * * @see None. */ extern UINT32 LOS_MemPoolSizeGet(const VOID *pool); /** * @ingroup los_memory * @brief Get the size of memory totally used. * * @par Description: * * @attention * * * @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: * * @see None. */ extern UINT32 LOS_MemTotalUsedGet(VOID *pool); /** * @ingroup los_memory * @brief Get the information of memory pool. * * @par Description: * * @attention * * * @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 information. * @par Dependency: * * @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: * * @attention * * * @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: * * @see None. */ extern UINT32 LOS_MemFreeNodeShow(VOID *pool); /** * @ingroup los_memory * @brief Check the memory pool integrity. * * @par Description: * * @attention * * * @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: * * @see None. */ extern UINT32 LOS_MemIntegrityCheck(const VOID *pool); /** * @ingroup los_memory * @brief Enable memory pool to support no internal lock during using interfaces. * * @par Description: * * @attention * * * @param pool [IN] Starting address of memory. * * @retval node. * @par Dependency: * * @see None. */ extern VOID LOS_MemUnlockEnable(VOID *pool); extern UINT32 OsMemSystemInit(VOID); extern VOID OsTaskMemUsed(VOID *pool, UINT32 *tskMemInfoBuf, UINT32 tskMemInfoCnt); #ifdef __cplusplus #if __cplusplus } #endif /* __cplusplus */ #endif /* __cplusplus */ #endif /* _LOS_MEMORY_H */