推广 热搜: 电机  PLC  变频器  服务机器人  培训  变送器  危化品安全,爆炸  西门子PLC  触摸屏  阀门 

基于PC/104的图形界面控制软件设计

   日期:2013-03-23     来源:工控之家网    作者:工控之家    浏览:16    评论:0    
摘  要:在嵌入式PC/104选用的操作系统中,建立图形界面的人机接口软件在实际中有很大的意义,本文针对相关工业控制项目,讨论了有关基于消息处理机制的图形界面人机接口的建立方法和相关问题。

Abstract: Establishing Graphics User Interface software used on PC/104 is significant in the real industry project. This article discussed the method and problem of designing GUI based on message handling mechanism.

关键词:图形界面;操作系统;控制系统

Keywords: Graphic User Interface. OS. Control System

1 引言

  在新兴的嵌入式PC/104应用领域,因其硬件的独特特点,往往要求使用者的软件操作系统要具备以下特点:

  ● 操作系统占用空间小,大约占用几M或十几M;

  ● 系统稳定性好;

  ● 对硬件配置要求低;

  ● 软件开发灵活性高;

  ● 可以直接对硬件操作,控制响应速度快。

  基于这样操作系统的软件有时又要求为用户提供一个良好的人机界面,而这类操作系统往往在图形界面的能力上与Windows相比有着明显的不足,针对这一难点,本人在基于注塑机械手控制软件的图形界面开发上,进行了积极的探索,希望对相关的软件开发有所帮助。

  建立与用户交互的图形界面,除了要在系统上画出图形外(这类系统往往提供绘画函数),最关键的是要在图形上建立软件对用户操作的响应,即类以于Windows系统中,系统针对用户对图形上的各种功能图案(如按钮)的点击要给予响应。所以建立图形界面关键是要在用户与软件之间建立起一种交互机制,针对这一问题,本文以下部分将详细进行讨论。

2 事件控制机制

  软件程序有两种基本控制机制,即顺序驱动(或过程驱动)机制和事件控制机制,采用顺序驱动机制设计的程序有一个明显的开始、明显的过程和明显的结束,这样的控制机制不利于建立友好的人机接口。还有一种程序控制的机制,即事件驱动机制,采用事件驱动机制设计的程序,由事件的发生来控制。这样的程序控制机制能够为用户提供更好的人机接口。

  采用事件驱动机制在人机交互很强的程序设计中比较适用,它给用户在程序的运行上以选择的余地。事件驱动控制机制多在基于Windows的软件上使用,Windows上的软件开发大多使用VC、VB等一些可视化开发平台,这些平台往往已经为用户提供了事件驱动机制,用户只需设计相关事件处理程序,在程序编制过程中并不涉及事件驱动机制的内部运行机理。而在本文所讨论的开发环境下,必须自己搭建事件驱动机制平台,在这一点上增加了程序设计的难度和复杂性。

  采用事件驱动机制可以大大减少消息丢失的可能性,如当程序正在处理某一个消息时,又产生了新的消息,这时事件驱动机制会将新消息放入消息循环队列,等到当前消息处理完后再处理新来的消息,从而防止了消息丢失的可能。这种程序控制方式非常适用于系统及时响应用户的请求,与用户建立友好的人机接口。这比采用顺序驱动机制设计的程序对用户来说更友好。

