资源描述
基于UC/OSII的图形界面系统的设计与应用Design &Implementation of GUI system based on UC/OSII(华中科技大学电气与电子工程学院 430074) 宋立强 许强Song,Liqiang Xu,Qiang摘要:uC/OSII以其严格的实时性得到了广泛的应用,但目前适用于uC/OSII的图形界面却很少。本文详细介绍了一种适用于uC/OSII的图形界面-uC/GUI的体系结构和特点,同时介绍了S3C44B0X内置LCD控制器的结构和功能,给出了S3C44B0X下uC/GUI驱动程序和应用程序的编写实例。关键词:图形用户界面;uC/GUI; uC/OSII;S3C44B0X;Abstract: UC/OSII is widely used because of their real-time feature, but there is few GUI for uC/OSII up to date. This article describes the structure and feature of uC/GUI, one of GUIs for uC/OSII, in detail and introduces the structure and function of LCD controller inside S3C44B0X. This article also illustrates the process of programming uC/GUIs driver and application based S3C44B0X. Keyword:Graphic user interface; uC/GUI; uC/OSII; S3C44B0X;1引言:人机界面是嵌入式系统的重要组成部分,目前比较流行的GUI有microwindows,minigui,QT/Embedded等,普遍采用了Framebuffer,客户/服务器结构,消息事件机制,多线程概念,主要用于嵌入式Linux系统中。uC/OSII只是一个实时多任务内核,不具有现代操作系统的线程,客户/服务器机制,上述GUI不能方便的运行在uC/OSII上。uC/GUI是一款高效嵌入式图形系统,适用于多种处理器和LCD平台,可工作在单任务和多任务环境,代码精简高效,不依赖特定的操作系统调用,适合做uC/OSII的图形显示。本文详细论述了uC/GUI的结构框架,驱动程序编写,与uC/OSII的接口,中文显示,应用程序编写等问题,给出了在SAMSUNG S3C44B0X平台下的应用实例,很好的解决了uC/OSII的图形界面设计问题。uC/GUI是由micrium公司编写,用户可以在下载试用版。2 系统组成系统采用SAMSUNG S3C44B0X ARM7TDMI 处理器及其内置LCD控制器,ALPS公司320240 STN伪彩色LCD显示屏,1M16bit Flash:SST39VF160,4M16bit SDRAM 。编译器使用ARM公司ADS工具链,操作系统使用已经移植好的uC/OSII3 uC/GUI架构uC/GUI是一种面向嵌入式实时系统的图形用户界面系统,结构简单,采用模块化分层设计,用户可以根据需要和资源定制不同的模块。可运行在单任务superloop环境和实时多任务环境。总体来说可以为四层:LCD驱动层(LCD driver layer),图形库层(Graphic library layer),控制库层(Control library layer),窗口管理层(Windows manager layer)。如图1所示3.1 LCD驱动层(LCD driver layer)该层是uC/GUI的软硬件接口层,由LcdDriver.c和LcdConf.h两个文件组成,包含了操作LCD硬件需要的所有宏定义和函数。该层和使用的硬件密切相关,对于不同的LCD控制器,该层的内容可能有很大的差别,总体来说该层包含的内容如下:宏定义:控制器的名称,初始化命令序列,读写数据命令序列,开关命令序列,位/像素,调色板模式,数据线宽度,LCD的X,Y尺寸等。API接口:定义了所有上层需要的LCD操作函数,例如图形系统初始化函数,画点,画线,填充区域,bmp位图显示等函数。3.2图形库层(Graphic library layer)该层包括文本显示,数值显示,2D图形显示等函数,构成了uC/GUI的基本核心层。该层函数高效精简,为资源有限的嵌入式系统提供基本服务。3.3控制库层(Control library layer)该层提供了对颜色,字体,显示模式等的控制函数。用户可以调用该层函数来改变背景颜色,前景颜色,当前字体,正常模式、或模式、透明模式显示。颜色控制:支持单色,多级灰度和彩色显示,使用逻辑颜色和物理颜色的概念。逻辑颜色面向应用程序,定义为24位的RGB值,即0XRRGGBB。物理颜色面向LCD硬件,表示实际显示的颜色,同样是一个24位的RGB值,但调色模式不固定,由使用的LCD控制器决定,逻辑颜色需要映射为物理颜色。当LCD的显示颜色不够时,uC/GUI采用“最小二乘法”选择最接近的物理颜色来显示,因此应用程序可以不经修改地在不同色深LCD上运行。用户需要在配置文件中正确配置LCD的调色模式。字体控制:uC/GUI支持8位ASCII码和16位Unicode码字符,支持等宽和比例字体。用户可以根据需要加入任意个数的字体。3.4窗口管理层(Windows manager layer)该层为高级用户提供窗口显示和管理,需要更多的内存空间,是独立的可选层。对于uC/GUI来说:窗口:系统初始化时自动创建一个覆盖整个LCD的桌面窗口,其他窗口都是桌面的子窗口。系统为每个窗口维护一个句柄,对句柄的操作就是对相应窗口的操作。回调机制:就是窗口的事件驱动机制,系统自动调用用户定义的回调函数来响应特定事件,一般用来自动重绘窗口。如果用户不使用回调机制就要自己负责重绘失效的窗口。窗口控件:具有特定属性的窗口,可以自动响应特定事件,用户可以使用控件来组成用户界面。所有用于窗口的操作都适用于控件。3.5内存需求uC/GUI最大的特点是体积小巧,适用于资源要求严格的嵌入式系统。内存资源的需求视选择的模块和编译器的效率而定,典型的情况如下:小型系统 (无窗口管理) RAM: 100 bytes Stack: 500 bytes ROM: 10-25 kb (依赖于所选择的功能)大型系统 (包含窗口管理) RAM: 2-6 kb (依赖于窗口数量) Stack: 1200 bytes ROM: 30-60 kb (依赖于所选择的功能)4硬件平台硬件结构如图2所示。S3C44B0X是SAMSUNG公司出品的高性能,低功耗ARM7TDMI内核处理器,工作主频64MHZ,内部集成一个高性能LCD控制器,支持:1) 单色、4/16灰度、256色STN LCD显示屏。2) 4位单扫描,4位双扫描,8位单扫描三种模式。3) 使用系统内存作显存。4) 使用内部独立的DMA通道传输影像数据。5) 支持160160,320240,640480像素屏幕。我们使用8位单扫描,320240像素,256色的工作模式,每像素占8位(RRRGGGBB),其中3位红色,3位绿色,2位蓝色。控制器直接输出LCD所需的外部信号:VFRAME(帧同步),VLINE(行同步),VCLK(移位时钟),VD7:0(8位数据)。LCD使用ALPS公司CCFL背光,320240RGB STN彩色显示屏,响应时间为175ms。5驱动和应用程序编写编写驱动程序首先根据LCD控制器定义正确的宏,包括基本的宏定义和操作控制器需要的特殊命令序列宏定义,然后编写驱动API函数,另外用于uC/OSII时需要提供与实时内核的接口函数。实际应用中用户可以通过修改相似控制器的驱动来得到正确的驱动程序。5.1宏定义#define LCD_CONTROLLER (0)/控制器名称#define LCD_XSIZE(320)#define LCD_YSIZE(240) /X,Y大小#define LCD_BITSPERPIXEL(8) /每像素使用数据位#define LCD_FIXEDPALETTE(332) /调色板模式,本例使用3红,3绿,2蓝#define LCD_NUM_CONTROLLERS (1)/控制器数量#define LCD_MAX_LOG_COLORS (256) /最大的逻辑颜色数以上是使用S3C44B0X内置LCD控制器时的宏定义。该控制器使用系统内存做为显存,CPU定时将内存影像数据通过独立的DMA通道传输到LCD屏幕,不需要命令序列宏定义。5.2驱动API函数首先定义一块适当大小的内存作为显存,这里用数组实现,大小为:每像素数据位像素总数。对显存的操作直接反映到LCD屏幕上。U32 LCD_VRam8*LCD_XSIZE*LCD_YSIZE/32 = 0x0; /定义显存int LCD_L0_Init(void)关闭LCD;设定S3C44B0X LCD controler控制寄存器;打开LCD;return 0;/ LCD初始化函数void LCD_L0_DrawPixel(int x,int y);/使用当前颜色在X,Y处画点void LCD_L0_XorPixel(int x,int y);/翻转X,Y像素的颜色void LCD_L0_DrawHLine(int x0, int y, int x1);/水平画线函数void LCD_L0_DrawVLine(int x, int y0, int x1); /垂直画线函数void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex); /使用指定颜色在X,Y处画点void LCD_L0_FillRect(int x0, int y0, int x1, int y1); /使用当前颜色填充矩形区域5.3 uC/OS下uC/GUI应用程序的编写uC/OS下使用uC/GUI需要提供一些内核接口函数,来实现任务间同步。static OS_EVENT *DispSem;/uC/GUI使用的信号量void GUI_X_InitOS (void)/初始化信号量DispSem = OSSemCreate(1);void GUI_X_Lock (void)/锁定GUI任务INT8U err;OSSemPend(DispSem, 0, &err);void GUI_X_Unlock (void)/解除锁定OSSemPost(DispSem);U32 GUI_X_GetTaskId (void) /返回当前任务的ID号return (U32)(OSTCBCur-OSTCBPrio);如图(3)所示,用户可以在不同任务中调用uC/GUI,但为了程序结构清楚明了,推荐在一个任务中完成所有的界面显示,或者在一个任务中调用重绘函数GUI_Exec()来完成屏幕刷新操作,给该显示任务分配最低优先级来保证核心任务的实时性。例如:void GUI_Task(void *id) while(1) GUI_Exec();/完成屏幕刷新GUI_X_ExecIdle();/空闲任务/该任务完成屏幕刷新int main(void)硬件初始化;OSInit();/初始化UC/OSIIGUI_Init();/初始化UC/GUIWM_SetCallback(WM_HBKWIN, cbBackgroundWin);/设定桌面的回调函数创建用户任务;OSTaskCreate(GUI_Task,(void *)&Id, (void *)&StackSTACKSIZE - 1, 低优先级);/创建屏幕刷新任务,分配一个低优先级OSStart();/开始任务调度return 0;5.4中文显示问题uC/GUI带有多种常用的ASCII字体,用户可以根据需要选择一种或多种合适的字体与应用程序一起编译。同时uC/GUI也支持UNICODE字符显示,用户可以自定义任意个数的UNICODE编码字符的字模,组成小型字库供应用程序调用,不必装入整个汉字字库,节约宝贵的内存空间,同时具有很好的扩展性。6结束语具体应用证明,uC/GUI结构紧凑,功能完善,支持多种硬件平台,在多任务环境下工作稳定可靠,非常适合做uC/OSII的图形用户界面。采用S3C44B0X内置LCD控制器可以使系统小型化,提高性价比,同时具有良好的显示效果。参考文献:1Jean J.Labrosse 著. mC/OS-II- 源码公开的实时嵌入式操作系统,中国电力出版社,20012uC/GUI Version 3.26 manual, Micrium Technologies Corporation,20023S3C44B0X RISC MICROPROCESSOR DatasheetSamsung Electronics, Aug.20014马忠梅. ARM 嵌入式处理器结构与应用基础M,北京:北京航空航天大学出版社,2002。5 杜春雷. ARM体系结构与编程,北京:清华大学出版社,2003。6作者简介:宋立强,男,1977年3月,硕士研究生,华中科技大学电气与电子工程学院,现从事嵌入式系统与电气传动方面的研究;电话:02787542626转6207(实验室),027-87546451(宿舍);E-mail: liqiang_hust(430074 华中科技大学电气与电子工程学院电机教研室)宋立强(430074 Motor staff room, College of electrical and electronic engineering, Huazhong University Of Science & Technology,wuhan ) Song,Liqiang
展开阅读全文