62 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			62 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2006-2018, RT-Thread Development Team
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * SPDX-License-Identifier: Apache-2.0
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Change Logs:
							 | 
						||
| 
								 | 
							
								 * Date           Author       Notes
							 | 
						||
| 
								 | 
							
								 * 2018-06-10     Bernard      first version
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef __LWP_MEMHEAP_H__
							 | 
						||
| 
								 | 
							
								#define __LWP_MEMHEAP_H__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdint.h>
							 | 
						||
| 
								 | 
							
								#include <rtthread.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * memory item on the heap
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								struct rt_lwp_memheap_item
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    rt_uint32_t                 magic;                  /**< magic number for memheap */
							 | 
						||
| 
								 | 
							
								    struct rt_lwp_memheap      *pool_ptr;               /**< point of pool */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct rt_lwp_memheap_item *next;                   /**< next memheap item */
							 | 
						||
| 
								 | 
							
								    struct rt_lwp_memheap_item *prev;                   /**< prev memheap item */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct rt_lwp_memheap_item *next_free;              /**< next free memheap item */
							 | 
						||
| 
								 | 
							
								    struct rt_lwp_memheap_item *prev_free;              /**< prev free memheap item */
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Base structure of memory heap object
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								struct rt_lwp_memheap
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    struct rt_object        parent;                     /**< inherit from rt_object */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    void                   *start_addr;                 /**< pool start address and size */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    rt_uint32_t             pool_size;                  /**< pool size */
							 | 
						||
| 
								 | 
							
								    rt_uint32_t             available_size;             /**< available size */
							 | 
						||
| 
								 | 
							
								    rt_uint32_t             max_used_size;              /**< maximum allocated size */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct rt_lwp_memheap_item *block_list;             /**< used block list */
							 | 
						||
| 
								 | 
							
								    struct rt_lwp_memheap_item *free_list;              /**< free block list */
							 | 
						||
| 
								 | 
							
								    struct rt_lwp_memheap_item  free_header;            /**< free block list header */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    struct rt_semaphore     lock;                       /**< semaphore lock */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    rt_list_t mlist;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern rt_err_t rt_lwp_memheap_init(struct rt_lwp_memheap *memheap, const char *name, void *start_addr, rt_uint32_t size);
							 | 
						||
| 
								 | 
							
								extern void *rt_lwp_memheap_alloc(struct rt_lwp_memheap *heap, rt_uint32_t size);
							 | 
						||
| 
								 | 
							
								extern void rt_lwp_memheap_free(void *ptr);
							 | 
						||
| 
								 | 
							
								extern void *rt_lwp_memheap_realloc(struct rt_lwp_memheap *heap, void *ptr, rt_size_t newsize);
							 | 
						||
| 
								 | 
							
								extern rt_bool_t rt_lwp_memheap_is_empty(struct rt_lwp_memheap *memheap);
							 | 
						||
| 
								 | 
							
								extern rt_bool_t rt_lwp_memheap_unavailable_size_get(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |