微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 模式在主控机软件中的应用与研究

模式在主控机软件中的应用与研究

时间:01-19 来源:互联网 点击:

SingletonPattern)[2]属于创建型模式,它让类自身负责创建自己的实例,并保证这个实例是此类的唯一实例,而且它提供一个全局获取点来获取此实例。用C#描述的算法框架如下:

class Singleton{
private static Singleton instance;

private Singleton() {} // 保证此类在类外部不被实例化
public static Singleton Instance(){ //提供一个全局获取点
if (instance == null){ // 保证此实例的唯一性

instance = new Singleton(); //类自身创建自己的实例
}
return instance;
}

}

5.2对象池模式

对象池模式(Object Pool Pattern)是由单件模式发展而来的创建型模式[4]。当创建一个对象的代价很高或使用的某个类的对象数目固定时,可以用对象池模式复用这些对象。这些对象的产生和管理必须遵守一些明确的规则,例如如何管理一个对象、多少对象被产生、当这些对象完成它们当前任务后如何复用它们等等。保管箱系统中,每个下位机是一个对象,下位机对象的数目是固定,因此在通信层中可以引入对象池模式生成和管理这些对象。引入对象池模式后通信层的结构如图3所示。

图3 引入对象池模式后通信层的结构图

对象池模式由下位机类KeyRack和类的管理者KeyRackManager类组成,此模式不仅包括下位机对象的产生,而且包括对下位机对象的管理。KeyRackManager处理成单件模式,它是唯一的可以产生KeyRack对象的类。它的数据域中有一个私有数组racks,用来存贮 KeyRack对象,在KeyRackManager的构造函数中初始化racks。方法acquireKeyRack用来获取一个有钥匙的下位机对象,实现算法如下:

public KeyRack acquireKeyRack(){

int i=0;

while (i MAX){ //MAX是一个表示下位机个数的常数

if (racks[i].Status.Equals(KeyRackState.有钥匙)){

 break;

}

i++;

}

if (i>= MAX){

throw new Exception("当前没有可用钥匙");

}

return racks[i];

}

以上算法说明当业务层需要一个KeyRack对象时,只需要调用通信层上的方法acquireKeyRack即可获得,而不需要知道此对象的产生方式。开发者根据需要也可以指定具体需要哪一个下位机对象。方法releaseKeyRack用来从racks中释放一个钥匙架对象。 statisticalState用来统计下位机对象的当前状态。

类KeyRack包含的属性有:下位机标识符ID、当前下位机状态Status(有钥匙、无钥匙或损坏)。方法getMCUState用来与编号为 id的下位机通信,并把获取的状态信息赋给属性Status;此方法被类的构造函数调用;在Windows系统下实现与下位机串行通信的方便途径是采用专门处理串行通信的控件。

为了保证通信的可靠性,一方面在设计下位机软件时采用状态重复检测、关键字重发等措施,另一方面在主控机软件的通信层中采用双重检测。

在类KeyRack中对标识符为pID的下位机状态进行定时检测,算法如下:

public KeyRack(int pID)

{ …

ID=pID;

  System.Timers.Timer aTimer=new System.Timers.Timer();//检测初始化

aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);

aTimer.Interval=1000; //1秒检测一次编号为ID下位机

aTimer.Enabled=true;

}

private void OnTimedEvent(object source, ElapsedEventArgs e){ 

getMCUState( ID ); //与编号为ID的下位机进行通信

}

在类KeyRackManager中对所有下位机状态进行定时巡察,算法如下:

private KeyRackManager( ){

System.Timers.Timer aTimer=new System.Timers.Timer(); //巡察初始化

aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);

aTimer.Interval=2000; //2秒钟巡察一次

aTimer.Enabled=true;

}

private void OnTimedEvent(object source, ElapsedEventArgs e){ //巡察

int i;

for (i=0;i MAX;i++){

racks[i].Status=racks[i].currentState(i);

}

}

以上通过KeyRack和KeyRackManager实现双重检测,保证了通信层向业务层提供高可靠性的信息。

6 结束语

文中介绍了在PC机与多个单片机构成的应用系统中主控机管理软件的三层体系结构模式和通信层中采用对象池模式及双重检测技术。我们使用这些技术开发了银行保管箱系统,实际运行证明,该系统稳定、可靠、易维护。同时,文中提出的带有通信层的三层体系结构模式及在通信层中采用对象池模式和双重检测方法可以推广到其它相似的应用系统中。

本文作者创新点:明确提出主控机软件的三层体系结构,使得主控机软件设计更加清晰;对通信层的设计首次提出使用对象池模式和双重检测方法,保证此层具有高可靠性和较好的可维护性。

作者简介:

沈峰,男,1976年生,安徽蒙城人,硕士研究生,主要研究领域为面向对象的系统模型和

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top