|
使用固定大小的分配方式,在系统复杂时会出现大量的内存碎片还有可能出现大量的内存浪废。如大量分配了小于64字节的内存块,那么每个固定块中就有64-x的字节被浪废(其中x代表实际请求的大小)。因此我使用了更加灵活的按需请求的分配方式。
我以下的结构作为内存管理的基础结构。在系统启动时建立起两个链表与一个堆空间,Busy链表与Free链表。
typedef struct _ListHeader
{
void * firstElemetSp; //首个元素指针
void * railElementSp; //最后元素指针
}ListHeader;
typedef struct _ListElement
{
void * prevSp;
void * nextSp;
void * contentSp;
uint32_t contentLen;
}ListElement;
typedef struct _MemCtrlCB
{
uint32_t size; //用户使用的内存大小
uint32_t UserMemAddr; //用户使用的内存地址
uint32_t flag; //0表示空闲 1表示被用户使用
}MemCtrlCB;
uin8_t mHeap[Heap_Size]; //系统的堆空间
ListHeader mMemCtrlFreeList; //空闲链表
ListHeader mMemCtrlBusyList; //busy链表
初始化内存分配程序。
mMemCtrlFreeList.firstElementSp = NULL;
mMemCtrlFreeList.railElementSp = NULL;
mMemCtrlBusyList.firstElementSp = NULL;
mMemCtrlBusyList.railElementSp = NULL;
ListElement * _tmpListElmSp;
MemCtrlCB * _tmpMemCB;
tmpListElmSp = ( ListElement * )( &mDoriHeap[ 0 ] );
_tmpListElmSp->contentSp = ( void * )( ( uint8_t * )tmpListElmSp + sizeof( ListElement ) );
tmpMemCB = ( MemCtrlCB * )( _tmpListElmSp->contentSp );
_tmpMemCB->UserMemAddr = ( uint32_t )( ( uint8_t * )tmpMemCB + sizeof( MemCtrlCB ) );
_tmpMemCB->size = HEAP_SIZE - sizeof( MemCtrlCB ) - sizeof( ListElement );
_tmpMemCB->flag = MEM_FREE;
sub_AddList( &mMemCtrlFreeList, _tmpListElmSp );
这样就在内存堆上建立出了一个空闲链表同时Busy链表为空链表。空闲链表中只有一个内存块控制元素,这个内存控制的控制的内存大小为Heap_Size - sizeof( MemCtrlCB ) - sizeof( ListElement )。