APP下载

基于有限状态机的人机交互界面软件设计方法

2011-01-23

中国新技术新产品 2011年3期
关键词:调零键值状态机

任 娜 郭 锴

(江苏省交通技师学院信息系,江苏 镇江 212006)

基于有限状态机的人机交互界面软件设计方法

任 娜 郭 锴

(江苏省交通技师学院信息系,江苏 镇江 212006)

本文基于嵌入式系统并运用模块化思想,设计了一种相对独立的通用化的工业分析仪表人机交互界面系统。程序设计基于事件目标驱动模型,以有限状态机的方式,在实时操作系统μC/OS-II中,用状态机把目标和事件联系起来,实现OA(Object-Action)行为模式完成人机交互的过程,开发出符合工业分析仪表应用要求的人机交互界面软件系统,并实现软件与硬件的低耦合性,提高代码的重用率,降低开发周期并提高软件设计的可靠性。

有限状态机;人机交互界面;uC/OS-Ⅱ

1 引言

随着国民经济的高速发展,工业过程分析仪表的应用越来越重要及广泛,对工业分析仪表的性能的要求也越来越高。作为工业分析仪表的重要组成部分的人机交互界面,对工业分析仪表的性能有着重要的影响,由于目前CPU的处理能力已不是制约工业分析仪表系统应用和发展的主要障碍,所以人机交互界面的设计水平已经成为决定整个仪表系统性能的主要制约因素。

工业仪表软件开发的一个重要问题是与硬件的耦合过强。本文针对前工业分析仪表人机界面设计现状和问题,提出了一种“基于小型化实时操作系统(μC/OS-II)+状态机的人机界面设计方法”;能够较好地降低工业仪表设计过程中人机交互界面软硬件过度耦合的问题,提高代码的重用效率,降低开发周期并提高软件设计的可靠性。

2 有限状态机的形式化描述

2.1 有限状态机。有限状态机(Finite State Machine,简称FSM)是一种具有离散输入输出系统的数学模型,它以一种“事件驱动”的方式工作,可以通过事件驱动下系统状态间的转移,来表达一个控制系统的控制流程[1]。

2.2 层次式有限状态机。对于像工业分析仪表HMI系统这样较为复杂的系统而言,传统的有限状态机是无法对系统进行清晰的建模,因此在这里采用一种层次式的FSM表达方法。层次式FSM类似于软件工程中结构化分析方法中的数据流图,如图1所示,其组织原则是:建模对象是一个复杂的系统,将控制系统划分为多个相互协作的超状态机(S1,S2,包含有子状态机),每个超状态机根据要求又被划分为多个相互协作的子状态机(S11,S12,S21,S22),不能被细分的子状态机被称为基状态机(S11,S12,S21,S22)。

图1 层次式FSM示意图

在层次式FSM中,每个基状态机都对应着一个父级的状态机,多个基状态机的相互协作的状态机子群构成一个低层次的FSM。这样子群内状态机间的层次和逻辑关系构成了相应FSM间的层次和逻辑关系。复杂系统的控制流程就可以由这样一组FSM来表达:{一个顶层FSM,若干个一层FSM,若干个二层FSM,…}。

超状态机至少包含了一个子状态机,父状态机对子状态机的包含关系实质上体现了子状态机对父状态机控制行为的继承。这种继承类似于面向对象程序设计模式的类继承特性,有了这种继承特性,在编程的时候可以按差异性进行,只需要定义子状态机和父状态机行为的不同之处,而其它的则可以重用在父状态中的定义,这便极大地优化程序的结构和提高了程序的可维护性。

2.3 界面化的FSM。有限状态机FSM(Finite State Machine)由状态、事件、转换和活动组成。每个状态有1个状态进入动作(entryaction)和1个状态退出动作(exit action),每个转换有1个源状态和目标状态并且与1个事件相关联。另外当初始化时,我们定义了一个初始化信号量;以及界面的刷新,我们定义了一个复位信号量。当在源状态时,该事件发生且触发转换的监护条件为真,则顺序执行下列一些动作:①源状态的退出动作;②转换动作;③目标状态的进入动作。

