• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3  * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without modification,
6  * are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice, this list of
9  *    conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12  *    of conditions and the following disclaimer in the documentation and/or other materials
13  *    provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16  *    to endorse or promote products derived from this software without specific prior written
17  *    permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /**
33  * @defgroup los_memory  Dynamic memory
34  * @ingroup kernel
35  */
36 
37 #ifndef _LOS_MEMORY_H
38 #define _LOS_MEMORY_H
39 
40 #include "los_config.h"
41 #include "los_base.h"
42 #include "los_toolchain.h"
43 #include "los_membox.h"
44 
45 #ifdef __cplusplus
46 #if __cplusplus
47 extern "C" {
48 #endif /* __cplusplus */
49 #endif /* __cplusplus */
50 
51 #ifdef LOSCFG_MEM_LEAKCHECK
52 
53 /**
54  * @ingroup los_memory
55  * The omit layers of function call from call kernel memory interfaces
56  * such as LOS_MemAlloc/LOS_MemAllocAlign/LOS_MemRealloc/LOS_MemFree.
57  */
58 #define LOS_OMIT_LR_CNT 2
59 
60 /**
61  * @ingroup los_memory
62  * The recorded layers of function call.
63  */
64 #define LOS_RECORD_LR_CNT 3
65 #endif
66 
67 /**
68  * @ingroup los_memory
69  * The start address of exc interaction dynamic memory pool address, when the exc
70  * interaction feature not support, m_aucSysMem0 equals to m_aucSysMem1.
71  */
72 extern UINT8 *m_aucSysMem0;
73 
74 /**
75  * @ingroup los_memory
76  * The start address of system dynamic memory pool address.
77  */
78 extern UINT8 *m_aucSysMem1;
79 
80 #ifdef LOSCFG_MEM_MUL_POOL
81 /**
82  * @ingroup los_memory
83  * @brief Deinitialize dynamic memory.
84  *
85  * @par Description:
86  * <ul>
87  * <li>This API is used to deinitialize the dynamic memory of a doubly linked list.</li>
88  * </ul>
89  *
90  * @param pool          [IN] Starting address of memory.
91  *
92  * @retval #OS_ERROR   The dynamic memory fails to be deinitialized.
93  * @retval #LOS_OK     The dynamic memory is successfully deinitialized.
94  * @par Dependency:
95  * <ul>
96  * <li>los_memory.h: the header file that contains the API declaration.</li>
97  * </ul>
98  * @see None.
99  */
100 extern UINT32 LOS_MemDeInit(VOID *pool);
101 
102 /**
103  * @ingroup los_memory
104  * @brief Print information about all pools.
105  *
106  * @par Description:
107  * <ul>
108  * <li>This API is used to print information about all pools.</li>
109  * </ul>
110  *
111  * @retval #UINT32   The pool number.
112  * @par Dependency:
113  * <ul>
114  * <li>los_memory.h: the header file that contains the API declaration.</li>
115  * </ul>
116  * @see None.
117  */
118 extern UINT32 LOS_MemPoolList(VOID);
119 #endif
120 
121 /**
122  * @ingroup los_memory
123  * Memory pool extern information structure
124  */
125 typedef struct {
126     UINT32 totalUsedSize;
127     UINT32 totalFreeSize;
128     UINT32 maxFreeNodeSize;
129     UINT32 usedNodeNum;
130     UINT32 freeNodeNum;
131 #ifdef LOSCFG_MEM_WATERLINE
132     UINT32 usageWaterLine;
133 #endif
134 } LOS_MEM_POOL_STATUS;
135 
136 /**
137  * @ingroup los_memory
138  * @brief Initialize dynamic memory.
139  *
140  * @par Description:
141  * <ul>
142  * <li>This API is used to initialize the dynamic memory of a doubly linked list.</li>
143  * </ul>
144  * @attention
145  * <ul>
146  * <li>The size parameter value should match the following two conditions :
147  * 1) Be less than or equal to the Memory pool size;
148  * 2) Be greater than the size of OS_MEM_MIN_POOL_SIZE.</li>
149  * <li>Call this API when dynamic memory needs to be initialized during the startup of Huawei LiteOS.</li>
150  * <li>The parameter input must be four byte-aligned.</li>
151  * <li>The init area [pool, pool + size] should not conflict with other pools.</li>
152  * </ul>
153  *
154  * @param pool         [IN] Starting address of memory.
155  * @param size         [IN] Memory size.
156  *
157  * @retval #OS_ERROR   The dynamic memory fails to be initialized.
158  * @retval #LOS_OK     The dynamic memory is successfully initialized.
159  * @par Dependency:
160  * <ul>
161  * <li>los_memory.h: the header file that contains the API declaration.</li>
162  * </ul>
163  * @see None.
164  */
165 extern UINT32 LOS_MemInit(VOID *pool, UINT32 size);
166 
167 /**
168  * @ingroup los_memory
169  * @brief Enable memory pool to support dynamic expansion.
170  *
171  * @par Description:
172  * <ul>
173  * <li>This API is used to enable the dynamic memory to expand size dynamically.</li>
174  * </ul>
175  * @attention
176  * <ul>
177  * <li>The memory pool is default diabled dynamic expansion.
178  * </ul>
179  *
180  * @param pool         [IN] Starting address of memory.
181  *
182  * @retval node.
183  * @par Dependency:
184  * <ul>
185  * <li>los_memory.h: the header file that contains the API declaration.</li>
186  * </ul>
187  * @see None.
188  */
189 extern VOID LOS_MemExpandEnable(VOID *pool);
190 
191 /**
192  * @ingroup los_memory
193  * @brief Allocate dynamic memory.
194  *
195  * @par Description:
196  * <ul>
197  * <li>This API is used to allocate a memory block of which the size is specified.</li>
198  * </ul>
199  * @attention
200  * <ul>
201  * <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
202  * <li>The size of the input parameter size can not be greater than the memory pool size that specified at the second
203  * input parameter of LOS_MemInit.</li>
204  * <li>The size of the input parameter size must be four byte-aligned.</li>
205  * </ul>
206  *
207  * @param  pool    [IN] Pointer to the memory pool that contains the memory block to be allocated.
208  * @param  size    [IN] Size of the memory block to be allocated (unit: byte).
209  *
210  * @retval #NULL          The memory fails to be allocated.
211  * @retval #VOID*         The memory is successfully allocated with the starting address of the allocated memory block
212  *                        returned.
213  * @par Dependency:
214  * <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
215  * @see LOS_MemRealloc | LOS_MemAllocAlign | LOS_MemFree
216  */
217 extern VOID *LOS_MemAlloc(VOID *pool, UINT32 size);
218 
219 /**
220  * @ingroup los_memory
221  * @brief Free dynamic memory.
222  *
223  * @par Description:
224  * <li>This API is used to free specified dynamic memory that has been allocated.</li>
225  * @attention
226  * <ul>
227  * <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
228  * <li>The input ptr parameter must be allocated by LOS_MemAlloc or LOS_MemAllocAlign or LOS_MemRealloc.</li>
229  * </ul>
230  *
231  * @param  pool  [IN] Pointer to the memory pool that contains the dynamic memory block to be freed.
232  * @param  ptr   [IN] Starting address of the memory block to be freed.
233  *
234  * @retval #LOS_NOK          The memory block fails to be freed because the starting address of the memory block is
235  *                           invalid, or the memory overwriting occurs.
236  * @retval #LOS_OK           The memory block is successfully freed.
237  * @par Dependency:
238  * <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
239  * @see LOS_MemAlloc | LOS_MemRealloc | LOS_MemAllocAlign
240  */
241 extern UINT32 LOS_MemFree(VOID *pool, VOID *ptr);
242 
243 /**
244  * @ingroup los_memory
245  * @brief Re-allocate a memory block.
246  *
247  * @par Description:
248  * <ul>
249  * <li>This API is used to allocate a new memory block of which the size is specified by size if the original memory
250  * block size is insufficient. The new memory block will copy the data in the original memory block of which the
251  * address is specified by ptr. The size of the new memory block determines the maximum size of data to be copied.
252  * After the new memory block is created, the original one is freed.</li>
253  * </ul>
254  * @attention
255  * <ul>
256  * <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
257  * <li>The input ptr parameter must be allocated by LOS_MemAlloc or LOS_MemAllocAlign.</li>
258  * <li>The size of the input parameter size can not be greater than the memory pool size that specified at the second
259  * input parameter of LOS_MemInit.</li>
260  * <li>The size of the input parameter size must be aligned as follows: 1) if the ptr is allocated by LOS_MemAlloc,
261  * it must be four byte-aligned; 2) if the ptr is allocated by LOS_MemAllocAlign, it must be aligned with the size of
262  * the input parameter boundary of LOS_MemAllocAlign.</li>
263  * </ul>
264  *
265  * @param  pool     [IN] Pointer to the memory pool that contains the original and new memory blocks.
266  * @param  ptr      [IN] Address of the original memory block.
267  * @param  size     [IN] Size of the new memory block.
268  *
269  * @retval #NULL    The memory fails to be re-allocated.
270  * @retval #VOID*   The memory is successfully re-allocated with the starting address of the new memory block returned.
271  * @par Dependency:
272  * <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
273  * @see LOS_MemAlloc | LOS_MemAllocAlign | LOS_MemFree
274  */
275 extern VOID *LOS_MemRealloc(VOID *pool, VOID *ptr, UINT32 size);
276 
277 /**
278  * @ingroup los_memory
279  * @brief Allocate aligned memory.
280  *
281  * @par Description:
282  * <ul>
283  * <li>This API is used to allocate memory blocks of specified size and of which the starting addresses are aligned on
284  * a specified boundary.</li>
285  * </ul>
286  * @attention
287  * <ul>
288  * <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
289  * <li>The size of the input parameter size can not be greater than the memory pool size that specified at the second
290  * input parameter of LOS_MemInit.</li>
291  * <li>The alignment parameter value must be a power of 2 with the minimum value being 4.</li>
292  * </ul>
293  *
294  * @param  pool      [IN] Pointer to the memory pool that contains the memory blocks to be allocated.
295  * @param  size      [IN] Size of the memory to be allocated.
296  * @param  boundary  [IN] Boundary on which the memory is aligned.
297  *
298  * @retval #NULL    The memory fails to be allocated.
299  * @retval #VOID*   The memory is successfully allocated with the starting address of the allocated memory returned.
300  * @par Dependency:
301  * <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
302  * @see LOS_MemAlloc | LOS_MemRealloc | LOS_MemFree
303  */
304 extern VOID *LOS_MemAllocAlign(VOID *pool, UINT32 size, UINT32 boundary);
305 
306 /**
307  * @ingroup los_memory
308  * @brief Get the size of memory pool's size.
309  *
310  * @par Description:
311  * <ul>
312  * <li>This API is used to get the size of memory pool' total size.</li>
313  * </ul>
314  * @attention
315  * <ul>
316  * <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
317  * </ul>
318  *
319  * @param  pool           [IN] A pointer pointed to the memory pool.
320  *
321  * @retval #LOS_NOK        The incoming parameter pool is NULL.
322  * @retval #UINT32         The size of the memory pool.
323  * @par Dependency:
324  * <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
325  * @see None.
326  */
327 extern UINT32 LOS_MemPoolSizeGet(const VOID *pool);
328 
329 /**
330  * @ingroup los_memory
331  * @brief Get the size of memory totally used.
332  *
333  * @par Description:
334  * <ul>
335  * <li>This API is used to get the size of memory totally used in memory pool.</li>
336  * </ul>
337  * @attention
338  * <ul>
339  * <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
340  * </ul>
341  *
342  * @param  pool           [IN] A pointer pointed to the memory pool.
343  *
344  * @retval #LOS_NOK        The incoming parameter pool is NULL.
345  * @retval #UINT32         The size of the memory pool used.
346  * @par Dependency:
347  * <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
348  * @see None.
349  */
350 extern UINT32 LOS_MemTotalUsedGet(VOID *pool);
351 
352 /**
353  * @ingroup los_memory
354  * @brief Get the information of memory pool.
355  *
356  * @par Description:
357  * <ul>
358  * <li>This API is used to get the information of memory pool.</li>
359  * </ul>
360  * @attention
361  * <ul>
362  * <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
363  * </ul>
364  *
365  * @param  pool                 [IN] A pointer pointed to the memory pool.
366  * @param  poolStatus           [IN] A pointer for storage the pool status
367  *
368  * @retval #LOS_NOK           The incoming parameter pool is NULL or invalid.
369  * @retval #LOS_OK            Success to get memory information.
370  * @par Dependency:
371  * <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
372  * @see None.
373  */
374 extern UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus);
375 
376 /**
377  * @ingroup los_memory
378  * @brief Get the number of free node in every size.
379  *
380  * @par Description:
381  * <ul>
382  * <li>This API is used to get the number of free node in every size.</li>
383  * </ul>
384  * @attention
385  * <ul>
386  * <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
387  * </ul>
388  *
389  * @param  pool               [IN] A pointer pointed to the memory pool.
390  *
391  * @retval #LOS_NOK           The incoming parameter pool is NULL.
392  * @retval #UINT32            The address of the last used node that casts to UINT32.
393  * @par Dependency:
394  * <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
395  * @see None.
396  */
397 extern UINT32 LOS_MemFreeNodeShow(VOID *pool);
398 
399 /**
400  * @ingroup los_memory
401  * @brief Check the memory pool integrity.
402  *
403  * @par Description:
404  * <ul>
405  * <li>This API is used to check the memory pool integrity.</li>
406  * </ul>
407  * @attention
408  * <ul>
409  * <li>The input pool parameter must be initialized via func LOS_MemInit.</li>
410  * <li>LOS_MemIntegrityCheck will be called by malloc function when the macro of LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK
411  * is defined in LiteOS.</li>
412  * <li>LOS_MemIntegrityCheck function can be called by user anytime.</li>
413  * </ul>
414  *
415  * @param  pool              [IN] A pointer pointed to the memory pool.
416  *
417  * @retval #LOS_NOK           The memory pool (pool) is impaired.
418  * @retval #LOS_OK            The memory pool (pool) is integrated.
419  * @par Dependency:
420  * <ul><li>los_memory.h: the header file that contains the API declaration.</li></ul>
421  * @see None.
422  */
423 extern UINT32 LOS_MemIntegrityCheck(const VOID *pool);
424 
425 extern void *boot_alloc_mem(size_t len);
426 
427 #ifdef __cplusplus
428 #if __cplusplus
429 }
430 #endif /* __cplusplus */
431 #endif /* __cplusplus */
432 
433 #endif /* _LOS_MEMORY_H */
434