xhdfzfj的个人空间 https://bbs.21ic.com/?586505 [收藏] [复制] [RSS]

日志

MCU内存分配与管理(3)

已有 210 次阅读2018-9-20 09:26 |系统分类:嵌入式系统

使用固定大小的分配方式,在系统复杂时会出现大量的内存碎片还有可能出现大量的内存浪废。如大量分配了小于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 )。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)