ucGUI内存管理

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】TCP和UDP的区别

TCP协议与UDP协议的区别 首先咱们弄清楚&#xff0c;TCP协议和UDP协议与TCP/IP协议的联系&#xff0c;很多人犯糊涂了&#xff0c; 一直都是说TCP协议与UDP协议的区别&#xff0c;我觉得这是没有从本质上弄清楚网络通信&#xff01; TCP/IP协议是一个协议簇。里面包括很多协议…

用js将form表单同时提交到两个不同页面的方法

用js将form表单同时提交到两个不同页面的方法: <script type"text/javascript"> function dosubmit(){ window.open(first.php?var1window.form.var1.value&var2window.form.var2.value); window.open(second.php?var1window.form.var1.value&var2wi…

ucGUI文件说明

ucGUI文件说明 1. ucGUI目录结构概述 ucGUI目录结构如下表&#xff1a; 目录 内容 Config 配置文件 GUI/AntiAlias 抗锯齿支持 GUI/ConvertMono 灰度显示的色彩转换 GUI/ConvertColor 彩色显示的色彩转换 GUI/Core 内核文件 GUI/LCDDriver LCD驱动 GUI/To…

【转】关于InfiniBand几个基本知识点解释

转自&#xff1a;关于InfiniBand几个基本知识点解释_架构师技术联盟-CSDN博客 IP网络协议如TCP/IP&#xff0c;具有转发丢失数据包的特性&#xff0c;网络不良时要不断地确认与重发&#xff0c;基于这些协议的通信也会因此变慢&#xff0c;极大地影响了性能。与之相比&#xf…

SmartFox中的類型轉換

今天在使用SmartFox中的用戶變量UserVariables 時發現了一個問題&#xff0c;就是在使用方法SetUserVariables 來發送坐標的時候&#xff0c;在調試信息中發現發送和接受到的變量都是空的&#xff0c;測試了一下發送其他信息卻是成功的&#xff0c;于是在發送時把坐標轉換成str…

WinCE EBOOT中的BootPart分析

应该说BootPart算是微软提供的一个用于分区的模块&#xff0c;可以在EBOOT中使用。不过说实话&#xff0c;我很少使用它&#xff0c;知道有些厂商的BSP里面支持这个功能&#xff0c;而且也算是EBOOT的一部分&#xff0c;所以还是介绍一下。先看一下架构&#xff0c;如图&#x…

【转】语义化版本 2.0.0

转自&#xff1a;语义化版本 2.0.0 | Semantic Versioning 语义化版本 2.0.0 摘要 版本格式&#xff1a;主版本号.次版本号.修订号&#xff0c;版本号递增规则如下&#xff1a; 主版本号&#xff1a;当你做了不兼容的 API 修改&#xff0c;次版本号&#xff1a;当你做了向下…

心情随笔

不好意思&#xff0c;在这里又要让大家听我的牢骚了&#xff0c;但是我实在是没有地方可以发泄&#xff0c;所以只好对不起大家了&#xff0c;在近两个月的找工作历程中心智成熟了很多&#xff0c;同时言语也少了很多&#xff0c;知道没有用的话是白费口舌所以很少发表自己的意…

wince编译问题

一般来说&#xff0c;在VS2008中修改注册表文件&#xff0c;不需要从新编译内核&#xff0c;只需要copy files to release directory和make run-time image即可。但发现不好用&#xff0c;暂时不知道为什么。 看了看BSP目录下的文件&#xff0c;手动修改了X:\WINCE600\PLATFOR…

【转】Ubuntu:永久修改MAC地址

转自&#xff1a;Ubuntu&#xff1a;永久修改MAC地址 - YeeYang - BlogJava 前面发了一篇文章&#xff1a;Ubuntu&#xff1a;修改网卡的MAC地址&#xff0c;最后提到了重启后MAC地址会还原的问题&#xff0c;本文将介绍如何永久修改MAC地址&#xff08;当然不能重装系统&#…

陌生的是人心,是人性,是社会,是世道

偶然中得到这样一本书&#xff0c;它是一本都市小说&#xff0c;写自己的经历&#xff0c;不是很乏味的经历&#xff1b;它是一本职场小说&#xff0c;有着对每个人的、不同侧重点的、外表及心理刻画&#xff0c;披露了鲜为人知的职场黑幕&#xff1b;它又是一本悬疑小说&#…

【转】PF_INET 和 AF_INET 的区别

转自&#xff1a;PF_INET 和 AF_INET 的区别 - 52php - 博客园 在写网络程序的时候&#xff0c;建立TCP socket&#xff1a; 1 sock socket(PF_INET, SOCK_STREAM, 0); 然后再绑定本地地址或连接远程地址时需要初始化sockaddr_in结构&#xff0c;其中指定address family时一…

可以让你少奋斗10年的工作经验

第一&#xff1a;不要认为停留在心灵的舒适区域内是可以原谅的。     每个人都有一个舒适区域&#xff0c;在这个区域内是很自我的&#xff0c;不愿意被打扰&#xff0c;不愿意被push&#xff0c;不愿意和陌生的面孔交谈&#xff0c;不愿意被人指责&#xff0c;不愿意按照规…

【转】PF_RING学习笔记

转自&#xff1a;Qt迭代器&#xff08;Java类型和STL类型&#xff09;详解 1、PF_RING简介 PF_RING是Luca研究出来的基于Linux内核级的高效数据包捕获技术。简单来说PF_RING 是一个高速数据包捕获库,通过它可以实现将通用 PC 计算机变成一个有效且便宜的网络测量工具箱,进行数…

WinCE系统的编译过程详解

在WinCE系统中&#xff0c;当我们完成了相关的开发和系统定制工作以后&#xff0c;会编译WinCE系统&#xff0c;最后生成NK.bin和NK.nb0。下面介绍一下WinCE系统的编译过程&#xff0c;大致分为4个阶段&#xff1a;编译阶段(Compile phase)&#xff0c;系统产生阶段(Sysgen pha…

使用HtmlParser解析HTML

如果要对HTML进行解析,提取HTML的数据或者修改HTML数据,HtmlParser是一个不错的选择.使用HtmlParser可以解析本地和网络上的HTML数据:Parser parser newParser( newWinista.Text.HtmlParser.Http.HttpProtocol(newUri("uriString")));Parser parser newParser( newWi…

【转】VScode快捷键(超无敌详细版)

转自&#xff1a;VScode快捷键(超无敌详细版)_但行好事&#xff0c;莫问前程-CSDN博客 通用快捷键&#xff1a; 快捷键作用CtrlShiftP,F1展示全局命令面板CtrlP快速打开最近打开的文件CtrlShiftN打开新的编辑窗口CtrlShiftW关闭编辑器 基础编辑快捷键&#xff1a; 快捷键作用…

WinCE中得Catalog Items前的标记图标的意义总结

先看下来自微软对Platform Builder里的图标解释&#xff0c;在以后的CE里&#xff0c;也类似。 The Catalog window and the OSDesignView tab contain a number of icons used to represent object types. The icons make it possible for you to differentiate between Catal…

JavaScript 图片上传预览效果

图片上传预览是一种在图片上传之前对图片进行本地预览的技术。 使用户选择图片后能立即查看图片&#xff0c;而不需上传服务器&#xff0c;提高用户体验。 但随着浏览器安全性的提高&#xff0c;要实现图片上传预览也越来越困难。 不过群众的智慧是无限的&#xff0c;网上已经有…

【转】GigE Vision简介

转自&#xff1a;GigE Vision简介_计算机视觉小菜鸟的专栏-CSDN博客_gige vision GigE Vision是由AIA制定的通信协议&#xff0c;用来实现在机器视觉领域利用千兆以太网接口进行图像的高速传输。该标准是基于UDP协议&#xff0c;与普通网络数据包不同之处在于应用层协议&#…