基于ulTRON利用体系的嵌入式GUI筹划
发布日期:2011-05-15
随着嵌入式体系技能的不绝生长,种种嵌入式应用对人机交互界面的恳求也越来越高,这就使得对嵌入式图形用户界面的需求越来越急迫。与一样通常体系上的图形用户界面相比,嵌入式体系图形用户界面恳求轻型、占用资源少、高性能、高可靠性、可配置等特点。
本筹划是在东南大学国度专用集成电路体系工程技能研究中间自主研发的,并在依照uITRON 3.0标准的RTOS-ASIX OS底子上筹划出一套得当于手持配置、仪器仪表等应用的图形用户界面逐一ASIX Window。该图形用户界面采取面向东西的筹划头脑,基于消息循环和变乱驱动机制,构建了比较完备的窗口体系,为用户提供了类Win32 API的用户编程接口。思量到一样通常嵌入式应用的屏幕较小,以及嵌入式体系处理惩罚处罚器与存储器容量的限定,ASIX Window在筹划上放弃了窗口剪切等巨大特性,大大低沉了体系的巨大性,淘汰了对体系资源的占用。由于采取基于控件的筹划见解,ASIX Window非常得当淘汰,可以根据用户的需求方便地增长或删减控件,增长了体系的可淘汰性。该图形用户界面已告成应用于PDA,电子词典,税控收款机等多款产品筹划中。
1 与利用体系内核的接口
ASIX Window的团体架构是基于消息分发,消息循环以及消息处理惩罚处罚之上的。整个ASIX OS平台的布局如图1所示。图1中,最底层的是体系的消息源,包括克制(键盘、触摸屏等)和定时器,一样通常将它们统称为克制源。克制孕育产生后,进入克制处理惩罚处罚步调,该克制处理惩罚处罚步调维护其映射的缓冲区后(要是它须要缓冲区),设置变乱孕育产生(通过调用内核的变乱标记体系调用)。由于体系任务是壅闭在这个变乱标记上的,并且体系任务的优先级最高,体系任务将被内核调理运行,体系任务根据所产肇变乱的典范,来举行相应的处理惩罚处罚。比如说,要是是笔克制变乱,克制处理惩罚处罚步调将笔的坐标信息存放在相应的缓冲区中,并设置相应的变乱标记,体系任务将笔坐标的数据转换为相应活动地区(Active Area)的消息,并由体系任务将这个消息发送到当前须要该克制变乱的任务中。LCD表现,键盘和笔克制肯定是由前台任务(拥有屏幕的任务)承继的,其他外围配置所映射的克制源则由占用该资源的任务承继。
每个任务都有一个本身的信箱(Mail B0x),在每个信箱上都维护着一条消息行列步队,全部发往该任务的消息都连接在这个行列步队中。任务代码应该通过消息循环不绝地从该行列步队中取消息并处理惩罚处罚,要是消息行列步队为空,则该任务壅闭,由ASIX OS内核选择下一个就绪的高优先级任务运行。
体系任务是内核的扩展,提供体系底子的办事结果和接口。它承继体系全部的克制资源并将相应的克制变乱翻译成为相应的体系消息,并将该消息分发到映射的应用步调任务;体系任务同时维护体系中全部任务的信息,认真确定前台任务(拥有表现屏幕和用户输入内核的任务,前台任务不肯定是CPU正在运行的任务)以及前台任务的切换。体系任务壅闭在底层克制的变乱标记上,体系任务拥有最高的优先级。
在体系任务之上是办事任务。办事任务认真提供体系的其他扩展办事。办事任务没有屏幕表现(雷同于Linux中的保卫进程),办事任务壅闭在本身的消息行列步队上。办事任务拥有第二高的优先级。
应用步调任务是用户利用的各个应用。应用任务壅闭在本身的消息行列步队上,全部的应用步调一样通常都应该拥有屏幕表现,全部的应用步调在同一优先级上。
2 窗口办理
ASlX Windows是基于消息驱动的图形用户接口。从ASIXWindows的角度来看,应用步调是由一组窗口和控件构成的,步调的结果是通过窗口的利用来实现的。控件是在ASIX Windows中定制的具有特定结果的独立模块,比喻:按钮、菜单、下拉框、软键盘等。在ASIX Windows中,每一个控件在数据布局上都被形貌为一个窗口(也便是说,在数据布局上,窗口和控件是一样的),差别的是,控件是作为某个窗口的子窗口。在数据布局大将窗口与控件同一,使得整个别系的布局更大抵,对窗口的利用与对控件的利用可以同一到一起,这使得体系的编程接口可以同一到窗口的利用函数上。在ASIX Windows中全部的窗口利用,不管是窗口或是控件,都利用这些同一的函数。体系通过下面这个同一的数据布局来对全部的控件举行办理。
typedef struct asix_window
{ struct asix window *prey}//指向前一个兄弟窗口
struct asix_window *next;//指向后一个兄弟窗口
struct asix_window *child;//指向子窗口链表
/*本窗口的干系ID*/
WNDCLASS *wndclass;//指向本窗口的窗口类
U32 task_id; //本窗口所属任务的任务号
U32 wnd_id; //本窗口ID号
U32 parent_id; //本窗口的父窗口 ID号
/*本窗口的位置、状态、风格派头风格派头以及窗口标题等*/
U32 status; //本窗口状态
U16 x; //本窗口左上角x坐标
U16 v; //本窗口左上角Y坐标
U16 width; //本窗口的宽度
U16 hight; //本窗口的高度
char *caption} //本窗口标题
U32 style; //本窗口风格派头风格派头
/*指向本窗口私有数据布局的指针*/
void *etrl_str; //指向本窗口的私有数据布局
}ASIX_WINDOW;
实际上,差别的控件拥有差别的结果和布局,以是它们的利用是差别的。为了拥有同一的利用函数接口,为每一个差别的窗口或控件定义了相应的窗口类,窗口类实际上是每种控件的模版,这个模版定义了与该控件干系的内容。当应用步调员调用CreatWindow函数创建某类控件时,CreatWindow查找该类控件的窗口类,并根据窗口类中的定义,调用与该控件干系的创建函数,举行实际的创建变乱。然后CreatWindow填写相应的数据布局,形貌该控件类的实例,并将其链接到体系窗口链表中去,以便后续的办理。利用窗口类形貌差别控件筹划的同时,可以将差别控件的开辟独立于体系构架的实现,使得控件的开辟可以独立举行。利用独立窗口类来形貌每个控件的另一个好处是可以非常方便的对ASIX Window举行淘汰。下面给出窗口类数据布局的定义。
typedef struct window_class
{ U8 wndclass_id; //窗口类的ID号
//CreateWindow()调用本函数实行控件的细致创建
STATUS (。create)(char‘caption,U32 style,U16 x,
U16 Y,U16 width,U16 hight,U32 wndid,U32 menH,void*
*etrl_str,void*exdata);
//DestroyWindow()调用本函数实行控件的细致删除
STATUS (*destroy)(void*ctrl_str);
//DefWindowProc()调用本函数举行消息处理惩罚处罚
STATUS (。msg_proe)(U32 win_id,U16 asix_msg·U32
lparam.void*data,U16 wparam.void*reserved);
//GetMessage()调用本函数举行底层消息的翻译与转换
STATUS (*msg_trans)(void*ctrl_str,U16 msg_type,
U32 areald.P_U16 data,U32 size,PMSG trans_msg);
//RePaintWindow()调用本函数重绘本窗口类控件
STATUS (*repaint)(void*ctrl_str,U32 Iparam);
//SetWindowText()调用本函数设置本窗口类控件的标题
STATUS (*caption)(void*ctrl_str,char*caption,void
* exdata);
}WNDCLASS;
图2所示是体系中窗口链表的布局,体系还维护了一张任务链表,每个任务控制块(TCB)中都生存了指向本任务窗口链表的首指针。
3 消息转达与处理惩罚处罚
每个窗口(Form)都拥有本身的消息处理惩罚处罚函数,该函数汲取来自体系(包括窗口和控件)的消息并作相应的处理惩罚处罚和办法。每一个窗口处理惩罚处罚函数实际上便是一个消息循环,窗口函数通过取消息函数ASIXGetMessage()得到体系任务,并发送给该窗口的消息举行处理惩罚处罚。ASIX(GetMes—sage()得到体系消息并举行相应的处理惩罚处罚和消息转换(实际上是将底层利用体系所提供的硬件消息转换成ASIXWindow的消息,该函数通过调用相应窗口类所定义的消息翻译函数msg-trans()实现消息的转换),然后窗口函数对消息举行分检并作相应的处理惩罚处罚,这部分代码是用户本身定制的,实际上是用户步调停理惩罚处罚来自窗口和控件的消息,用来实现该应用步调的结果。窗口函数调用ASIX Win—dows的控件消息处理惩罚处罚函数DefWindowProc(),该函数是一个消息过滤器及转换器,它承继非用户的,属于控件本身的消息(这个消息大概来自用户的利用)。它起首扫描由取消息函数得到的消息,查抄此中是否有属于ASIXWindows控件的消息。要是该消息属于某个控件,则消息处理惩罚处罚函数调用体系窗口链表中该控件所映射的窗口类所指明的消息处理惩罚处罚函数,处理惩罚处罚这个消息实行相应的办法并大概发出相应的消息(比喻,当用户点击某按钮时,控件消息处理惩罚处罚函数将承继该点击变乱,并实行按钮被点击的动画,同时发送一条该按钮被点击的消息)。
4 图形接口
ASIX Windowr的图形接口筹划引入了硬件抽象层的见解,图形函数(Graphic API)不直接利用硬件,而是通过调用硬件抽象层提供的一组底子函数来作细致的图形绘制变乱。硬件抽象层函数将根据配置干系的格局将要表现的内容起首填写到体系内存的一片缓冲区(VRAM)中,然后硬件抽象层的函数将根据传入的参数决定是否将数据复制到LCD控制器。要是所调用函数的应用任务当前拥有LCD(前台任务),则将数据送往LCD控制器,不然该函数仅仅将数据写人VRAM缓冲区(该任务是背景任务)。硬件抽象层还提供了一个叫做Refresh的函数,该函数将把当前VRAM中的内容复制到LCD控制器的数据寄存器中。体系任务在应用任务切换的时间调用Refresh函数,将切换进来的任务中所属VRAM的数据改造到LCD中去,实现屏幕的切换,如图3所示。
为了克制图形函数重人时带来的标题,以及差别应用任务拥有差别屏幕以及相应属性的标题,在新的筹划中采取了图形上下文(Graphic Context,简称GC)的布局。每个须要用到屏幕的应用任务都拥有本身的图形上下文,该布局中生存与硬件无关的表现属性,比如当前色、配风景、当火线宽、当前添补模式、光标的位置、闪烁频率、光标大小、表现缓冲区(VRAM)的头指针、物理屏幕在逻辑屏幕中的位置坐标等信息。
实际上,如许的计划一方面可以实现逻辑屏幕的见解,即应用步调可以在比实际物理屏幕大的屏幕上绘制图形;另一方面.不管应用任务在前台(拥有LCD)还是在背景(不拥有LCD),都可以举行图形函数的调用。要是是前台任务,绘制的图形会立即表如今LCD上;要是是背景任务,图形被临时“绘制”到该任务的VRAM中,等下次该背景任务切换到前台时,体系任务(System Task)将调用Refresh函数将该任务的VRAM改造到LCD上。
结 语
根据以上内容,筹划完成了ASIX Window GUI的原型体系,并在PDA应用中采取了该GUI。为了方便应用步调员的开辟,还在此底子上筹划了基于MS VC++的GUI仿照器。图4所示是ASIX Windcw在PDA体系和仿照器上的应用。
ASIX Window编译后的内核非常小巧,长度只有2OO KB左右。在可移植性方面,该GUI已告成地移植到了68000、X86、ARM等处理惩罚处罚器平台上。