It_los_mem.h 6.2 KB
Newer Older
X
x_xiny 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/*
 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
 * Copyright (c) 2020-2021 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.
 */

#ifndef IT_LOS_MEM_H
#define IT_LOS_MEM_H

#ifdef __cplusplus
#if __cplusplus
extern "C" {
R
rtos-lover 已提交
38 39
#endif /* __cplusplus */
#endif /* __cplusplus */
X
x_xiny 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198

#include "osTest.h"
#include "los_memory.h"
#include "los_config.h"
#include "iCunit.h"
#include "math.h"

#define OS_MEM_WATERLINE YES

#ifdef OS_MEM_WATERLINE
#define TEST_MEM_MINIUSE (LOS_DLNK_HEAD_SIZE + LOS_DLNK_NODE_HEAD_SIZE + sizeof(LOS_MEM_POOL_INFO))
#endif

#define TEST_MEM_SIZE 0x2000

#define IS_ALIGNED_SIZE(value, alignSize) (0 == ((UINT32)(value) & (UINT32)((alignSize) - 1)))

#define TEST_POOL_SIZE (1 * 8 * 1024)

#define RANDOM(x) (rand() % (x))

#define LOS_INIT_MEM LOS_MemInit
#define LOS_ALLOC_MEM LOS_MemAlloc
#define LOS_REALLOC_MEM LOS_MemRealloc
#define LOS_FREE_MEM LOS_MemFree

/* Supposing a Second Level Index: SLI = 3. */
#define OS_MEM_SLI 3
/* Giving 1 free list for each small bucket: 4, 8, 12, up to 124. */
#define OS_MEM_SMALL_BUCKET_COUNT 31
#define OS_MEM_SMALL_BUCKET_MAX_SIZE 128
/* Giving OS_MEM_FREE_LIST_NUM free lists for each large bucket. */
#define OS_MEM_LARGE_BUCKET_COUNT 24
#define OS_MEM_FREE_LIST_NUM (1 << OS_MEM_SLI)
/* OS_MEM_SMALL_BUCKET_MAX_SIZE to the power of 2 is 7. */
#define OS_MEM_LARGE_START_BUCKET 7

/* The count of free list. */
#define OS_MEM_FREE_LIST_COUNT (OS_MEM_SMALL_BUCKET_COUNT + (OS_MEM_LARGE_BUCKET_COUNT << OS_MEM_SLI))
/* The bitmap is used to indicate whether the free list is empty, 1: not empty, 0: empty. */
#define OS_MEM_BITMAP_WORDS ((OS_MEM_FREE_LIST_COUNT >> 5) + 1)

struct TestMemNodeHead {
#if (LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK == 1)
    UINT32 magic;
#endif
#if (LOSCFG_MEM_LEAKCHECK == 1)
    UINTPTR linkReg[LOS_RECORD_LR_CNT];
#endif
    union {
        struct TestMemNodeHead *prev; /* The prev is used for current node points to the previous node */
        struct TestMemNodeHead *next; /* The next is used for sentinel node points to the expand node */
    } ptr;
#if (LOSCFG_MEM_FREE_BY_TASKID == 1)
    UINT32 taskID : 6;
    UINT32 sizeAndFlag : 26;
#else
    UINT32 sizeAndFlag;
#endif
};

struct TestMemUsedNodeHead {
    struct TestMemNodeHead header;
};

struct TestMemFreeNodeHead {
    struct TestMemNodeHead header;
    struct TestMemFreeNodeHead *prev;
    struct TestMemFreeNodeHead *next;
};

struct TestMemPoolInfo {
    VOID *pool;
    UINT32 totalSize;
    UINT32 attr;
#if (LOSCFG_MEM_WATERLINE == 1)
    UINT32 waterLine;   /* Maximum usage size in a memory pool */
    UINT32 curUsedSize; /* Current usage size in a memory pool */
#endif
};

struct TestMemPoolHead {
    struct TestMemPoolInfo info;
    UINT32 freeListBitmap[OS_MEM_BITMAP_WORDS];
    struct TestMemFreeNodeHead *freeList[OS_MEM_FREE_LIST_COUNT];
#if (LOSCFG_MEM_MUL_POOL == 1)
    VOID *nextPool;
#endif
};

#define LOS_MEM_NODE_HEAD_SIZE sizeof(struct TestMemUsedNodeHead)
#define MIN_MEM_POOL_SIZE (LOS_MEM_NODE_HEAD_SIZE + sizeof(struct TestMemPoolHead))
#define LOS_MEM_POOL_SIZE sizeof(struct TestMemPoolHead)

extern void *g_memPool;
extern void *g_testPool;

extern void MemStart(void);
extern void MemEnd(void);
extern void MemInit(void);
extern void MemFree(void);
extern UINT32 MemGetFreeSize(void *pool);
extern UINT32 CalPow(UINT32 exp);

VOID ItLosMem001(void);
VOID ItLosMem002(void);
VOID ItLosMem003(void);
VOID ItLosMem004(void);
VOID ItLosMem005(void);
VOID ItLosMem006(void);
VOID ItLosMem007(void);
VOID ItLosMem008(void);
VOID ItLosMem009(void);
VOID ItLosMem010(void);
VOID ItLosMem011(void);
VOID ItLosMem012(void);
VOID ItLosMem013(void);
VOID ItLosMem014(void);
VOID ItLosMem015(void);
VOID ItLosMem016(void);
VOID ItLosMem017(void);
VOID ItLosMem018(void);
VOID ItLosMem019(void);
VOID ItLosMem020(void);
VOID ItLosMem021(void);
VOID ItLosMem022(void);
VOID ItLosMem023(void);
VOID ItLosMem024(void);
VOID ItLosMem025(void);
VOID ItLosMem026(void);
VOID ItLosMem027(void);
VOID ItLosMem028(void);
VOID ItLosMem029(void);
VOID ItLosMem030(void);
VOID ItLosMem031(void);
VOID ItLosMem032(void);
VOID ItLosMem033(void);
VOID ItLosMem035(void);
VOID ItLosMem036(void);
VOID ItLosMem037(void);
VOID ItLosMem038(void);
VOID ItLosMem039(void);
VOID ItLosMem040(void);
VOID ItLosMem041(void);
VOID ItLosMem042(void);
VOID ItLosMem043(void);
VOID ItLosMem044(void);
VOID ItLosMem045(void);
VOID ItLosMem046(void);
VOID ItLosMem047(void);
VOID ItLosMem058(void);
VOID ItLosMem063(void);
VOID ItLosMem064(void);
VOID ItLosMem065(void);
VOID ItLosTick001(void);

#ifdef __cplusplus
#if __cplusplus
}
R
rtos-lover 已提交
199 200
#endif /* __cplusplus */
#endif /* __cplusplus */
X
x_xiny 已提交
201 202

#endif /* IT_LOS_MEM_H */