您好,欢迎来到暴趣科技网。
搜索
您的当前位置:首页uClinux下基于MiniGUI的监控终端的实现

uClinux下基于MiniGUI的监控终端的实现

来源:暴趣科技网
uClinux下基于MiniGUI的监控终端的实现 发布: 2010-4-04 14:47 | 作者: 未知 | 来源: MCU嵌入式领域 摘 要  介绍了MiniGUI的主要特点,实现了MiniGUI在μClinux下的移植,最后给出了基于MiniGUI的监控终端软件开发的详细流程。

关键词  嵌入式; μClinux ;MiniGUI;arm7;数据监控

1 引言

    随着软硬件资源的成熟与完善,嵌入式技术在工业控制领域中应用广泛。而开放源码的Linux操作系统成为开发嵌入式产品的首选。本系统采用了μClinux操作系统,它是专为没有MMU(内存管理单元)的CPU而设计的,并且提供了多种设备驱动、网络通信协议,大大简化了应用程序的开发过程。

同时,配备一个高性能的GUI ( 图形用户界面 ),使用户与产品能进行方便的、可靠的交互,也已成为嵌入式开发工作中的一个重点。本系统使用的MiniGUI就是嵌入式系统下一个小型的GUI支持系统,它具有占用资源少、高性能、高可靠性及可配置的特点,已经成功移植到多种硬件和操作系统平台上。

2  MiniGUI的特点和体系结构

    MiniGUI由魏永明先生主持开发,目标是为基于Linux的嵌入式系统提供一个小型的GUI支持系统。 2.1 MiniGUI的特点                             MiniGUI的主要特点有:

    (1) 遵循GPL条款的纯自由软件。

    (2) 多字符集和多字体支持,目前支持 ISO8859-1、GB2312及Big5 等字符集,并且支持各种光栅字体和 TrueType、Type 1 等矢量字体。

    (3) Windows的资源文件支持,如位图、图标、光标、插入符、定时器及加速键等。     (4) 可配置。可根据用户的需求进行配置和编译。     (5) 提供了完备的多窗口机制和消息传递机制。

    (6) 小巧,经过裁减的minigui应用程序(包括资源和配置文件)不超过700K。     (7) 可移植性好。 2.2 MiniGUI的体系结构

   从整体结构上看,MiniGUI是分层设计的,层次结构如图1所示。

                     图1MiniGUI体系结构图

    在最底层,GAL和IAL提供底层图形接口以及输入设备的驱动;中间层是MiniGUI 的核心层,包括窗口系统必不可少的各个模块;最顶层是API,为用户提供编程接口。GAL和IAL为 MiniGUI提供了底层的图形接口以及输入接口。

3  MiniGUI在44B0上的移植

   本系统采用的开发板配置如下:三星公司生产的S3C44B0,2M Nor Flash,16M Nand Flash,8M SDRAM。   MiniGUI 1.3.3版发布时含资源文件压缩包minigui-res1.3.3.tar.gz、库文件压缩包libminigui-1.3.3.tar.gz 。

   编译库文件压缩包libminigui-1.3.3.tar.gz时,解压命令tar zxvf libminigui-1.3.3.tar.gz 。进入到minigui库文件所在目录下运行configure命令对库文件进行配置:

CC=arm-elf-linux-gcc \\ ./configure --prefix=/opt/usr/local \\  --target=arm-linux --build=i386-linux --host=arm-linux --disable-vbfsupport \\     --enable-lite --enable-standalone --disable-shared --disable-micemoveable  \\ --disable-nativeial --disable-newgal --enable-nativegal --enable-fblin8   \\  --enable-cursor  --enable-ipaqial \\

   其中,arm-elf-linux-gcc是针对arm7体系结构目标的编译器,prefix是文件安装路径的前缀,build是指执行编译的机器,这里是x86的开发主机;target是运行该编译器所产生目标文件的机器;ipaqial是使用的触摸屏的输入引擎;由于本系统的任务不是很复杂,只需运行一个minigui应用程序,所以选择了standalon

e版本;并且μClinux不支持动态编译,所以选择了静态编译。用户还可以根据自身的需要对minigui的库文件进行配置。配置完,运行编译安装命令。    用下面的命令编译用户应用程序:

     arm-elf-linux-gcc –elf2flt –I /opt/usr/local/include –L /opt/usr/local/lib –o helloworld helloworld.c –lminigui

    根据用户的配置相应修改MiniGUI.cfg。把helloworld ,MiniGUI.cfg配置文件和资源拷贝到相应目录下,制作romfs文件系统,把romfs文件系统重新烧写到开发板上。重启开发板,在shell提示符下运行helloworld ,可以看到应用程序输出的效果。至此,MiniGUI图形包在目标板上移植安装完成。    移植过程中要注意的问题:     (1) 触摸屏输入引擎的编写

       对触摸屏来讲,MiniGUI 能够自动识别移动信息,也能够自动识别用户的单击和双击事件。这样,底层输入引擎只需提供位置信息和当前的按键状态信息就可以了。修改src/ial/ipaq.c 源码中相关的部分:

