一种实现设备驱动的系统及方法

文档序号:6564342阅读:137来源:国知局
专利名称:一种实现设备驱动的系统及方法
技术领域
本发明涉及设备的驱动技术,尤其涉及一种实现设备驱动的系统及方法。
背景技术
随着技术的发展以及应用的需要,针对一类产品或设备通常有不同版本的驱动模块来驱动不同版本的设备。其中,每个驱动模块包括多个用于控制驱动的控制组件,这些不同版本的控制组件的功能相同或相近,只是各自的接口不同。
当出现新版本的设备时,需要对设备驱动进行升级。现有技术中,由于各版本设备的控制组件接口不同,因此,为了实现对新版本设备的驱动,需要在原设备驱动的基础上添加判断分支,根据该判断分支,找到该版本设备的驱动模块,通过该版本设备的驱动模块中各控制组件接口,实现对新版本设备的驱动。
可见,现有技术中,每出现一个新版本设备,便添加一个判断分支,当不同版本的设备越多时,判断分支也越多,造成结构庞大,不易管理。并且由于不同版本的控制组件的功能相同或相近,因此不同判断分支中控制组件的代码也相同或相近,不同控制组件之间存在很大的代码耦合性,当需要修改某个功能特性时,所有版本驱动模块的控制组件都需要进行修改,可维护性较差,且实现复杂。

发明内容
有鉴于此,本发明一方面提供一种实现设备驱动的系统;另一方面提供一种实现设备驱动的方法。能够提高可维护性,且实现简单。
本发明所提供的实现设备驱动的系统,包括接口模块、管理模块和至少一个版本驱动模块,其中,管理模块,用于管理版本驱动模块;提取版本驱动模块;版本驱动模块,用于当被管理模块提取时,通过接口模块提供的统一接口对所属版本设备进行驱动;接口模块,用于为版本驱动模块提供统一的接口。
其中,所述管理模块包括添加子模块、创建子模块、存储子模块和提取子模块,其中,添加子模块,用于在存储子模块中添加需要创建的版本驱动模块的编号和创建位置信息;创建子模块,用于根据从存储子模块中获取的版本驱动模块的编号和创建位置信息,创建版本驱动模块,将创建后的版本驱动模块发送给存储子模块;存储子模块,用于存储版本驱动模块的编号、创建位置信息以及所创建的版本驱动模块本身;提取子模块,用于根据版本驱动模块的编号,从存储子模块中提取该版本驱动模块。
较佳地,所述管理模块进一步包括删除子模块,用于移除存储子模块中存储的版本驱动模块的编号、创建位置信息以及所创建的版本驱动模块本身。
本发明所提供的实现设备驱动的方法,包括设置可提供统一接口的接口模块;设置采用接口模块提供的统一接口对所属版本设备进行驱动的版本驱动模块;提取所设置的版本驱动模块,由提取的版本驱动模块通过所述统一接口对所属版本设备进行驱动。
其中,所述设置版本驱动模块包括对版本驱动模块进行添加和创建。
较佳地,该方法进一步包括对版本驱动模块进行删除。
其中,所述对版本驱动模块进行添加为添加需要创建的版本驱动模块的编号和创建位置信息;所述对版本驱动模块进行创建为根据所添加的版本驱动模块的编号和创建位置信息,创建版本驱动模块,将创建后的版本驱动模块进行存储。
较佳地,该方法进一步包括删除所存储的版本驱动模块的编号、创建位置信息以及所创建的版本驱动模块本身。
其中,所述提取版本驱动模块具体为根据版本驱动模块的编号,提取该版本驱动模块。
上述方法中,若存在已有接口,则所述设置采用接口模块提供的统一接口对所属版本设备进行驱动的版本驱动模块为设置采用接口模块提供的统一接口对所属版本设备进行驱动,以及通过接口模块提供的统一接口采用已有接口对所属版本设备进行驱动的设备驱动模块。
从上述方案可以看出,本发明通过设置统一的接口模块和采用该接口模块对所属版本设备进行驱动的版本驱动模块,使得所有版本驱动模块都使用相同的接口;通过对版本驱动模块进行管理,提取所需的版本驱动模块,由所提取的版本驱动模块通过接口模块提供的统一接口对所属版本设备进行驱动,使得实现设备驱动时,无需通过判断分支进行选择,不仅使结构精简,大大降低了代码的耦合性,而且实现简单,可维护性强。
此外,通过设置统一接口,并对版本驱动模块进行集中管理,从而最大限度的减少了对原有驱动代码的修改,减少了产生错误(如BUG)的几率和回归测试量。


