1.0......UCGUI整体简介.
...............UCGUI简介.
...............本文档的目的
...... .........前提学习要求.
1.1.....要求
...............目标硬件系统.
...............开发环境(编译器).
1.2.....UCGUI特性.
...... ........示例.
1.3.....UCGUI设计策略.
...... ........微型.
UCGUI
UCGUI是一种嵌入式应用中的图形支持系统.它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境,
并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示.
它的设计架构是模块化的, 由不同的模块中的不同层组成,
由一个LCD驱动层来包含所有对LCD的具体图形操作, UCGUI可以在任何的CPU上运行,
因为它是100%的标准C代码编写的.
UCGUI能够适应大多数的使用黑白或彩色LCD的应用,
它提供非常好的允许处理灰度的颜色管理.还提供一个可扩展的2D图形库及占用极少RAM的窗口管理体系.
本文档的目的
本文档描述如何在嵌入式应用中安装,配制,使用UCGUI的图形用户接口, 并讲解UCGUI的内部设计架构.
前提
本文档假定你已经备坚实的C语言程序设计方面的知识, 如果你觉得自己这方面还不够,
那么我们推荐Kernighan 和 Richie的"C语言程序设计"给你, 它描述了最新的C标准,
即ANSI C标准, 本文档不须要具备汇编语言方面的知识.
第一章
1.1 要求
对于开发UCGUI图形应用不须什么目标系统, 大部分的图形应用开发都可以在模拟器下进行;
但是最终的目的是通常还是在目标系统上运行程序.
目标系统(硬件)
你的目标系统必须具备如下几点:
[1].CPU(8/16/32/64位)
[2].必要的RAM和ROM存储
[3].LCD显示器(任何类型及分辩率的)
对于内存的需求取决于你选用的UCGUI的功能模块以及你所使用的目标系统上的编译器的效率.
内存的占用量无法估计准确的值, 下面就一些的数值适用于多数的目标系统.
小型系统(不含窗口管理功能)
[1].RAM:100字节
[2].堆栈:500字节
[3].ROM:10~25K(取决于选用的UCGUI功能模块)
大型系统(包含窗口管理及各种窗体控件功能)
[1].RAM: 2-6 kb (决于选用的应用中建立窗口的数量)
[2].堆栈: 1200 bytes
[3].ROM: 30-60 kb (决于选用的UCGUI功能模块)
还要注意ROM的需求量随着你在应用程序中使用的字体数目而增长,以上的所有值都是粗糙的估计, 并不准确.
开发环境(编译器)
目标系统中采用的什么样的CPU并不重要,
但必须要有与所用CPU相对应的C编译器,如果你所使用的编译器有什么局限性, 请联系我们,
我们会告知你这些局限性会不会在你编译程序时产生问题, 大多数的16/32/64位的CPU或DSP上的编译器都可以正常使用,
大部分8位的编译也都可以正常编译.
并不须要C++编译器, 不过它也可以正常使用, 如果有须求的话,
应用程序也可以在C++环境下正常编译使用.
1.2 UCGUI的特性
UCGUI的设计目标是为使用LCD作为图形显示装置的应用提供高效的/与LCD控制器独立及处理器独立的图形用户接口.
它适合于单任务环境及多任务环境, 如私用的操作系统或是商业的RTOS(实时操作系统). UCGUI以C源码形式提供,
并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示.它包含以下特性:
一般特性
[1] 适用任何8/16/32位CPU, 只要有相对应的标准C编译器.
[2] 任何的控制器的LCD显示器(单色,灰度,颜色), 只要有适合的LCD驱动可用.
[3] 在小模式显示时无须LCD控制器.
[4] 所有接口支持使用宏进行配制.
[5] 显示尺寸可定制.
[6] 字符和位图可在LCD显示器上的任意起点显示,并不仅局限于偶数对齐的地址起点.
[7] 程序在大小和速度上都进行了优化.
[8] 编译时允许进行不同的优化.
[9] 对于缓慢一些的LCD控制器, LCD显存可以映射到内存当中,
从而减少访问次数到最小并达到更高的显示速度.
[10]清晰的设计架构.
[11]支持虚拟显示, 虚拟显示可以比实际尺寸大(即放大).
图形库
[1] 支持不同颜色深度的位图.
[2] 提供可用的位图转换工具.
[3] 图形运算时绝对不含浮点运算.
[4] 快速画点/线(不含浮点运算).
[5] 高速画圆及多边形.
[6] 多种画图模式.
字体集
[1] 为基础应用提供多种不同字体:4*6, 6*8, 6*9,8*8, 8*9, 8*16,
8*17, 8*18, 24*32, 以及8, 10, 13,
16等几种高度(象素单位)的均衡字体(proportional fonts). 更详细的信息,
请参考第25章:"标准字体".
[2] 可以方便的加入及链接进自定义字体.
[3] 只有应用程序中用到的字体被实际链接进最后的执行映象文件中, 因此保证占用最小数量的ROM.
[4] 提供可用的字体转换工具.任何宿主系统(如微软windows系统)上的可用字体均可以经转换后使用.
字符串/数值输出
[1] 支持数值的任何字体下的十进制/二进制/十六制显示.
[2] 支持数值的任何字体下的十进制/二进制/十六制编辑输入.
窗体管理器
[1] 齐全的窗口管理, 包括剪切, 在窗体客户区外
[2] 窗体可以移动及改变大小.
[3] 支持窗口回调函数(可选功能).
[4] 窗体占用最低RAM(每个窗体占用20个字节).
可选的类似PC机的窗体控件
[1] 可用的窗体控件(窗体对象, 也称作控件), 操作简便而且容易使用.
触摸屏及鼠标支持
[1]对于窗体控件如按钮, UCGUI提供触摸屏及鼠标支持.
PC下的工具
[1] 模拟器及查看器.
[2] 位图转器工具.
[3] 字体转换工具.
1.3 UCGUI中的基本设计策略----微型.
与其它一些同样是嵌入式的GUI图形系统相比, UCGUI很明显的一大区别是:微型;
这微型的特征主要体现在两点:节省空间, 包括代码空间与程序运行占用空间.
-----代码空间占用少, 是指其对于同样的功能, 其实现简单,结构简单,设计简单,复杂的功能放弃;
-----程序运行占用空间少, 是指支持GUI运行时, 所消耗的变量空间小,
这对于本来RAM空间就紧张的小型嵌入式应用, 是非常的重要的. 程序运行消息消耗的空间小,
主要有两个方面:
[1]. 消息处理不用队列, 而是采取两个变量,
一个变量记载当前消息,一个变量记载先前消息,当前消息从外部输入驱动中获取更新,
处理消息时与先前消息进行比较,
处理完消息再将当前消息更新到先前消息变量中.这样处理起来,比起采用消息队列,
就省了不知道多少空间了,因为在启用MOSUE类设备时,移动消息是非常多的.不采用消息队列, 也导致了UGGUI中的所有的消息处理都是同步的,
但这对于UCGUI来说也不是什么严重的问题, 并不是必须的功能; 没有消息队列,
则每个消息的处理不能占用大量的时间,
否则严重影响消息处理的灵敏度,造成消息的丢失.但是这些问题都是可以接受的,
因来带来的空间效率带有帮助了.
[2]. 单一运行绪:UCGUI运行的时候, 仅有一条执行路径, 也就是单一运行绪.这与MINIGUI多线程版是有很大的差别的,熟悉MINIGUI的朋友都知道MINIGUI分了三个版本,
多进程版/多线程版/单一版.多线程版分如下线程:
-----用户程序是一个线程.
-----桌面程序是一个线程.
-----事集收集是一个线程.
-----时间Timer是一个线程.
-----创建窗口也可以单独启用一个线程.
分了这些程, 当然有些好处, 如计时器/消息接收不至被消息处理阻塞; 但是UCGUI中没有这些复杂的机制,
从而少了很多的线程同步以及与其它系统的相关性(便于移植).而且在资源占用了又少了一层, 节省了线程资源.
[3]. 剪切处理, 窗口系统的剪切处理有两个要素, 一是时间效率;二是空间效率. UCGUI中采取的是空间策略,
每进行一次图形绘制,都必须处理剪切; 在时间效率优先的系统当中, 会计算过后就保存每个窗口的剪切矩形,
如果是在这个窗口上绘图, 就无须每一次绘图操作都进行剪切处理, 只须要判断是否处于剪切矩形之内即可,
当然这个判断也是很讲究策略的, 因为剪切矩形是一个系列,如果是绘制一个矩形,
这个矩形被分布在几个剪切矩形当中,
这个时候也能采取两种办法:一是逐点判断之后画点;二是再进行一次剪切计算,剪切出可以绘制的矩形.这两个方法其实也体现了空间与时间的问题,
不过第二种方法在时间上很优, 在空间上也仅是占用一时, 所以是比较优的.
但是如果要计算过每个窗体的剪切矩形后, 要保存起来, 供窗体上再次作画时用, 这个空间占用则是比较大的.
|