UCGUI内存分配分析

UCGUI窗口创建过程都涉及到了内存的分配,那如何分配的呢,先看下面的一张图:

 

从上图可以看出主要由内存池,内存块和一个记录器

1.内存池主要是由在.bss段,而bss段,和未初始化或者初始化为0.Data段数据不占据空间,但占据标识。其形式如下

typedef union

{

  int aintHeap[GUI_ALLOC_SIZE/4];     /* required for proper alignement */

  U8 abHeap[GUI_ALLOC_SIZE];

} GUI_HEAP;

2.内存块:主要是记录分配给窗口句柄的BLOCK在内存池中位移地址,占据大小等,其形式如下:

 

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;

 

3.内存记录器,主要记录着内存使用多少,剩余多少,用了多少内存块,未用的内存块

 

 

了解了大概后,现在分析下UCGUI怎样实现这些的

 

1.从目标机器拿出一块内存,做为内存池,记住要为全局变量且未初始化,因为这关系着程序的大小,定义全局变量GUI_HEAP   GUI_Heap;   (其结构在本文的上端可找出)

 

 

2.在内存池中画出内存块BLOCK个数,其个数根据内存大小来划分,其中有可能剩余,也可能超出

 

 

3.初始化内存记录器,记录现在的内存池里面的情况。并且从内存池中拿出第一块BLOCK用于记录内存对齐,并占据大小为对齐大小的不同而不同。

 

 

4.初始化完毕后,就可以用ALLOC函数开始分配了!

 

 

ALLOC函数的实现步骤如下:

1.       检查是否初始化了内存池所需数据,若未则初始化。

2.       判断所要分配的大小,根据内存对齐的多少决定要分配内存的大小

3.       检查是否大于内存池剩余内存大小,如果超出则不分配

4.       查找出未使用的内存块,若找不到,也无法分配内存

5.       查找之前分配的内存块中,是否有一块其内存字节数和前一个内存字节中间有HOLE,而且这个HOLE刚好大于所需的SIZE,则把它分配成一块新的BLOCK

6.       分配到后面如果内存块的大小不足以分配,则查找是否HOLE,把所有的HOLE集中起来,看是否所有HOLE的大小足以分配

7.       记录内存情况,以及当前BLOCK块的记录!

8.       最后把当前BLOCK初始化为0

struct

{

  int       NumUsedBlocks, NumFreeBlocks, NumFreeBlocksMin;        /* For statistical purposes only */

  tALLOCINT NumUsedBytes,  NumFreeBytes,  NumFreeBytesMin;

} GUI_ALLOC;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UCGUI是一款嵌入式图形用户界面(GUI)软件库,用于在嵌入式系统上实现图形化的用户界面。而makefile是一种用于自动化构建软件项目的脚本文件,通过编写makefile可以指定编译器和编译选项,进行源代码的编译、链接和生成可执行文件。 在使用UCGUI时,通常需要配置相应的makefile文件来进行项目的构建。makefile文件中包含了完成编译和链接的命令和相关编译选项。 对于UCGUI来说,使用makefile的主要目的是为了确保项目的编译和链接过程能够顺利进行,同时能够根据具体的需求进行灵活的配置。 在UCGUI的makefile中,往往会涉及到以下几个方面的配置: 1. 指定编译器和其相关选项:通过在makefile中设置相关的环境变量来指定使用的编译器和其对应的编译选项,以确保编译器能够正确地找到和编译UCGUI的源代码。 2. 指定源代码和库文件的路径:通过在makefile中设置相关的变量来指定UCGUI的源代码和库文件所在的路径,以供编译器在编译和链接过程中正确地引用和链接。 3. 生成可执行文件:通过在makefile中设置相关的命令和规则来告诉make工具如何编译和链接UCGUI的源代码,最终生成可执行文件或者库文件。 总之,UCGUI的makefile配置主要是为了确保在嵌入式系统上能够正确地编译和链接UCGUI的源代码,生成可以在设备上运行的可执行文件或库文件。使用makefile可以提高项目的可维护性和可重复性,并且可以根据不同的需求进行灵活的配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值