Abstract: With the rapid development of embedded system, the man-machine interface of embedded Linux system has received more and more attention. How to develop a set of high reliability, long service life, multi-threading, multi-task real-time performance, etc. Become the focus of research on human-machine interface interaction. This article adopts PowerPC embedded platform to implant Linux operating system, use MiniGUI graphics development, and design a human-machine interface with real-time and high efficiency.
Keywords: PowerPC Linux MiniGUI human-machine interface
【中图分类号】TP316.85 【文献标识码】B 文章编号1606-5123(2018)02-0000-00
1 引言
如今,嵌入式开发已经作为一个热门话题,涉及到各个领域。由于嵌入式的飞速发展,嵌入式操作系统中的Linux系统具有功耗低、可靠性强、功能强大、性价比高、实时性强、支持多任务、占用空间小、效率高等特点,得到了越来越多开发者的青睐,本文采用了PowerPC嵌入式平台移植Linux操作系统进行人机界面的设计开发。
2 原理设计
2.1 PowerPC平台
本文所用到的powerpc平台为南瑞自主研发的基于Linux系统的,powerpc通用平台,采用MPC8309处理器,主频达400 MHz;DDR2时钟266 MHz;对外提供1个CAN网接口;提供8/16个RS-485串口,最高速率38400;提供2个10M/100M自适应以太网口;基于Linux操作系统,内核版本2.6以上。从图2中,可得本文所设计的人机界面具有有参数配置,数据实时显示,采集可控等功能,系统采用Linux
2.4 图形界面开发
本文采用MiniGUI图形系统进行界面显示开发,MiniGUI具有可伸缩强、轻型、占用资源少、高性能、高可靠性、可配置性等特点,所以本文嵌入式系统MiniGUI进行界面开发。
由于在目标板中调试MiniGUI较繁琐,需要频繁的往目标板中下载程序,所以通常,我们先将MiniGUI安装在PC机中,在PC机开发调试,最后进行交叉编译后下载到目标板中。
本文将MiniGUI安装在PC机中的Ubuntu10.04虚拟机中。现在虚拟机中安装minigui的相关库文件,如libminigui-gpl、libmgplus、Freetype、jpegsrc、libpng、qvfb、zlib等库,通过命令configure和make将这些库安装完成,即可进行MiniGUI程序编写工作。
3 MiniGUI的图形界面开发
本文界面显示流程图参见图3所示。
window.h 包含了窗口有关的宏、数据类型、数据结构定义以及函数接口声明。
使用预定义控件的MiniGUI 应用程序还必须包括另外一个头文件<minigui/control.h>:
control.h 包含了 libminigui 中所有内建控件的接口定义。
所以一个minigui程序的开始通常都要包括以下的头文件:
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
3.2 MiniGUI程序开发入口程序
一般MiniGUI程序的入口点为MiniGUIMain函数,本文所使用的函数原型为:int MiniGUIMain (int argc, const char* argv[])。
因为main函数已经在MiniGUI的库函数中定义,该函数在进行一些MiniGUI的初始化工作后调用MiniGUIMain函数。所以每个MiniGUI应用程序的入口点均为MiniGUIMain。参数argc和argv与C程序main函数的参数含义是一样的,分别为命令行参数个数和参数字符串数组指针。
3.3 MiniGUI界面程序
每个MiniGUI应用程序的初始界面一般都是一个主窗口,通过调用CreateMainWindow函数来创建主窗口,其参数是一个指向MAINWINCREATE结构的指针,本文创建窗口函数为:
int Logo()
{
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER ;
CreateInfo.dwExStyle = WS_EX_NONE;
CreateInfo.spCaption = "标题";
CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor(0);
CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = LogoWinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 640;
CreateInfo.by = 480;
CreateInfo.iBkColor = COLOR_black;
CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;
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;
}
主窗口函数中定义CreateInfo为MAINWINCREATE 结构;CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER ;设置主窗口风格,窗口设置为初始可见,并具有边框;CreateInfo.dwExStyle = WS_EX_NONE;设置主窗口的扩展风格,该窗口没有扩展风格;CreateInfo.spCaption = "标题";设置窗口标题;CreateInfo对窗口属性进行设置,还设置了主窗口主菜单样式、光标样式、主窗口图标、主窗口在屏幕上的位置、主窗口背景色、主窗口形式等。调用ShowWindow(hMainWnd, SW_SHOWNORMAL)函数将创建的窗口显示到屏幕上,第一个参数为要显示的窗口句柄,第二个参数为窗口显示方式。
调用ShowWindow函数后,主窗口会显示到屏幕上,然后进入消息循环。MiniGUI为每一个MiniGUI程序维护一个消息队列。在发生事件之后,MiniGUI将事件转换为一个消息,并将消息放入目标程序的消息队列之中。消息循环代码如下:
while (GetMessage(&Msg, hMainWnd))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
只要从消息队列中取出的消息不为MSG_QUIT,GetMessage就返回一个非0值,消息循环将持续下去。MSG_QUIT消息使GetMessage返回0,导致消息循环的终止。TranslateMessage函数把击键消息转换为MSG_CHAR消息,然后直接发送到窗口过程函数。DispatchMessage函数最终将把消息发往该消息的目标窗口的窗口过程,让它进行处理。本文中的窗口过程函数为LogoWinProc,函数代码如下:
static int LogoWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case MSG_CREATE:
……
return 0;
case MSG_PAINT:
……
return 0;
case MSG_ERASEBKGND:
……
return 0;
case MSG_KEYDOWN:
……
return 0;
case MSG_TIMER:
……
return 0;
case MSG_CLOSE:
……
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
本文所使用个消息有MSG_CREATE窗口创建消息,MSG_PAINT窗口绘制消息, MSG_ERASEBKGND窗口绘制背景消息,MSG_KEYDOWN键盘消息,MSG_TIMER系统消息定时器,MSG_CLOSE系统关闭消息。当点击关闭按钮时,窗口过程函数将收到一个MSG_CLOSE 消息,应该程序收到MSG_CLOSE 消息时调DestroyMainWindow 函数销毁主窗口,程序最后调用MainWindowThreadCleanup 清除主窗口所使用的消息队列等系统资源并最终由MiniGUIMain 返回。
3.4 目标板环境移植及程序下载
将minigui相关的库通过PowerPC工具编译链交叉编译,安装到Linux系统文件的lib库中,并将安装好的Linux系统移植到目标板中,这样目标板环境移植完成。然后将写好的应用程序通过PowerPC工具编译链交叉编译,生成的目标程序下载到目标板中,运行该目标程序。
3.5 显示效果
本文powerpc平台采用VGA液晶显示,需要在MiniGUI.cfg中配置gal_engine=fbcon,defaultmode=800x600-16bpp,显示效果分别如图4、图5所示。
4 结束语
本文所介绍的PowerPC平台移植Linux系统进行的人机界面开发已经用于实际工程中,具有多线程、多任务、响应及时的特点,为今后的嵌入式系统人机界面的开发工作起到了一定的借鉴作用。
参考文献
[1]北京飞漫软件.MiniGUI移植指南[M].北京:飞漫软件技术有限公司,2006.
[2]北京飞漫软件.MiniGUI编程指南[M].北京:飞漫软件技术有限公司,2006.
[3]王文启.嵌入式Linux图形用户界面的研究与开发[D].东华大学,2007.
[4]周晓光,翟尹羚.基于嵌入式Linux下的MiniGUI的应用[J].电脑知识与技术,2006,12(10):125-127.
[5]孙少华,徐立中.面向嵌入式Linux系统的图形用户界面[J].微机发展,2005,15(10):123-125.
作者简介
闫丽 (1984-) 女 硕士研究生 研究方向:自动化装置及仪器工程
共0条 [查看全部] 网友评论