260 likes | 502 Views
嵌入式系统. —— 嵌入式 GUI. 浙江大学计算机 学院 陈文 智 chenwz@zju.edu.cn. 提纲. 1 、 嵌入式 GUI 概述. GUI 的出现是 PC 应用的一个 分水岭 嵌入式平台上的 GUI 具备 轻小型、占用资源少、高性能、高可靠性和可配置性等嵌入式平台所特有的 优点 。 一般针对特定的硬件设备或环境,嵌入式系统都会设计不同的用户图形界面系统 GUI ,从而达到与硬件完美接合的效果。 硬件设计,通过 LCD 控制器把 LCD 显示器和开发系统连接 起来 。
E N D
嵌入式系统 —— 嵌入式GUI 浙江大学计算机学院 陈文智 chenwz@zju.edu.cn
1、嵌入式GUI概述 • GUI的出现是PC应用的一个分水岭 • 嵌入式平台上的GUI具备轻小型、占用资源少、高性能、高可靠性和可配置性等嵌入式平台所特有的优点。 • 一般针对特定的硬件设备或环境,嵌入式系统都会设计不同的用户图形界面系统GUI,从而达到与硬件完美接合的效果。 • 硬件设计,通过LCD控制器把LCD显示器和开发系统连接起来。 • 驱动程序设计,驱动硬件,嵌入式GUI系统,为上层程序设计提供图形函数库。 • 用户界面程序设计,提供图形化程序设计。
2、MiniGUI概述 • MiniGUI源自一个由魏永明主持和开发的自由软件项目,现在主要由北京飞漫软件技术有限公司负责维护并开展后续开发。 • MiniGUI是一款商业运作较为成功的国产自由软件,已广泛应用于手持终端、工业产品、电子多媒体平台等各类产品,适用于工业控制领域。
3、MiniGUI框架 • MiniGUI在软件体系上介于内核和应用之间,本质上是一个软件“中间件”。其具有良好的软件体系架构,通过自带的ANSI C库以及相关的API实现GUI系统所需的功能,然后通过可移植层的抽象封装,将与操作系统、底层硬件设备的交互实现细节隐藏起来,上层应用无需与底层硬件平台有直接的调用关系,所以有较好的可移植性与可配置性,也更利于后期设计开发上层应用。
MiniGUI特点 • 多种运行模式的支持。MiniGUI提供了MiniGUI-Threads、MiniGUI-Processes与MiniGUI-Standalone三种运行模式。 • 完整的多窗口系统与消息机制。MiniGUI提供了层次化结构的窗口组织体系:由最底层的根窗口衍生出一系列的子窗口,而子窗口其中又可以包含子窗口、兄弟窗口等类似于树型结构的复杂逻辑关系。 • 丰富的控件和GUI元素支持与方便的开发环境。MiniGUI提供了各种常用的控件类型,如静态文本框、输入文本框、按钮、下拉框、列表框、复选框等常见的UI窗口设计所必备的控件选择以及类似网格控件、动画控件等扩展型的实用控件。
4、MiniGUI使用 • MiniGUI v1.6.10主要有源代码包、资源包、游戏等演示程序构成 • qvfb-1.1.tar.gz。由Qt提供的虚拟FrameBuffer的X11。 • libpng_src.tgz。支持PNG展现的库的源代码包。 • jpegsrc.v6b.tar.gz。支持JPEG的源代码包。 • games-1.6.10.tar.gz。运行在MiniGUI上的小游戏的安装包。 • samples-1.6.10.tar.gz。基于MiniGUI的例程。 • minigui-res-1.6.10.tar.gz。MiniGUI的基本资源包。 • mg-samples-1.6.10.tar.gz。示例程序。 • mde-1.6.10.tar.gz。演示程序包。 • libminigui-1.6.10.tar.gz。核心源代码包。
5、MiniGUI编程 • 5.1 编程环境介绍 • 5.2 编程框架介绍 • 5.3 基础编程 • 5.4 对话框和控件编程 • 5.5 图形编程
5.1 编程环境介绍 • 由于MiniGUI完全由C语言编写,使得其交叉编译过程变得比较简单,读者可以在任何一个安装有针对目标设备的交叉编译工具链的平台上开发然后进行编译。 • 在Linux环境下,利用GCC实现相关的编译工作,再由QVFB完成在Linux平台上直接模拟FrameBuffer驱动环境对开发的应用程序进行运行与调试,避免了用户反复烧写到目标开发板上的过程,也使得用户可以在标准的编译器环境下直接对应用程序进行调试。
5.2 编程框架介绍 • MiniGUI采用了基于线程的体系结构,架构起较为完备的消息传递与多窗口处理机制。 • MiniGUI采用了传统的Client/Sever消息管理模式。桌面线程管理着MiniGUI中所有窗口的相关事件,例如创建、修改、显示、隐藏、焦点变化、回收等一系列的动作,是消息传递机制中的核心微服务器。 • 事件线程获取来自于IAL层(Input Abstract Layer,输入抽象层)的事件,并传递给桌面线程。 • 计时线程触发定时器事件,当其接收到SIGA LRM信号之后,从休眠状态唤醒并向桌面线程发送相关的定时消息。 • MiniGUI将图形处理与输入处理过程封装为抽象接口,提供给上层的应用程序、操作系统进行调用。
消息队列 typedefstruct _MSGQUEUE { DWORD dwState; pthread_mutex_t lock; sem_t wait; PQMSG pFirstNotifyMsg; PQMSG pLastNotifyMsg; PSYNCMSG pFirstSyncMsg; PSYNCMSG pLastSyncMsg; MSG* msg; intlen; intreadpos, writepos; /* * 一个线程只能支持8个计时器。 * 一个MiniGUI应用程序只能有16个计时器。 */ HWND TimerOwner[8]; intTimerID[8]; BYTE TimerMask; } MSGQUEUE;
5.3 基础编程 • 与win32类似,采用消息机制 • 例子“hello,world!”窗口
例子 static intHelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) { HDC hdc; switch (message) { case MSG_PAINT: hdc = BeginPaint (hWnd); TextOut (hdc, 60, 60, "Hello world!"); EndPaint (hWnd, hdc); return 0; case MSG_CLOSE: DestroyMainWindow (hWnd); PostQuitMessage (hWnd); return 0; } return DefaultMainWinProc(hWnd, message, wParam, lParam); }
例子(续) intMiniGUIMain (intargc, const char* argv[]) { MSG Msg; HWND hMainWnd; MAINWINCREATE CreateInfo; CreateInfo.dwStyle= WS_VISIBLE | WS_BORDER | WS_CAPTION; CreateInfo.MainWindowProc= HelloWinProc; … hMainWnd = CreateMainWindow (&CreateInfo); if (hMainWnd == HWND_INVALID) return -1; ShowWindow(hMainWnd, SW_SHOWNORMAL); while (GetMessage(&Msg, hMainWnd)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } MainWindowThreadCleanup (hMainWnd); return 0; }
例子(续) • minigui/common.h:包括MiniGUI常用宏以及数据类型的定义。 • minigui/minigui.h:包含MiniGUI全局的与通用的接口函数以及其他杂项函数定义。 • minigui/gdi.h:包含MiniGUI绘图函数的接口定义。 • minigui/window.h:包含窗口相关的宏、数据结构、数据类型等定义以及函数接口声明。 • minigui/control.h包含libminigui库中所有内建控件的接口定义。 • HelloWinProc()函数:窗口过程函数,其中定义了事件反馈的动作:打印与关闭。 • MiniGUIMain()函数:MiniGUI程序Main函数入口,定义了窗口参数,并创建该窗口并建立消息传递动作。
5.4 对话框和控件编程 • 对话框模板 • CTRLDATA • DLGTEMPLATE • 控件编程
typedefstruct _CTRLDATA { const char* class_name; //控件类名 DWORD dwStyle; //控件风格 int x, y, w, h; //控件位置 int id; //控件标识 const char* caption; //控件标题 DWORD dwAddData; //控件额外数据 DWORD dwExStyle; //控件扩展风格 } CTRLDATA; static CTRLDATA CtrlStatic = { "static", WS_VISIBLE | SS_SIMPLE, 10, 10, 350, 15, IDC_PROMPTINFO, "正在...", 0 }
typedefstruct _DLGTEMPLATE { DWORD dwStyle; //对话框风格 DWORD dwExStyle; //对话框扩展风格 int x, y, w, h; //对话框位置 const char* caption; //对话框标题 HICON hIcon; //对话框图标 HMENU hMenu; //对话框主菜单 intcontrolnr; //对话框包含控件数目 PCTRLDATA controls; //对话框包含控件数组 DWORD wAddData; //对话框额外数据,必需为0 } DLGTEMPLATE; static DLGTEMPLATE DlgInitProgress = { WS_BORDER | WS_CAPTION, WS_EX_NONE, 100, 150, 400, 150, "正在进行初始化", 0, 0, 3, NULL, 0 };
static intInitDialogBoxProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam) { switch (message) { case MSG_INITDIALOG: return 1; … return DefaultDialogProc (hDlg, message, wParam, lParam); } static void InitDialogBox (HWND hWnd) { DlgInitProgress.controls = CtrlInitProgress; DialogBoxIndirectParam (&DlgInitProgress, hWnd, InitDialogBoxProc, 0L); } 非模对话框 HWND GUIAPI CreateMainWindowIndirect (PDLGTEMPLATE pDlgTemplate, HWND hOwner, WNDPROC WndProc); BOOL GUIAPI DestroyMainWindowIndirect (HWND hMainWin);
HWND GUIAPI CreateWindowEx (const char* spClassName, const char* spCaption, DWORD dwStyle, DWORD dwExStyle, int id, int x, int y, int w, int h, HWND hParentWnd, DWORD dwAddData); BOOL GUIAPI DestroyWindow (HWND hWnd);
5.5 图形编程 • MiniGUI提供了图形设备接口(GDI,Graphic Device Interface)用于丰富图形界面的设计。GDI是GUI系统的一个重要组成部分,通过使用GDI提供的接口,程序可以在计算机屏幕或者其它显示设备上进行图形输出,主要包括图形绘制和文本输出。 • 矩形操作函数 • 剪切域操作函数 • 常用绘制函数 • 逻辑字体处理函数 • 文本输出函数