UCGUI 的动态内存分配的原理
了解UCGUI的朋友,一定知道UCGUI中的窗口体系,窗口一般都是由程序动态创建的,那么这当
中当然要用到动态的内存申请,现在我们就来就这个话题进行深入分析,了解UCGUI中的动态内
存分配,是了解其]、[GUI_ALLOC_GetMaxSize]
三、动态内存分配的实现原理
1,首先介绍几个有关动态内存分配的常量及结构。
常量
GUI_ALLOC_SIZE 可用于分配的大小,如开启动态内存分配,在预定义中已经
规定必须大于 0,否则编译无法通。
GUI_ALLOC_AUTDEFRAG 是否进行碎片整理,只有在请求在内存不能满足时才须要将
碎片整理,须将所有已分配内存数据前移,例 如总共大小为 12500,当内配到最后剩 200
字节,但请求800 字节,此时如果定义了碎片整理,则会将之前未用碎片整理出来,将所有已分
配的内存都往前移,将碎片整到后面合成一个大的剩余空间。
GUI_BLOCK_ALIGN 内存分配的对齐值,是为保证每块分配的内存均从对齐粒度
开始,其值为4个字节。如要求29~31字节则实 得32字节,即(29+3)&Oxfffffffc,这是
在 Size2LegalSize 完成的。
GUI_MAXBLOCKS 最多可分的内存块数,是内存分配信息记录数组的大小,它
决定了将内存正好分配完时每块的最小数值, 这个最小数值为 32,在后面中我们称其每一
元素为[内存分配信息节点]
tALLOCINT 记录每块内存偏移内存起始点的依稀的变量类型, 2 字节还
是 4 字节, GUI_ALLOC_SIZE 大于32767 时,要用 四字节类型。
HANDLE 内存块句柄类型,1字节还是2字节,当GUI_MAXBLOCKS大
于256时要用2字节。
#if GUI_ALLOC_SIZE <32767
#define tALLOCINT I16
#else
#define tALLOCINT I32
#endif
#if GUI_MAXBLOCKS >= 256
#define HANDLE U16
#else
#define HANDLE U8
#endif
tALLOCINT, HANDLE的定义会影响到用记载每一块内存的信息结点的大小,即用于动态内存分配 的开消。
结构
记录每个内存块信息的节点结构。
typedef struct {
tALLOCINT Off; /* Offset of memory area */
tALLOCINT Size; /* usable size of allocated block */
HANDLE Next; /* next handle in linked list */
HANDLE Prev;
} tBlock;
[Off]
[Size]
记录此块内存相对整个内存起始点的偏移。
记录此块内存大小。
[Next] 记录此块内存之一下一块内存之指针,其实为这里是指下一块内
存在内存分配信息记录数组中的第几个元素。
[Prev] 记录此块内存之上一内存之指针。
[]
typedef union {
int aintHeap
ucos内存管理分析 来自淘豆网m.daumloan.com转载请标明出处.