/*
* 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.
*/
#include "los_memory.h"
#include "securec.h"
#include "los_arch.h"
#include "los_config.h"
#include "los_debug.h"
#include "los_hook.h"
#include "los_interrupt.h"
#include "los_task.h"
#ifdef LOSCFG_KERNEL_LMS
#include "los_lms_pri.h"
#endif
#if (LOSCFG_KERNEL_LMK == 1)
#include "los_lmk.h"
#endif
/* Used to cut non-essential functions. */
#define OS_MEM_EXPAND_ENABLE 0
UINT8 *m_aucSysMem0 = NULL;
#if (LOSCFG_SYS_EXTERNAL_HEAP == 0)
STATIC UINT8 g_memStart[LOSCFG_SYS_HEAP_SIZE];
#endif
#if (LOSCFG_MEM_MUL_POOL == 1)
VOID *g_poolHead = NULL;
#endif
/* The following is the macro definition and interface implementation related to the TLSF. */
#define OS_MEM_BITMAP_MASK 0x1FU
/* Used to find the first bit of 1 in bitmap. */
STATIC INLINE UINT16 OsMemFFS(UINT32 bitmap)
{
bitmap &= ~bitmap + 1;
return (OS_MEM_BITMAP_MASK - CLZ(bitmap));
}
/* Used to find the last bit of 1 in bitmap. */
STATIC INLINE UINT16 OsMemFLS(UINT32 bitmap)
{
return (OS_MEM_BITMAP_MASK - CLZ(bitmap));
}
STATIC INLINE UINT32 OsMemLog2(UINT32 size)
{
return (size > 0) ? OsMemFLS(size) : 0;
}
/* Get the first level: f = log2(size). */
STATIC INLINE UINT32 OsMemFlGet(UINT32 size)
{
if (size < OS_MEM_SMALL_BUCKET_MAX_SIZE) {
return ((size >> 2) - 1); /* 2: The small bucket setup is 4. */
}
return (OsMemLog2(size) - OS_MEM_LARGE_START_BUCKET + OS_MEM_SMALL_BUCKET_COUNT);
}
/* Get the second level: s = (size - 2^f) * 2^SLI / 2^f. */
STATIC INLINE UINT32 OsMemSlGet(UINT32 size, UINT32 fl)
{
if ((fl < OS_MEM_SMALL_BUCKET_COUNT) || (size < OS_MEM_SMALL_BUCKET_MAX_SIZE)) {
PRINT_ERR("fl or size is too small, fl = %u, size = %u\n", fl, size);
return 0;
}
UINT32 sl = (size << OS_MEM_SLI) >> (fl - OS_MEM_SMALL_BUCKET_COUNT + OS_MEM_LARGE_START_BUCKET);
return (sl - (1 << OS_MEM_SLI));
}
/* The following is the memory algorithm related macro definition and interface implementation. */
#if (LOSCFG_TASK_MEM_USED != 1 && LOSCFG_MEM_FREE_BY_TASKID == 1 && (LOSCFG_BASE_CORE_TSK_LIMIT + 1) > 64)
#error "When enter here, LOSCFG_BASE_CORE_TSK_LIMIT larger than 63 is not support"
#endif
struct OsMemUsedNodeHead {
struct OsMemNodeHead header;
};
/* The memory pool support expand. */
#define OS_MEM_POOL_EXPAND_ENABLE 0x01
/* The memory pool support no lock. */
#define OS_MEM_POOL_UNLOCK_ENABLE 0x02
#define MEM_LOCK(pool, state) do { \
if (!((pool)->info.attr & OS_MEM_POOL_UNLOCK_ENABLE)) { \
(state) = LOS_IntLock(); \
} \
} while (0);
#define MEM_UNLOCK(pool, state) do { \
if (!((pool)->info.attr & OS_MEM_POOL_UNLOCK_ENABLE)) { \
LOS_IntRestore(state); \
} \
} while (0);
#define OS_MEM_NODE_MAGIC 0xABCDDCBA
#if (LOSCFG_TASK_MEM_USED != 1 && LOSCFG_MEM_FREE_BY_TASKID == 1)
#define OS_MEM_NODE_USED_FLAG (1U << 25)
#define OS_MEM_NODE_ALIGNED_FLAG (1U << 24)
#if (LOSCFG_MEM_LEAKCHECK == 1)
#define OS_MEM_NODE_LEAK_FLAG (1U << 23)
#else
#define OS_MEM_NODE_LEAK_FLAG 0
#endif
#if (OS_MEM_EXPAND_ENABLE == 1)
#define OS_MEM_NODE_LAST_FLAG (1U << 22) /* Sentinel Node */
#else
#define OS_MEM_NODE_LAST_FLAG 0
#endif
#else
#define OS_MEM_NODE_USED_FLAG (1U << 31)
#define OS_MEM_NODE_ALIGNED_FLAG (1U << 30)
#if (LOSCFG_MEM_LEAKCHECK == 1)
#define OS_MEM_NODE_LEAK_FLAG (1U << 29)
#else
#define OS_MEM_NODE_LEAK_FLAG 0
#endif
#if (OS_MEM_EXPAND_ENABLE == 1)
#define OS_MEM_NODE_LAST_FLAG (1U << 28) /* Sentinel Node */
#else
#define OS_MEM_NODE_LAST_FLAG 0
#endif
#endif
#define OS_MEM_NODE_ALIGNED_AND_USED_FLAG \
(OS_MEM_NODE_USED_FLAG | OS_MEM_NODE_ALIGNED_FLAG | OS_MEM_NODE_LEAK_FLAG | OS_MEM_NODE_LAST_FLAG)
#define OS_MEM_NODE_GET_ALIGNED_FLAG(sizeAndFlag) \
((sizeAndFlag) & OS_MEM_NODE_ALIGNED_FLAG)
#define OS_MEM_NODE_SET_ALIGNED_FLAG(sizeAndFlag) \
(sizeAndFlag) = ((sizeAndFlag) | OS_MEM_NODE_ALIGNED_FLAG)
#define OS_MEM_NODE_GET_USED_FLAG(sizeAndFlag) \
((sizeAndFlag) & OS_MEM_NODE_USED_FLAG)
#define OS_MEM_NODE_SET_USED_FLAG(sizeAndFlag) \
(sizeAndFlag) = ((sizeAndFlag) | OS_MEM_NODE_USED_FLAG)
#define OS_MEM_NODE_GET_SIZE(sizeAndFlag) \
((sizeAndFlag) & ~OS_MEM_NODE_ALIGNED_AND_USED_FLAG)
#define OS_MEM_GAPSIZE_USED_FLAG 0x80000000U
#define OS_MEM_GAPSIZE_ALIGNED_FLAG 0x40000000U
#define OS_MEM_GET_ALIGNED_GAPSIZE(gapsize) \
((gapsize) & ~OS_MEM_GAPSIZE_ALIGNED_FLAG)
#define OS_MEM_GET_GAPSIZE_ALIGNED_FLAG(gapsize) \
((gapsize) & OS_MEM_GAPSIZE_ALIGNED_FLAG)
#define OS_MEM_SET_GAPSIZE_ALIGNED_FLAG(gapsize) \
(gapsize) = ((gapsize) | OS_MEM_GAPSIZE_ALIGNED_FLAG)
#define OS_MEM_GET_GAPSIZE_USED_FLAG(gapsize) \
((gapsize) & OS_MEM_GAPSIZE_USED_FLAG)
#define OS_MEM_GAPSIZE_CHECK(gapsize) \
(OS_MEM_GET_GAPSIZE_ALIGNED_FLAG(gapsize) && \
OS_MEM_GET_GAPSIZE_USED_FLAG(gapsize))
#define OS_MEM_NODE_SET_LAST_FLAG(sizeAndFlag) \
(sizeAndFlag) = ((sizeAndFlag) | OS_MEM_NODE_LAST_FLAG)
#define OS_MEM_NODE_GET_LAST_FLAG(sizeAndFlag) \
((sizeAndFlag) & OS_MEM_NODE_LAST_FLAG)
#define OS_MEM_NODE_GET_LEAK_FLAG(sizeAndFlag) \
((sizeAndFlag) & OS_MEM_NODE_LEAK_FLAG)
#define OS_MEM_NODE_SET_LEAK_FLAG(sizeAndFlag) \
(sizeAndFlag) = ((sizeAndFlag) | OS_MEM_NODE_LEAK_FLAG)
#define OS_MEM_ALIGN_SIZE sizeof(UINTPTR)
#define OS_MEM_IS_POW_TWO(value) ((((UINTPTR)(value)) & ((UINTPTR)(value) - 1)) == 0)
#define OS_MEM_ALIGN(p, alignSize) (((UINTPTR)(p) + (alignSize) - 1) & ~((UINTPTR)((alignSize) - 1)))
#define OS_MEM_IS_ALIGNED(a, b) (!(((UINTPTR)(a)) & (((UINTPTR)(b)) - 1)))
#define OS_MEM_NODE_HEAD_SIZE sizeof(struct OsMemUsedNodeHead)
#define OS_MEM_MIN_POOL_SIZE (OS_MEM_NODE_HEAD_SIZE + sizeof(struct OsMemPoolHead))
#define OS_MEM_MIN_LEFT_SIZE sizeof(st
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
OpenHarmony LiteOS-M内核是面向IoT领域构建的轻量级物联网操作系统内核,具有小体积、低功耗、高性能的特点,其代码结构简单,主要包括内核最小功能集、内核抽象层、可选组件以及工程目录等,分为硬件相关层以及硬件无关层,硬件相关层提供统一的HAL(Hardware Abstraction Layer)接口,提升硬件易适配性,不同编译工具链和芯片架构的组合分类,满足AIoT类型丰富的硬件和编译工具链的拓展。
资源推荐
资源详情
资源评论
收起资源包目录
OpenHarmony LiteOS-M内核是面向IoT领域构建的轻量级物联网操作系统内核 (1479个子文件)
los_memory.c 76KB
posix_fs_func_test.c 51KB
los_task.c 49KB
cmsis_liteos2.c 44KB
vfs_fs.c 34KB
pthread_func_test.c 30KB
pthread_cond_func_test.c 28KB
los_queue.c 27KB
vfs_shellcmd.c 26KB
los_dynlink.c 26KB
los_swtmr.c 25KB
fatfs.c 24KB
los_lms.c 24KB
los_cpup.c 23KB
sockets_porting.c 23KB
time.c 22KB
time_func_test_01.c 21KB
los_backtrace.c 21KB
los_interrupt.c 21KB
pthread.c 21KB
los_interrupt.c 21KB
los_interrupt.c 21KB
los_interrupt.c 20KB
los_interrupt.c 20KB
los_interrupt.c 20KB
los_interrupt.c 20KB
los_interrupt.c 20KB
los_interrupt.c 20KB
los_interrupt.c 20KB
los_interrupt.c 20KB
los_interrupt.c 20KB
los_interrupt.c 20KB
los_pm.c 20KB
api_shell.c 19KB
los_sched.c 19KB
mqueue.c 18KB
pipe.c 18KB
los_interrupt.c 18KB
lfs_adapter.c 17KB
los_interrupt.c 17KB
mqueue_func_test.c 16KB
los_interrupt.c 16KB
posix_fs_full_test.c 15KB
shcmd.c 15KB
net_socket_test_011.c 15KB
cmsis_func_test.c 15KB
los_tick.c 14KB
pthread_mutex.c 13KB
math_func_test.c 13KB
driverif.c 13KB
sys_arch.c 12KB
los_signal.c 12KB
los_interrupt.c 12KB
strtol_test.c 12KB
ctype_func_test.c 12KB
strstr_test.c 12KB
memory_func_test.c 12KB
it_los_atomic_011.c 11KB
posix_fs_pressure_test.c 11KB
los_trace.c 11KB
los_sem.c 11KB
string_func_test_01.c 11KB
los_mux.c 11KB
strtoull_test.c 10KB
vfs_mount.c 10KB
strtoul_test.c 10KB
los_exc_info.c 10KB
los_membox.c 10KB
lwip_ifaddrs.c 9KB
trace_cnv.c 9KB
net_socket_test_003.c 9KB
net_fuzz.c 9KB
osTest.c 9KB
pthread_cond.c 9KB
isxdigit_test.c 8KB
atoi_test.c 8KB
semaphore_func_test.c 8KB
trace_offline.c 8KB
posix_fs_lseek_test.c 8KB
It_los_pm_002.c 8KB
string_func_test_03.c 8KB
atoll_test.c 8KB
shmsg.c 8KB
los_secure_heap.c 8KB
los_secure_heap.c 8KB
los_secure_heap.c 8KB
los_secure_heap.c 8KB
atol_test.c 8KB
los_event.c 7KB
los_interrupt.c 7KB
los_mpu.c 7KB
los_mpu.c 7KB
los_mpu.c 7KB
los_mpu.c 7KB
fullpath.c 7KB
pthread_attr.c 7KB
fixme.c 7KB
It_los_pm_003.c 7KB
It_los_swtmr_035.c 7KB
regex_func_test.c 7KB
共 1479 条
- 1
- 2
- 3
- 4
- 5
- 6
- 15
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6746
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功