图1为本发明实施例中实现设备驱动的系统结构示意图;图2为图1所示系统中管理模块的内部结构示意图;图3为本发明实施例中实现设备驱动的方法流程图。
具体实施例方式
本发明的基本思想是设置统一的接口模块和采用该接口模块对所属版本设备进行驱动的版本驱动模块;对版本驱动模块进行集中管理,提取所需的版本驱动模块,由所提取的版本驱动模块通过接口模块提供的统一接口对所属版本设备进行驱动。
具体实现时,可设置管理模块,并将版本驱动模块存储在管理模块中设置的存储子模块中,由管理模块对版本驱动模块进行集中管理,并根据需要提取所需的版本驱动模块。
为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本发明进一步详细说明。
参见图1,图1为本发明实施例中实现设备驱动的系统结构示意图。如图1所示,该系统包括管理模块、接口模块、至少一个版本驱动模块和对应数量的版本设备,如图中的版本驱动模块1,......,版本驱动模块n,以及版本设备1,......,版本设备n。
其中,管理模块用于管理版本驱动模块,根据需要提取所需的版本驱动模块。
版本驱动模块,用于当被管理模块提取时,通过接口模块提供的统一接口对所属版本设备进行驱动。
接口模块,用于为版本驱动模块提供统一的接口。
具体实现时,可将版本驱动模块存储在管理模块的存储模块中,如图2所示,图2为图1所示系统中管理模块的内部结构示意图。其中,管理模块包括添加子模块、删除子模块、创建子模块、存储子模块和提取子模块。
其中,添加子模块,用于在存储子模块中添加需要创建的版本驱动模块的编号和创建位置信息。
创建子模块,用于根据从存储子模块中获取的版本驱动模块的编号和创建位置信息,创建版本驱动模块,将创建后的版本驱动模块发送给存储子模块。
存储子模块,用于存储版本驱动模块的编号、创建位置信息以及所创建的版本驱动模块本身。
删除子模块,用于移除存储子模块中存储的版本驱动模块的编号、创建位置信息以及所创建的版本驱动模块本身。
提取子模块,用于根据版本驱动模块的编号,从存储子模块中提取该版本驱动模块。
上述系统中,根据需要,也可以去掉其中的删除子模块。
以上对本发明实施例中实现设备驱动的系统进行了详细描述,下面再对本发明实施例中实现设备驱动的方法进行详细描述。
参见图3,图3为本发明实施例中基于图1所示系统的实现设备驱动的方法流程图。如图3所示,该流程包括如下步骤步骤301,设置可提供统一接口的接口模块。
本步骤中,设置为版本驱动模块提供统一接口的接口模块。具体实现时,可利用C++的模板机制,定义一个提供统一接口的基类来实现接口模块的功能。并且基类中可包括实现统一功能的接口函数,该接口函数只提供接口,不实现具体功能。
例如假设统一的功能接口为读寄存器和写寄存器等,则可设置如下基类classCVMInerface{public:
ReadRegister()=0;WriterRegister()=0;};其中,CVMInerface为基类名称,ReadRegister()=0为读寄存器接口函数;WriterRegister()=0为写寄存器接口函数。上述接口函数只提供了接口,没有具体实现功能。
步骤302,定义采用接口模块提供的统一接口对所属版本设备进行驱动的版本驱动模块。
本步骤中,定义采用统一的接口模块提供的统一接口对所属版本设备进行驱动的版本驱动模块。具体实现时,若利用C++的模板机制,则可通过定义继承步骤301中的基类的子类,来实现采用统一接口模块的版本驱动模块的定义。并且由于基类只提供了接口函数的接口,没有具体实现功能,因此在版本驱动模块,即继承自基类的子类中应该添加具体实现过程,以实现不同版本驱动模块驱动不同版本设备的目的,此外还需要在每个版本驱动模块中添加一个统一的创建函数,以便使用该统一的创建函数接口创建不同的版本驱动模块本身。
例如基于步骤301中的基类CVMInerface,即接口模块,可设置如下的子类,即版本驱动模块class CVM321:public CVMInerface{public:
static CVMInerface*Creater();ReadRegister(){...
};WriterRegister(){...
};};其中,CVM321为子类名称,static CVMInerface*Creater()为创建函数。
步骤303,对版本驱动模块进行集中管理,根据需要提取所需的版本驱动模块,由提取的版本驱动模块通过接口模块提供的统一接口对所属版本设备进行驱动。
本步骤中,集中管理包括对版本驱动模块进行添加、创建等设置操作,进一步地,还可以包括对版本驱动模块进行删除等操作。其中,在步骤302中完成对版本驱动模块的定义之后,由本步骤中对版本驱动模块的添加和创建,完成对采用接口模块提供的统一接口对所属版本设备进行驱动的版本驱动模块的设置。
为了对版本驱动模块进行集中管理,以及根据需要提取所需版本驱动模块,可按照图1所示的系统设置一个管理模块,由管理模块实现对版本驱动模块进行集中管理,以及根据需要提取所需的版本驱动模块。具体实现时,可在管理模块中设置添加子模块、创建子模块、存储子模块和提取子模块。其中,需要注册新加的版本驱动模式时,由添加子模块在存储子模块中添加需要创建的版本驱动模块的编号和创建位置信息;需要创建新加的版本驱动模块时,由创建子模块根据所添加的版本驱动模块的编号和创建位置信息,创建版本驱动模块,将创建后的版本驱动模块存储在存储子模块中;需要提取版本驱动模块时,由提取子模块根据版本驱动模块的编号,从存储子模块中提取该版本驱动模块。
此外,包括删除操作时,还可以在管理模块中设置删除子模块,当需要删除已有的版本驱动模式时,由删除子模块移除存储子模块中存储的版本驱动模块的编号、创建位置信息以及所创建的版本驱动模块本身。
实际应用中,可利用C++的模板机制,定义一个工厂类来实现管理模块,并且通过在工厂类中设置添加函数来实现添加子模块,设置创建函数来实现创建子模块,设置提取函数来实现提取子模块,设置子类池来实现存储子模块,并进一步可设置删除函数来实现删除子模块。
例如,可设置如下的工厂类,即管理模块class CFactory{public:
BOOL Add(ClassID &Id,ClassCreator creator){
return ClassPool.insert(ClassMap::value_type(Id,creator)).second;}BOOL Remove(ClassID &Id){return ClassPool.erase(Id);}BaseClass*Create(const ClassID &Id){ClassMap::const_iterator i=ClassPool.find(Id){If(ClassPool.end()!=i){return(i->second)();}}}private:
typedef std::map<ClassID,ClassCreator>ClassMap;ClassMap ClassPool;};其中,CFactory为工厂类名,ClassMap为子类池名,Id为版本驱动模块(步骤302中的子类)的编号,creator为版本驱动模块(步骤302中的子类)的创建位置信息,即步骤302中子类的创建函数指针。
其中,BOOL Add(ClassID &Id,ClassCreator creator)为添加函数,BOOLRemove(ClassID & Id)为删除函数,Create(const ClassID &Id)为创建函数,同时也实现了提取函数的功能,即Create(const ClassID &Id)实现了创建模块和提取模块的功能。
在实现由版本驱动模块通过所设置的接口模块对所属版本设备进行驱动时,可通过调用创建函数来提取所需的版本驱动模块,由所提取的驱动模块实现对所属版本设备的驱动。
例如对于利用C++模板机制建立的工厂类、基类和子类来说,以实现读取版本设备的寄存器为例,则可通过如下的过程来实现P=CFactory::Create(Id);P->ReadRegister();以上对本发明实施例中实现设备驱动的方法进行了详细描述,其中,以利于C++模板机制为例,列举了其中的一种具体实现方法。此外,针对本发明实施例中的方法,还可以有其它的具体实现方法,并且具体实现时,也不限于图3所示流程中描述的各个模块,还可以是其它的功能模块,或者是其它的实现方法。本领域的技术人员可根据实际需要,采取相应的具体实现方法。
其中,若设备驱动中存在已有接口,则为了与已有接口进行兼容,图3所示方法流程的步骤302中,在设置采用接口模块提供的统一接口对所属版本设备进行驱动的版本驱动模块时,可设置为采用接口模块提供的统一接口对所属版本设备进行驱动,以及通过接口模块提供的统一接口采用已有接口对所属版本设备进行驱动的设备驱动模块。若仍以C++模板机制为例,则步骤302中的子类,可设置为class CVM321:public CVMInerface,public CVMContrl321{public:
static CVMInerface*Creater();ReadRegister();WriterRegister();};其中,CVMContrl321为已有接口的名称,即子类CVM321同时继承基类和已有接口,从而实现将已有接口匹配到统一的调用接口,即接口模块(基类),避免了现有技术中由于已有接口不同,而必须添加判断分支的情况。
例如,假设有两个已有接口,接口一(VM321)和接口二(VM323),且分别包括接口一读寄存器和接口二读寄存器。由于接口名称的不同,在按现有技术中的方法实现时,必须添加条件判断,即步骤1,判断接口类型,如果是接口1,调用步骤2,如果是接口2,调用步骤3;步骤2,调用接口一(VM321)读寄存器;步骤3,调用接口二(VM323)读寄存器。
而采用本发明实施例中的继承匹配后,则为步骤1,生成子类1,子类1继承自接口一(VM321)和基类;步骤2,生成子类2,子类2继承自接口二(VM323)和基类;步骤3,调用基类读寄存器方法,由C++的多态技术自动匹配到相应的接口进行调用。
可见,通过将子类同时继承基类和已有接口,从而实现了与已有接口的兼容,将已有接口统一到基类接口中,即将已有接口封装到接口模块中,从而可实现统一调用,精简了结构,提高了可维护性。
最后,利用C++模板机制设置工厂类时,还可以将工厂类设置为模板,即对工厂类进行泛化,使之不仅可以应用于上述示例中的情况,还可以应用于类似的应用中。如在步骤303中的工厂类示例中,在最前面添加如下语句template<
class BaseClass,typename ClassID,typename ClassCreator>
并且在步骤303中的工厂类示例中,将ClassMap::const_iteratori=ClassPool.find(Id)设置为typename ClassMap::const_iterator i=ClassPool.find(Id)。当将泛化后的工厂类应用于其它应用时,将提供给工厂类的模板参数改为新应用的名字即可,其中,新应用包括新的基类和继承自新基类的子类。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种实现设备驱动的系统,其特征在于,该系统包括接口模块、管理模块和至少一个版本驱动模块,其中,管理模块,用于管理版本驱动模块;提取版本驱动模块;版本驱动模块,用于当被管理模块提取时,通过接口模块提供的统一接口对所属版本设备进行驱动;接口模块,用于为版本驱动模块提供统一的接口。
2.如权利要求1所述的系统,其特征在于,所述管理模块包括添加子模块、创建子模块、存储子模块和提取子模块,其中,添加子模块,用于在存储子模块中添加需要创建的版本驱动模块的编号和创建位置信息;创建子模块,用于根据从存储子模块中获取的版本驱动模块的编号和创建位置信息,创建版本驱动模块,将创建后的版本驱动模块发送给存储子模块;存储子模块,用于存储版本驱动模块的编号、创建位置信息以及所创建的版本驱动模块本身;提取子模块,用于根据版本驱动模块的编号,从存储子模块中提取该版本驱动模块。
3.如权利要求2所述的系统,其特征在于,所述管理模块进一步包括删除子模块,用于移除存储子模块中存储的版本驱动模块的编号、创建位置信息以及所创建的版本驱动模块本身。
4.一种实现设备驱动的方法,其特征在于,该方法包括设置可提供统一接口的接口模块;设置采用接口模块提供的统一接口对所属版本设备进行驱动的版本驱动模块;提取所设置的版本驱动模块,由提取的版本驱动模块通过所述统一接口对所属版本设备进行驱动。
5.如权利要求4所述的方法,其特征在于,所述设置版本驱动模块包括对版本驱动模块进行添加和创建。
6.如权利要求4或5所述的方法,其特征在于,该方法进一步包括对版本驱动模块进行删除。
7.如权利要求5所述的方法,其特征在于,所述对版本驱动模块进行添加为添加需要创建的版本驱动模块的编号和创建位置信息;所述对版本驱动模块进行创建为根据所添加的版本驱动模块的编号和创建位置信息,创建版本驱动模块,将创建后的版本驱动模块进行存储。
8.如权利要求7所述的方法,其特征在于,该方法进一步包括删除所存储的版本驱动模块的编号、创建位置信息以及所创建的版本驱动模块本身。
9.如权利要求7所述的方法,其特征在于,所述提取版本驱动模块具体为根据版本驱动模块的编号,提取该版本驱动模块。
10.如权利要求4、5、7、8、9中任一项所述的方法,其特征在于,存在已有接口;则所述设置采用接口模块提供的统一接口对所属版本设备进行驱动的版本驱动模块为设置采用接口模块提供的统一接口对所属版本设备进行驱动,以及通过接口模块提供的统一接口采用已有接口对所属版本设备进行驱动的设备驱动模块。
全文摘要
本发明公开了一种实现设备驱动的系统,包括接口模块、管理模块和至少一个版本驱动模块,其中,管理模块,用于管理版本驱动模块;提取版本驱动模块;版本驱动模块,用于当被管理模块提取时,通过接口模块提供的统一接口对所属版本设备进行驱动;接口模块,用于为版本驱动模块提供统一的接口。此外,本发明还公开了一种实现设备驱动的方法。能够提高可维护性,并降低代码耦合性。
文档编号G06F9/44GK1963794SQ20061016724
公开日2007年5月16日 申请日期2006年12月12日 优先权日2006年12月12日
发明者唐巍 申请人:北京中星微电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1