对状态定义的信号量如下:

用软件实现有限状态机有两种方法:表格法和过程驱动法。表格驱动法利用一个二维数组[2],该数组中的短一行与一个状态相对应,每一列与一个输入事件相对应,每一项则与某一状态下对事件的处理相对应。表格驱动法适用于具有结构规则、操作简单的有限状态机。

过程驱动法为每一个状态都定义一个处理过程,处理过程实现在此状态时对事件的响应,包括输出处理及对当前状态值的转换。这个过程可以用case语句区分事件,并采用相应的处理。无论采用何种方法实现FSM,当FSM收到一条消息时必须知道当前的状态。为此,对应每一个状态机必须能够保存当前所处的状态。过程法适用于实现一个具有几种转换和复杂操作的有限状态机。

基于消息驱动的程序设计思想,为了保证系统的实时性,在中断中只负责发送消息到相应的任务的消息队列,由应用级的任务来处理,保证各个处理的时间是可确定的。主程序在消息循环中不断地判断各个任务的状态,执行进入就绪态的任务。这就允许采用异步方式处理各种中断及任务。

3 软件设计

3.1 状态机的软件实现。本系统程序中采用了两组有限状态机,运用消息驱动的方式来驱动状态的变更。一组是通信任务中以串口接收数据驱动为事件对象的有限状态机,另一组是以用户按键和命令码驱动为事件对象的有限状态机。

3.1.1 通讯的有限状态机。为了保证通信的可靠,系统中采用停止等待协议。在发送数据前要对数据打包,接收到数据要先解包,处理器在接收主系统发过来数据包的后需要去掉通信协议字段,然后对有效数据进行正确的处理。为此,定义了一个Frame-FSM类型的数据结构,用来对接收到的数据进行处理。

利用主机发送过来的消息驱动有限状态机,串口接收数据驱动的有限状态机包括以下几种状态;(1)任意状态。(2)任意状态(除了INIT_STATE之外)。(3)INIT_STATE,初始状态。(4)AA_SYN_STATE,收到同步字符状态。(5)SRC_ADDR_STATE,收到源地址状态。(6)DEST_ADDR_STATE,收到目的地址状态。(7)DATA_LEN_STATE,接收数据长度状态。(8)DATA_STATE,接收正常数据状态。(9)CHECKSUM_STATE,接收校验和状态。

对应的状态转换图(state transition diagram)如下图所示。

图2 状态转换图

3.1.2 键值和命令码驱动的有限状态机

这组有限状态机主要依靠用户对菜单的操作进行状态转换,即把键值和命令码作为FSM的激励源,其中键盘消息是最主要的激励源。应用层的FSM具有多种主状态,用户未按键或者是没有接收到新的数据帧时,状态处于IDLE_STATE;接收到消息后,转入对应的主状态。然后,根据按键的不同或者是接收命令码的不同,转入对应的子状态进行处理。任务处理完毕,再将状态置为IDLE_STATE,按取消键,可回到上一级状态。

以用户控制仪表调零,系统开始处于IDLE_STATE(选中调零菜单选项)。若用户按确认,则进入调零参数设置页面,并显示当前设置的调零参数.选择确认键,进入确认当前调零状态;选择确认件后仪表进入调零状态,在该状态执行向上命令操作后,状态重新转入IDLE_STATE,并伴随着输出菜单的相应变化,按取消键可回到上一级选择状态。对于其他按键,系统全部过滤掉不作响应,状态也不进行转换。仪表调零设置的状态转换图如下图所示。

图3 仪表调零设置的状态转换

3.2 基于μC/OS-II的模块化设计

在实时操作系统μC/OS-II下,整个HMI分为四个模块,三个任务来实现,分别是键值处理模块、与主机通信模块和时钟模块以及界面显示模块。(为了结构的清晰,我们把键值的处理单独成立一个任务,实际为了方便和实时性的处理,把键盘的处理放在TICK中处理也是很好的一种处理方法)。

3.2.1 键值处理模块

OSTaskCreate(KEYTaskStart,(void*)0,&TaskKey-Stk[],5);

