ucGUI内存管理

来源:互联网 发布:敏感肌肤如何修复知乎 编辑:程序博客网 时间:2024/05/20 11:23

ucGUI内存管理分析

1.      概述

ucGUI为了提高在不同硬件与软件平台的可移植性,它的内存分配没有用到像molloc和free这样的与平台相关的函数。它有自己的一套机制来管理内存。以下详细描述其内存管理机制。

2.      ucGUI需要管理的内存

a)        窗体:

在ucGUI里,所有的控件(control),对话框(Dialog),框架窗体(Frame)实际都是由一个或多个窗体组成,这些窗体对应用的层的表现形式为句柄(Handle),关于这个句柄的含义在下面讲解。在ucGUI窗体管理机制里,每种不同的窗体都有其不同的结构体。因此这些结构体的实例均需要纳入ucGUI的内存管理。

b)        字符串:

几乎所有的窗体上都有多个字符串,这些字符串对应用层的表现形式也为句柄。在ucGUI内部实际是一个普通的字符串,也需要纳入ucGUI的内存管理。

3.      ucGUI内存管理分析

a)        ucGUI定义了一个全局联合体变量来存放他所需要的内存。定义如下:

typedef union {

  int aintHeap[GUI_ALLOC_SIZE / 4];  

  U8 abHeap[GUI_ALLOC_SIZE];

} GUI_HEAP;

之所以这样定义,是为单字节或四字节访问的便利性。实际的大小即为宏定义GUI_ALLOC_SIZE的大小,这个宏定义可根据用户实际使用情况来调节。实际上就是跟应用的复杂度相关。换句话说,就是,实际应用中,创建的窗体越多,界面上需要显示的字符串越多,需要占用的内存就越多。

b)        ucGUI定义了一个全局的结构体内存块数组来管理这块内存。定义如下:

typedef struct {

  GUI_ALLOC_DATATYPE Off;         /*Offset of memory area          */

  GUI_ALLOC_DATATYPE Size;         /*usable size of allocated block */

  HANDLE Next;                               /*next handle in linked list     */

  HANDLE Prev;

} tBlock;

static tBlock aBlock[GUI_MAXBLOCKS];

前面已经描述了ucGUI里需要纳入内存管理的主要是窗体与字符串两部分。每一个窗体与字符串都需要单独的内存块(Block)来管理,他们在应用层的句柄(Handle)即为内存块数组aBlock的索引值。

关于内存块结构体的描述,根据其定义即可看出,Off为其在GUI_HEAP里偏移,Size为其大小,Next为下一个内存块的句柄,Prev为前一个内存块的句柄。可以看出ucGUI将所有的内存块做成的一个双向链表。

内存块的最大个数由GUI_MAXBLOCKS来定义。定义如下:

#define GUI_MAXBLOCKS (2 + GUI_ALLOC_SIZE / 32)

即用GUI_ALLOC_SIZE通过计算得出。

下面我们来分析一下内存块结构体tBlock的大小。先看一个GUI_ALLOC_DATATYPE和HANDLE的定义。

#ifGUI_ALLOC_SIZE <32767

  #define GUI_ALLOC_DATATYPE   I16

  #define GUI_ALLOC_DATATYPE_U U16

#else

  #define GUI_ALLOC_DATATYPE   I32

  #define GUI_ALLOC_DATATYPE_U U32

#endif

 

#ifGUI_MAXBLOCKS >= 256

  #define HANDLE U16

#else

  #define HANDLE U8

#endif

当GUI_ALLOC_SIZE小于32kb时GUI_ALLOC_DATATYPE为两个字节,否则为4个字节。当GUI_MAXBLOCKS大于等于256时,HANDLE为两个字节,否则为1个字节。

所以,tBlock的大小最小为4字节,最大为12字节,实际上都和GUI_ALLOC_SIZE的大小相关。

4.      ucGUI内存管理的实现

对这部分不作过多的描述,因为和对内存的使用的多少没有太多关系。

需要说明的,ucGUI内存管理主要是由上述的结构体来管理。实现了在aBlock这块内存中,动态分配和释放,碎片整理等机制。经过大量的实践,可靠性与效率上还是有一定的保证。

5.      总结

综上所述。ucGUI需要的内存大小主要由上面描述的GUI_HEAP和 tBlock决定。

举个例子,当我们GUI_ALLOC_SIZE将定于为1MB的大小。

ucGUI需要的内存实际大小为:

GUI_ALLOC_SIZE+ sizeof(tBlock) * GUI_MAXBLOCKS  =

1mb + 12 * (2 + 1mb/32) = 1.375mb

原创粉丝点击