static int mouse_getbutton(void)   {

           return pos.b;   }

    函数mouse_getbutton()返回触摸屏的状态(是否被点击)。

    wait_event() 被定时调用。如果触摸屏被点击,则读取触摸屏的位置信息和当前的按键状态信息。相关部分代码如下:

  read (ts, &pos, sizeof (POS));   if ( pos.b==1) {      mousex = pos.x;      mousey = pos.y;

     pos.b = ( pos.b > 0 ? 4:0);      return IAL_MOUSEEVENT;   }

     用户需根据读取触摸屏返回的数据格式做相应的修改。     (2) MiniGUI 字体文件的裁减

    修改 /etc/MiniGUI.cfg,删除某些不需要的字体文件。删除的方法是修改 fontnumber 键值,对应的那些字体文件,就可以从系统中删除了。用户可以只保留rbf中的两个字体,一个中文的,一个英文的,其余的都可以删掉的。裁减后的字体文件不超过300K。

4  监控终端软件开发     ⑴ MiniGUI的消息驱动机制

    MiniGUI 提供了消息循环机制,而应用程序的结构一般是消息驱动的,应用程序通过被动接收消息来工作。本系统中采用了standalome版本,它基于客户/服务器(C/S)体系,在服务器和客户之间传递输入设备数据,以及客户和服务器之间的某些语法和响应数据。

    MiniGUI程序的入口点为MiniGUIMain,在该函数中先设置主窗口一些基本属性,建立每个客户程序唯一的一个消息队列。如果应用程序为lite版本MiniGUI下的应用程序,则应首先调用SetDesktopRect函数来设置程序的显示区域,然后调用CreateMainWindow函数创建并显示程序的主窗口,最终进入消息循环。在主窗口建立时,通过设置MainWindowProc,可以定义对应该窗口的过程函数。

    MiniGUI使用消息驱动作为应用程序的创建构架。窗口过程函数主体上都是switch和case结构的选择语句,不同的消息对应响应的处理子函数。MSG_CREATE消息在窗口生成时被发送。MSG_PAINT一般是在调用UpdateWindow重绘时发生,用户可根据需要定义相应的操作子函数。MSG_CLOSE即是关闭窗口时的动作,一般调用DestroyMainWindow销毁主窗口,调用PostQuitMessage退出消息循环。    (2) 数据监控软件实现

    数据监控终端用户界面程序选择在μClinux启动的时候自动运行,首先弹出的是用户登陆窗口。用户输入密码,然后登陆到控制界面。MiniGUI应用程序框架如图2所示。

图2 MiniGUI应用程序框架图      

     

    因MiniGUI应用程序需要和监控主机服务程序交换数据,所以我们采用了经MiniGUI包装过的Socket通信机制。

    在MiniGUI应用程序建立一个监听套接字。

    sockfd=socket(AF_INET,SOCK_DGRAM,0);     bzero(&my_addr,sizeof(my_addr));     my_addr.sin_family=AF_INET;     my_addr.sin_addr.s_addr=INADDR_ANY;     my_addr.sin_port=htons(3000);

    bind(sockfd,(struct sockaddr_in *)&my_addr,sizeof(struct sockaddr_in));     RegisterListenFD(sockfd,POLLIN,hWnd,NULL);

    通过MiniGUI的API函数RegisterListenFD注册监听套接字sockfd 。当监控服务器有连接请求时,MiniGUI应用程序的窗口过程函数中会收到MSG_FDEVENT消息,我们可以在这里添加相应的数据处理子函数:

  case MSG_FDEVENT:

  if(LOWORD(wParam)==sockfd) {     acc_fd=serv_accept(sockfd,&uid);   if(acc_fd>0){

    readsocket(acc_fd,buf,20);   }

    MiniGUI应用程序同时需要从串口读取数据。首先在对话框创建时通过子函数InitCom1()设置好串口0相关参数,如波特率,数据位和停止位等.然后调用RegisterListenFD()注册监听串口数据。

case MSG_INITDIALOG:     fd1=InitCom1(); 

    RegisterListenFD(fd0,POLLIN,hDlg,NULL);     return 1;

    和监听网络socket类似,在消息MSG_FDEVENT中处理从串口读取来的数据。

    MiniGUI应用程序通过网络socket监听监控服务器发出的命令请求,根据不同的命令信息,向串口发送不同的数据;同时,监听串口0,读取从串口0返回的数据,再通过网络socket把数据信息返回到监控服务器。    

                5  结论

   本系统采用了基于μClinux的MiniGUI应用程序开发,同时实现了数据的远程采集和现场控制,取得了良好的控制效果。该系统在楼宇自动化、工厂监管一体化等场合有着广泛应用的前景。

参考文献

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baoquwan.com 版权所有 湘ICP备2024080961号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务