先初始化所有的模块,然后在循环中接收并处理键盘的输入,Key-Process(char Key Value)根据相应的输入键值和系统所处的状态,对菜单进行相应的操作。

State_Trans(char RxData)根据键值输入事件负责调度系统的状态,并在相应的状态下,根据从主系统收到的信息显示菜单。

3.2.2 主机通信模块

OSTaskCreate(UARTTaskskStart,(void *)0,& TaskU-artStk[],4);

OSTaskCreate(CANTaskskStart,(void*)0,&TaskU-artStk[],3);

通过消息队列OSQPend(OS_EVENT*pevent,INTl6U timeout,INT8U*err),接受串口或者CAN中断发来的消息队列,对其中的数据进行处理。在人机交互的过程中,需要大量的与主系统的交互,单独用一个任务负责与主系统的通信,实现串口和CAN接收数据驱动的有限状态机。

3.2.3 时钟模块

OSTaskCreate(TimcTCk,(void*)0,&TimeTickStk[],2);

时钟任务,使用处理器的时钟中断,可以设置各个任务需要的定时器,通过消息队列发给需要定时的任务。

3.2.4 界面显示模块

OSTaskCreate(Task_HMIRun,(void*)'9',&Task_HMI_Stk[TASK_HMI_STK_SIZE-1],6);

界面显示任务,初始化状态机,以及父状态界面,通过获取实时状态,实现界面的切换和事件的处理。

4 测试

HMI系统的测试采用μC/OS-II V2.52较以前的版本,该版本增加了两个系统任务:CPU负荷监测任务与堆栈容量检查任务。这两个任务给程序的调试带来很大的方便[3]。

将系统配置常数OS_TASK_STAT_EN设为l,统计任务OSTaskStat()就会建立。它每秒钟运行1次,计算出当前CPU的利用率,放在一个有符号的8位整数0SCPUUsage中,精确度是l%。μC/OS-II内存是固定分配的,通过0STaskStkChk()可确定每个任务实际需要的最大堆栈空间,根据测得结果合理地分配内存空间。表l是用以上函数测出的系统参数。使用MC9S12XDT512单片机系统相应的调试工具CodeWarrior,可跟踪程序的运行。通过运行在PC机上CodeWarrior能够追踪程序中各种参数的变化,查看处理器内存的使用情况。

表1 系统参数的测量结果

在实际测试中,采用μC/OS-II系统及有限状态机的HMI系统,比普通前后台系统的实时性提高35.2%,测试时间缩短14.3天,MTBF≥1440hour,代码重用率≥75%,整体性能得到了很大的提高

结论。经测试证明,使用实时操作系统前。运用前后台的程序设计方式。在需要显示较多数据在屏幕上,同时又需要接收数据时,处理器处理不及时,可以通过调试工具CodeWarrior看到接收缓存接收的数据帧不完整,而不能正确地在屏幕上显示数据。移植μC/OS-II操作系统之后,工作可靠,同时系统的反应速度,即实时性有了很大提高。本章介绍的HMI系统与嵌入式主系统是独立的模块,可以灵活地在处理器上加载控制模块,适合应用于各种嵌入式系统中。

[1]梁伟晟,李磊.基于与或逻辑的界面关系模型表示方法.计算机科学,2008,35(4):203-204.

[2]刘成玉,李明,陈洁.浅谈状态机的设计方法及应用[J].集成电路通讯,2007,25(1):20-24.

[3]赵楠,王军政,沈伟.基于uC/OS-Ⅱ的齿轮流量计二次仪表的设计[J].微计算机信息,2006(7):52~54.

TP29

B

猜你喜欢

调零键值状态机
自适应调零天线对抗技术仿真研究
基于有限状态机的交会对接飞行任务规划方法
初中生音乐想象能力的“凋零化”现象探析
差分放大电路的研究
FPGA设计中状态机安全性研究
基于反熔丝FPGA的有限状态机加固设计
注册表值被删除导致文件夹选项成空白
基于VHDL的一个简单Mealy状态机
“扫除”技巧之清除恶意程序