嵌入式---内存分配管理
嵌入式的内存一般都非常的小,最进在学习LWIP协议栈的移植,在正点原子的学习资料中找到了许多关于怎么移植协议栈的东西,其中使用到了内存的分配管理技术,能够高效的管理和使用内存,学习之后整理了放在这里。
一、内存分配管理函数
函数名 | 函数说说明 | 输入、输出 |
memory_int( ) | 内存分配初始化 | 无、无 |
memory_perused(u8 memx) | 内存使用率 | menx-->内存源 |
* memory_malloc(u8 memx,u32 size) | 内存分配函数 | 返回内存块指针 |
void memory_free(u8 memx,void xptr) | 内存释放函数 | Xptr-->释放的内存头指针 |
二、内存分配示意图
三、函数编写
内存管理器 |
Struct _m_mallco_dev { void (*mem_init)(void); u8 (*mem_perused)(void); U8 *membase[SRAMBANK]; u16 *memmap[SRAMBANK]; u8 memrdy[SRAMBANK]; } 1、init,函数指针,指向内存初始化函数。 2、Peruserd,函数指针,指向内存使用率函数。 3、membase,内存池指针,SRAMBANK配置的池子个数。 4、menmap,内存管理表指针,指向内存管理表。多少个池子,就有多少个内存管理表。 5、memrdy,内存管理就绪标志。 6、SRAMBANK内存块片数。 |
内存管理宏定义 |
#define SRAMIN 0 //内部内存池 #define SRMBANK 1 //定义支持的SRAM块数 #define MEM_BLOCK_SIZE 32 //内存块大小 #define MEM_MAX_SIZE 42*1024 //内存池大小 #define MEM_ALLOC_TABLE_SIZE MEM_MAX_SIZE/MEM_BLOCK_SIZE //内存表大小。 |
内存管理数组参数 |
_align(4) u8 membase[MEM_MAX_SIZE]; //内存池(4字节对齐),利用数组开辟空间 u16 memmap[MEM_ALLOC_TABLE_SIZRE]; //内存池map Const u32 memtblsize= MEM_ALLOC_TABLE_SIZE; //内存表大小 Const u32 memblksize= MEM_BLOCK_SIZE; //内存分块大小 Const u32 memsize= MEM_MAX_SIZE; //内存总大小 |
内存管理控制器的初始化 |
struct _m_mallco_dev mallco_dev = { mem_init; //内存初始化 mem_perused; //内存使用率 membase; //内存池 memmap; //内存管理状态表 0 ; //内存管理未就绪 }
|