【玩转.Net MF – 06】为Cortex-M3打造轻量级TinyGUI(上)

本文对比了Microsoft.NET Micro Framework的官方UI库WPF与TinyGUI的资源消耗及运行性能。WPF适用于高配置设备,而TinyGUI轻量级、运行效率高,更适合资源受限的Cortex-M3平台。

Microsoft .Net Micro Framework 官方UI库为WPF,针对320*240LCD而言,至少额外需要150K以上RAM才能基本运行。而市面上常见Cortex-M3开发板的RAM大多为128K,少数开发板即使具备512kRAM,运行官方自带的示例SimpleWPFApplication,也会出现内存溢出问题。此外由于Cortex-M3内核CPU主频大都在72M左右,官方图形库运行速度较慢。

一、参数指标

名称

代码大小

内存需求

运行性能

WPF

120k(含Microsoft.SPOT.TinyCore.pe

>150k

运行基准测试程序,TinyGUI运行速度大概是WPF3~5

TinyGUI

<2k

无需求

注:TinyGUI采用类似DirectDraw技术,直接操作显存,所以无内存需求,且运行速度快

二、位图显示技术比较

WPF支持标准BMPJPGGIF图片显示,从使用角度来看非常方便,但是由于嵌入式LCD大都为16bit显示(RGB565格式),无论是BMP还是JPGGIF都需要进行颜色转换,此外后者还需要进行格式转换处理。以上操作,不仅导致运行速度慢,还需要一定的内存进行图形缓存。

TinyGUI的位图显示采用转换后的tinyBMP位图格式,其格式和LCD显存格式保持一致,由于图形转换工作通过程序(如下)预先完成,所以在嵌入式系统上直接向显存拷贝即可完成位图显示,所以运行速度极快。

(注:其实Net Micro Framework的字体就是采用类似技术,官方提供转换程序和tinyFont字体库)

核心代码其实很简单,就是把32位位图转换为指定RGB(或BGR)格式的16位位图。

byte[] bytBuff = new byte[picBar.Height * picBar.Width * 2 + 12];

BinaryWriter bw = new BinaryWriter(new MemoryStream(bytBuff));

bw.Write(new byte[] { 84, 105, 110, 121, 66, 77, 80, 0 }); //TinyBMP/0;

bw.Write((UInt16)picBar.Width);

bw.Write((UInt16)picBar.Height);

Bitmap bmp = new Bitmap(picBar.Image, picBar.Width, picBar.Height);

for (int y = 0; y < bmp.Height; y++)

{

tspBar.Value = y;

for (int x = 0; x < bmp.Width; x++)

{

bw.Write(Color_32_16(bmp.GetPixel(x, y)));

}

}

三、TinyGUI图库接口

namespace System.TinyGUI

{

public sealed class Graphics

{

public Graphics();

public static void Clear(uint color);

public static void DrawEllipse(int x, int y, int width, int height, uint color);

public static void DrawImage(int x, int y, byte[] bytData);

public static void DrawImageEx(int x, int y, byte[] bytData, uint MaskColor);

public static void DrawLine(int x1, int y1, int x2, int y2, uint color);

public static void DrawRectangle(int x, int y, int width, int height, uint color);

public static void DrawString(int x, int y, string s, uint color);

public static void FillEllipse(int x, int y, int width, int height, uint color);

public static void FillRectangle(int x, int y, int width, int height, uint color);

public static uint GetPixel(int x, int y);

public static void Print(string str);

public static void SetPixel(int x, int y, uint color);

}

}

四、TinyGUI测试程序

运行效果图如下:

部分测试代码如下:

static void DrawGraphics()

{

x = rnd.Next(239);

width = rnd.Next(240 - x);

y = rnd.Next(319);

height = rnd.Next(320 - y);

c = rnd.Next(colors.Length - 1);

switch (index++ % 3)

{

case 0:

if (rnd.Next(10) > 5)

Graphics.DrawRectangle(x, y, width, height, colors[c]);

else

Graphics.FillRectangle(x, y, width, height, colors[c]);

break;

case 1:

if (rnd.Next(10) > 5)

Graphics.DrawEllipse(x, y, width, height, colors[c]);

else

Graphics.FillEllipse(x, y, width, height, colors[c]);

break;

case 2:

Graphics.DrawLine(x, y, rnd.Next(239), rnd.Next(319), colors[c]);

break;

}

Graphics.FillRectangle(0, 300, 240, 20, Color.White);

#if STM3210E_EVAL

Graphics.DrawString(2, 303, "Key - Back", Color.Black);

#else

Graphics.DrawString(2, 303, "Select - Back", Color.Black);

#endif

}

static void DrawPicture()

{

if (++picIndex > 12) picIndex = 0;

AccessFlash.Read((uint)(0x002A0000 + picIndex * 0xEA6C), 0xEA6C, picData);

if(StateIndex!= SystemState.Main) Graphics.DrawImage(20, 70, picData);

}

其中图片从Flash中进行读取,图片的下载方法可以参考我以前的博客文章《Flash远程读写》,为了在C#代码中读取Flash上的内容,我重新封装了一个AccessFlash类,可以直接读写Flash任意区域的数据,这部分内容我在后续文章中再进行介绍。

这篇文章仅仅介绍了TinyGUI应用层面的内容,下篇文章《为Cortex-M3打造轻量级TinyGUI(下)》将介绍TinyGUI是如何开发的,敬请关注。

Light Gui的新特性。 1图层和绘图: 支持多图层,使用与有多图层支持的处理器平台。 支持多图层的软件模拟,支持图层的alpha合并和滑动。 同时支持多种颜色格式的图层,如ragb8888模式、rgb565模式、256色调色板模式。 对每个图层,支持双缓存(double buffer)模式,内部进行了窗口剪切优化。 也支持直画(direct draw)模式,支持内存设备,两者可以配合使用。 支持图层和窗口之前的映射,支持一组窗口动态切换显示到不同大小、不同颜色格式的图层。 支持窗口旋转90度、180度、270度,无需硬件支持。 2风格支持: 支持css风格配置,代码中设置控件的类名,就可以和css配置配合使用。 支持css配置控件不同状态的背景属性,如图片、填充色;前景属性,如图片、颜色;字体属性,如大小、颜色;边框属性,如宽度、颜色、调色板位图、补白等。 支持css配置窗口的一些基本属性,如高宽,透明等。 支持皮肤特性,皮肤的属性包括图标、css配置和调色板位图。 支持多种皮肤,支持在线切换皮肤。 3window模拟器支持: 支持完整的window模拟器,使用visual studio 2005,可以独立于设备,在window环境编写界面代码。 全部由C代码编写,自带基本的C函数库,数学函数库,可以在window,嵌入式设备间无缝移植。 模拟器带来良好的调试特性,界面的相关bug,可以方便的在模拟器上调试,极大的加快软件的开发进度。 支持内存调试模式,可以方便的追踪内存越界,泄漏等问题。 4xml支持: 自带xml解释器,配置文件都使用xml编写,有很好的可读性。 实现了基于xml配置文件的多国语言支持,支持在线切换语言。 5简明易用的控件: 自带多种基本的控件,包括静态文本框、按钮、单行和多行编辑框、列表框、进度条、滚动条、图片、等等。 支持自定义控件,控件代码清晰、简明、容易编写。支持组合控件、对话框控件。配合皮肤配置,能快速实现美工效果和风格。 支持一些较复杂的控件,如文本控件、html显示、软件盘等 6良好的应用移植性 自带基本的C函数库,数学函数库等,可以方便的移植程序库和应用程序。 Light Gui的弱点: 实时性能不是Light GUI强项,不建议使用在实时性要就很高的环境。 在使用风格属性的情况下需要有系统盘的支持,用于存放配置文件和资源。 Light Gui目前是一个图形开发包,没有跨任务的窗口管理系统。 目前只有ucos(增强型,支持系统盘),linux,window平台的移植版本。 Light Gui使用的场合: 需要使用图形库快速实现自有风格的嵌入式设备,比如消费电子设备的二次开发,UI设计。 需要使用Light Gui特性的window程序设计。 Light Gui的商业模式: Light Gui是商业收费软件。 提供软件定制服务。 提供自主设计所需的源代码和库。 Light Gui 的其他特性 Light Gui 主要针对嵌入式操作系统,如嵌入式linux, uC/OS-II 等提供支持。在这些 OS 上,Light Gui 支持以多线程模式运行。其主要技术特性描述如下。 1) 硬件适配性: 可支持各种 32 位处理器架构,如 ARM、MIPS、PowerPC、Blackfin等。 支持各种灰度,彩色显示设备。 可支持各种输入设备,键盘(Keypad)、触摸屏、遥控器等等。 2) 资源消耗: Light GUI 的静态存储随配置选项的不同而不同,最少需占用 800K 静态存储空间。 Light GUI 启动后,初始占用动态存储空间最小为128k。建议系统内存为 2MB 以上。 3) 操作系统适配性: 目前支持uC/OS-II 等操作系统,也可以运行在 Linux/uClinux 操作系统之上,Light GUI自带基础的c函数库,可以方便的移植到支持frambuffer的设备上。 针对嵌入式系统的特殊支持,包括一般性的 I/O 流操作,字节序相关函数等。 4) 窗口子系统特性: 完备的任务内窗口机制和消息传递机制。 5) 图形子系统特性: 提供有增强 GDI 函数,包括光栅操作、复杂区域处理、椭圆、圆弧、多边形以及区域填充等函数。 在提供有兼容于 C99 规范的数学库平台上,还提供有高级二维绘图函数。 通过 Light GUI 的图形抽象层及图形引擎技术,我们也可以让上述高级 GDI 接口在低端显示屏上实现。 各种流行图像文件的支持,包括 Windows BMP、GIF、JPEG、PNG 等(JPEG
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值