3 搭建事件驱动机制平台

  在用户界面设计中,事件就是用户通过各种输入设备进行操作时所产生的各种信号,又称消息。该消息是一种激发性的用于联系用户、计算机系统以及应用软件之间交互活动的最基本信号。比如,用户按下键盘上的某个键就可以形成一个消息,因为用户的这一行为会对系统产生一个激发性的信号,使得系统由原来的某种状态转为另一种状态。

  消息的产生方式很多,主要由用户通过按下键盘上的某个键或移动鼠标器并按下其上的某个键来产生。对于消息的产生者我们又称之为消息源。消息源包括鼠标器、键盘、串行端口中断、有关的软件工具、设备驱动器、其它的输入设备、其它的定位设备等等,甚至还可以是应用程序自身。

  由于事件是激发人机交互活动最基本的因素,因而人机交互活动的关键就是研究由事件产生的消息处理技术及其算法。用户界面的质量高低,在某种程度上取决于事件及消息管理技术的优劣

  3.1 事件驱动机制的实现方法

  以下列出本人所参与的注塑机械手控制软件中,用于装载键盘和鼠标事件所产生消息的消息队列的数据结构:

  struct event_define

  {

  struct event_define *Last;

  unsigned char ScanCode;

  unsigned char KeyState;

  int MouseState;

  int CursorX;

  int CursorY;

  struct event_define *Next;

  };

  下面介绍这一结构体中各个元素的功能:

  ● struct event define *Last 中的指针Last用于装指向上一个消息队列记录的地址;

  ● struct event define *Next 中的指针Next用于装指向下一个消息队列记录的地址。这两个指针中的内容是在消息队列初始化过程中完成的,使消息队列形成首尾相链的队列,同时头指针与尾指针都指向消息队列中的默认为0的消息数据记录;

  ● unsigned char ScanCode中的ScanCode用于装键盘敲击事件发生时,被敲击键的键值;

  ● unsigned char KeyState中的KeyState用于装键盘敲击事件发生时当时键的状态(压下或抬起);

  ● int MouseState中的MouseState用于装鼠标事件发生时鼠标消息的内容,如鼠标左键压下、左键抬起等;

  ● int CursorX和int CursorY中的CursorY和CursorX分别用于装鼠标事件发生时鼠标在显示屏上的坐标值;本项目中有关消息的装入都是用中断方式来完成的,下面简要介绍有关中断处理的具体方法。

  在程序中,当鼠标、键盘和串口数据事件发生时,本程序把这类事件当做中断来处理。这样做的好处在于:CPU不必花大量的时间去查寻外部事件是否产生。因为,中断事件何时发生是不能预知的,一旦有外部事件请求中断,则会向CPU的接收中断信号的引脚发出电信号,这些信号CPU是马上可以知道的。如键盘何时有键按下,是随机的,CPU不用反复查寻键盘状态,而可以去执行其它程序,一旦有按键按下,键盘马上产生中断请求信号,CPU得知这信号后,便立即去执行为键盘服务的中断程序。服务完后,CPU又恢复执行被中断了的程序逻辑。

  中断方式处理事件的优点在于:执行速度快,可实时处理,不占用CPU过多的时间等优点。注塑机械手控制软件中,中断服务程序完成的主要任务就是把中断事件装入相应的消息队列中。如:当有键盘敲击时,就把键盘当前被敲击的键值及状态放入消息队列,紧接着把尾指针指向下一个消息队列数据记录。如果在键盘敲击前,头指针与尾指针指向同一个消息队列数据记录,则键盘敲击后,尾指针指向了下一个消息队列数据记录,这样头指针与尾指针就指向了不同的消息队列数据记录。若此时又有新的消息进入,则把它放入尾指针当前消息队列数据记录中,并把尾指针前移,指向下一个消息队列数据记录。而主程序则用循环结构不断检测消息队列的头指针与尾指针是否指向同一地址。若二者指向同一地址,则转入下一次循环,再次检测消息队列的头指针与尾指针是否指向同一地址,如此反复。若某次检测发现头指针与尾指针指向了不同地址则说明有消息装入消息队列,此时主程序将读出消息内容,并将头指针向前移动,使之指向下一个消息队列数据记录的地址,接着对当前消息做相应的处理,处理完成后再次检测消息队列的头指针与尾指针是否指向同一地址,若不同则做相应处理,若相同则进入下一轮循环,如此反复。这样由外部事件将消息放入消息队列中,使尾指针前移;而主程序按先进先出的顺序读出消息队列中的数据记录,并使头指针向前移动,然后根据消息内容做相应处理。这种事件处理方式又称消息处理机制,如图1。

  在上述消息处理的过程中易出现一种特殊情况,即消息密度较高,主程序处理的速度低于消息装入消息队列的速度,最后将导致消息队列装满,却仍有新消息产生。针对这种情况,有两种处理方法,一种是忽略新来的消息;一种是用新来的消息覆盖原来的消息。本程序采用的办法是忽略新来的消息,直到消息队列空出新的队列数据记录,才将空出队列后产生的消息装入队列。如果这种情况发生,就会导致队列装满后和在队列空出新的数据记录期间产生的消息不被响应和处理,这种情况在程序实际运行中是不允许发生的。为了避免这种主程序处理的速度低于消息进入的速度的情况,可以采取的措施有三个:

  ● 中断服务程序用汇编语言编写;

  ● 主程序消息处理部分尽量简洁;

  ● 设定消息队列的数据记录个数足够大。


图1 消息处理机制

  中断服务程序用汇编语言编写,这样可以使得中断服务程序更简练,占用CPU时间更少,从而为主程序运行提供了更长的时间。这样就使得原来可能产生数据阻塞的情况,在用汇编语言编写中断程序后,主程序运行分配的时间加长,主程序能够完成消息处理,及时空出消息队列数据记录,为新来的消息提供数据记录空间。

  主程序消息处理部分尽量简洁,就会加快主程序消息处理的速度,从而使主程序消息处理的速度大于消息装入的速度。

  设定消息队列的数据记录个数足够大,这样就会使新来的消息有一个足够大的消息队列数据记录空间,就好比一个较大的缓冲区,用以存放新来的消息数据。这样即使新来的消息比较密集,也有一个比较大的空间存放。从而间接为主程序处理消息提供了时间。但实际上消息队列数据记录空间的大小是有上限的,所以在程序设计中这一问题的解决是由三个手段综合解决的。

 
打赏
 
更多>同类环保知识
0相关评论

推荐图文
推荐环保知识
点击排行
网站首页  |  免责声明  |  联系我们  |  关于我们  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  RSS订阅  |  违规举报  |  鲁ICP备12015736号-1
Powered By DESTOON