跟着嵌入式体系在各范畴的广泛运用,对图形化人机交互界面的需求逐步增加。因为嵌入式体系硬件资源有限,然后要求图形用户界面具有轻型、占用资源少、高性能等特色。μC/GUI是一种用于嵌入式运用的Windows风格图形支撑软件,它为任何运用图形LCD的运用供给一个有用的不依赖于处理器和LCD操控器的图形用户接口,作业在单使命或多使命体系环境下,适用于运用任何LCD操控和任何CPU尺度的物理或虚拟显现。因而,把握μC/GUI在嵌入式体系中的运用极为重要。移植μC/GUI到Nios II嵌入式软核处理器[1]成了最佳挑选。本文依据自助点菜体系的实践运用,详细介绍了μC/GUI移植办法,并在交融接触屏操作的根底上完结控件运用和操作体系开发。
1 硬件
体系中顾客运用终端接触屏阅读服务信息并完结相关操作,经过无线局域网络和前台通讯。各个点菜终端作为独立体系作业,一切数据传到前台上位机和谐处理。本文仅介绍与μC/GUI相关的点菜终端构成部分。终端硬件框图如图1所示,运用片上可编程体系(SoPC)技能将Nios II处理器、外设接口操控器等功用模块集成到FPGA,构成可编程片上体系[2]。SDRAM、Flash操控器用于处理程序和数据的存储;512 KB SRAM作为图画数据缓存区;FPGA内部自界说LTM操控器和SD卡操控器模块,辅佐软核作业,操作接触屏并读取SD卡内的JPEG图片;UART接口用于和移植到CC2430的ZigBee模块通讯;选用守时器以嵌入式uC/OS II操作体系。
接触显现屏是4.3英寸数字LCD触碰面板TRDB-LTM,长宽比为15:9,支撑24 bit并行RGB接口,能经过内置模数转换器(AD7843)将触碰点X/Y坐标转换成对应数字信息。接触屏物理分辨率为800×480,支撑16 bit RGB565格局。
2 μC/GUI移植
本体系的用户界面选用uC/GUI,其最新版别是3.98,其间一些组件不太完好。依据点菜体系运用需求,特增加3.94版别的JPEG模块来显现图片数据。ucgui398\Start\Config和ucgui398\Start\GUI是源码包最重要的两个文件夹,其间包括各种装备文件、μC/GUI内核文件、与字体相关的代码文件、LCD驱动代码文件、μC/GUI支撑的控件代码以及视窗办理部分代码等[3]。
2.1 修正LCD装备文件
为使体系正确作业,有必要修正文件LCDConf.h(GUI目录中)中的一些装备宏。该文件与硬件直接相关,依据所运用的LCD类型和LCD操控器进行装备。因为μC/GUI供给不同类型的LCD装备文件(文件夹Sample\LCDConf\xxx中,xxx代表LCD驱动器称号),运用程序开发者可直接在此根底上修正程序。实践运用中,挑选LCDLin.c驱动文件。因为LTM操控器对显现分辨率进行硬扩处理,因而LCD尺度挑选400×240。体系底层装备的部分宏如表1所示。
LCD_READ_MEM(off)、LCD_WRITE_MEM(off,data)宏界说是μC/GUI与LTM操控器接口的要害[4]。SRAM_BASE是512 KB SRAM读写操作的基地址,这些宏界说能完结对图画数据缓存区的16 bit读写操作。此外,一般移植操作有必要界说LCD_INIT_CONTROLLER(),以完结LCD屏初始化装备。LTM操控器初始化了接触屏,因而软件装备中省掉此项。
2.2 修正GUI和接触屏装备文件
在调整体系或减小内存消耗时需装备LCDConf.h。详细步骤如下:(1)备份原始装备文件;(2)检查一切装备开关;(3)删去装备中不运用部分。除此之外,体系工程编译时,会呈现一些未界说过错,需求将Sample\GUI_X\GUI_X.c增加到工程中,该文件界说GUI与操作体系的接口,以及Debug过错报告等函数。因为体系运用μ/OS II,可挑选GUI_X_uCOS.c文件,并在文件结尾处增加以下函数:
void GUI_X_Log(const char *s){GUI_USE_PARA(s);}
void GUI_X_Warn(const char *s){GUI_USE_PARA(s);}
void GUI_X_ErrorOut(const char *s){GUI_USE_PARA(s);}
一起将GUI_X_ExecIdle( )中的OS_X_Delay(1)替换为OSTimeDly(1)。
GUI文件夹中另一个需求装备的文件是GUITouchConf.h,依据接触屏类型不同,宏参数也不同。履行接触屏操作的首要流程在GUI\Core\GUI_TOUCH_DriverAnalog.c文件中。头文件部分宏装备如表2所示。
2.3 接触屏与GUI接口
μC/GUI支撑键盘、鼠标、接触屏等外设,并在源码级对其音讯呼应。为使接触屏正常作业,体系除对相应装备文件修正和增加一些相关函数外,有必要完结接触屏底层驱动,即修正LCDLin.c驱动文件。
理论上,GUI_TOUCH_AD_LEFT和GUI_TOUCH_AD_RIGHT取值应当为0或1 024,但实践操作时,有必要依据详细情况校准。体系取接触屏四个角坐标作为校对规范,经过屡次实验,四个坐标别离是(29,160)、(3 936,160)、(29,3 900)和(3 936,3 900)。在GUI\Core\GUI_TOUCH_DriverAnalog.c中修正相应宏,再据实践景象确认余下开关宏的值。
经过调用GUI_TOUCH_Exec()函数来取得接触屏触点方位:体系经过中止服务程序读回触点实践坐标值(x,y);接着将实践坐标值转换到逻辑坐标;最终调用GUI_TOUCH_StoreState(x,y)保存逻辑坐标值。为实时得到触点坐标,需不断调用GUI_TOUCH_Exec()函数,因而树立独自使命对该函数调用,以确保接触屏使命的实时呼应。该部分规划难点在于中止标志清零,假如每次得到触点方位后不能立刻清零,则会影响GUI内部去抖操作和校准处理,因而在保存安稳坐标值后再铲除标志位。
3 μC/GUI运用开发
3.1 接触屏音讯呼应机制
GUI一切外设输入均以音讯方法发送给当时窗体回调函数处理,详细流程如图2所示[5]。接触屏的音讯传递本质是对全局变量_State记载和更新。_State有3个成员变量:音讯产生点x坐标、y坐标、外设按下与否的操作状况。外设输入音讯统称为WM_TOUCH,函数WM_HandlePID()专门处理这种音讯。经过GUI_PID_GetState获取GUI_PID_STATE结构的WM_TOUCH音讯,将新获取音讯与函数内静态旧音讯变量比较,包括该音讯产生点的屏幕坐标及外设操作状况。状况产生改动是将操作状况改动作为独立音讯WM_PID_STATE_CHANGED发送,再发送WM_TOUCH音讯。结构WM_TOUCH音讯所用到的数据,需求获取当时焦点窗体句柄,当时焦点窗体是用WM_hCapture全局变量记载,假如为0则调用函数WM_Screen2hWin(),依据音讯产生点屏幕坐标获取窗体句柄。向当时焦点窗体发送音讯后,更新当时音讯到旧音讯变量,结束本次音讯处理。
3.2 窗口、控件和对话框运用
体系界面丰厚,频频用到页面切换,因而运用?滋C/GUI视窗办理器(WM)进行窗口创立、显现、躲藏和删去等。用户程序中对不同窗口指定不同回调函数,当指定事情产生时,告诉图形体系调用指定函数,如窗口内容改动时主动重绘的场合等。图3(a)、图3(b)别离为菜品引荐及菜单显现窗口。
为使点菜体系功用愈加丰厚,界面中参加按钮、列表框、单选按钮、结构窗口等控件。控件是结构用户接口的元素,能主动对某些事情反响。控件也是经过其结构函数回来的句柄而引证。控件运用视窗办理器,一旦一个控件树立,它被处理成与其他窗口相同,WM确保它在需求时能正确显现(及重绘)。
控件音讯呼应机制在运用中十分重要,包括按钮触碰呼应、单选按钮序列号获取、列表框滑动等。下面以按钮为例介绍其功用。Button按钮在其回调函数中对相关音讯(WM_MOUSEOVER/WM_PID_STATE_CHANGED/WM_TOUCH)进行处理,在button.c文件中可找到相关完结函数,用接触屏点击该按钮时发送以下三种音讯之一:WM_NOTIFICATION_MOVED_OUT、WM_NOTIFICATION_RELEASED、WM_NOTIFICATION_PRESSED,之后在该按钮父窗口捕获并处理音讯。体系是经过捕获WM_NOTIF%&&&&&%ATION_RELEASED音讯完结按钮触碰功用的。
体系除了点菜外,还能存储会员信息,用于累积会员积分,如图3(c)。关于新建和登录账户界面,运用对话框是很需求的。树立对话框需求做两件根本作业:一个资源表,界说包括的控件;另一个是界说控件的初始化。对话框包括多个控件(结构窗口、按钮、编辑框、文本框),经过对不同控件的挑选向体系宣布恳求信息。大都音讯被对话框主动处理,其他传送给对话框指定的回调函数。其间,将WM_INIT_DIALOG和WM_NOTIFY_PARENT两种类型的附加音讯传送到对话框窗口进行处理。对话框显现前,WM_INIT_DIALOG音讯当即被发送到对话框处理,对话框程序用这个音讯初始化控件以及完结其他影响对话框显现的初始化使命;经过对话框的子窗口发送WM_NOTIFY_PARENT音讯到对话框,告诉父窗口以确保事情同步。
3.3μC/OS II运用
体系运用接口函数OSTaskCreateExt 创立使命,依据体系要求,规划四个使命,别离是:初始化使命(TaskStart)、接纳音讯使命(TaskRxmsg)、呼应接触使命(TaskTouch)和更新使命(TaskUpdate)。使命间经过信号量、全局变量等方法通讯,详细状况搬运如图4所示。
(1)初始化使命
优先等级最高,用于树立和调用体系初始化函数。体系上电后,首要对各个硬件模块、软件内各数据初始化,假如SD卡读取不成功、无线运转不正常,LED灯提示体系初始化失利,一起体系退出运转状况。反之,初始化结束,体系开端使命调度。
(2)接纳音讯使命
接纳上位机传回确实认信息,实时显现菜单状况:预备中、制造中、传送中和已上菜。因为无线发回数据不守时,且为了防止数据丢掉,该使命优先等级高于TaskTouch。该使命与TaskTouch之间用信号量通讯。
(3)呼应接触使命
用于履行GUI_TOUCH_Exec()函数,更新接触点状况,设置窗口、对话框等的回调函数,进行界面切换。抛弃对CPU占用后,体系调度将CPU占用权交给TaskUpdate。
(4)更新使命
因为运用视窗办理回调机制,该使命有必要完结,并定时调用(至少每秒钟100次),优先等级最低。仅从一个使命调用GUI更新函数(即GUI_Exec(),GUI_Delay()),有助于坚持程序结构明晰。使命完结后,按使命优先级凹凸开端新一轮调度。
以μC/OS-II操作体系为根底,体系在呼应接触使命和更新使命中别离调用μC/GUI函数。该项作业经过在装备中使能多使命支撑及合作内核接口函数来完结。因为使命实时行为只受运转在更高等级使命的影响,所以在低等级使命中设置用户界面,使其切换到用户界面时不会影响实时行为。
本文介绍的体系,在Nios II架构上移植了可视化图形库μC/GUI,体系要点研讨了怎么运用?滋C/GUI。在完结接触屏操作的根底上,结合音讯呼应机制完结窗口、控件和对话框的运用,并交融多使命操作体系进步点菜的实时性。LTM接触屏显现带有Windows风格图形界面,顾客可依据菜品图片、养分介绍及价格随时点餐。经过GUI整合的接触操作,完结了自助点菜、检查菜品状况、加菜、退菜以及结账功用,可供给更优质、更人性化的服务。