发明内容
有鉴于此,本发明提供一种VxWorks多任务同步与通信方法,以解决现有技术中,当相互之间需要同步与通信的任务比较多时,由于共享数据互斥访问的算法很复杂或消息队列的数量很大,所造成的多任务协作难度大的问题,技术方案如下:
一种VxWorks多任务同步与通信方法,包括:
创建MTLInitialize对象对多任务运行环境进行初始化;
创建MTLThread对象将对多任务的操作进行封装;
创建MTLMutex对象和MTLRecursiveMutex对象对信号量进行封装,创建MTLMonitor对象对消息队列进行封装,创建MTLSynchronized对象对信号量和消息队列进行统一管理,为用户提供统一的接口和用法;
利用所述统一的接口和用法实现多任务的同步与通信。
优选的,上述方法中,所述对多任务的操作包括:
任务创建、任务运行、任务暂停和任务销毁。
优选的,上述方法中,所述创建MTLMutex对象对信号量进行封装包括:
在MTLMutex的构造函数中创建信号量,在MTLMutex的析构函数中删除信号量,在MTLMutex的lock函数中获取信号量,在MTLMutex的unlock函数中释放信号量。
优选的,上述方法中,所述创建MTLRecursiveMutex对象对信号量进行封装包括:
在MTLRecursiveMutex的构造函数中创建信号量,在MTLRecursiveMutex的析构函数中删除信号量,在MTLRecursiveMutex的lock函数中获取信号量,在MTLRecursiveMutex的unlock函数中释放信号量。
优选的,上述方法中,所述创建MTLMonitor对象对消息队列进行封装包括:
在MTLMonitor的构造函数中创建消息队列,在MTLMonitor的析构函数中删除消息队列,在MTLMonitor的wait函数中从消息队列获取消息,在MTLMonitor的notify函数中向消息队列发送消息。
优选的,上述方法中,所述创建MTLSynchronized对象对信号量和消息队列进行统一管理,为用户提供统一的接口和用法包括:
在MTLSynchronized的构造函数中获取信号量和/或从消息队列中获取消息,在MTLSynchronized的析构函数中释放信号量和/或向消息队列中发消息,在MTLSynchronized的成员函数中实现对信号量或消息队列的其它操作。
优选的,上述方法中,所述利用所述统一的接口和用法实现多任务的同步与通信包括:
通过调用MTLMutex和MTLRecursiveMutex类的lock和unlock函数进行多任务之间的同步;
通过调用MTLMonitor类的wait和notify函数实现多任务之间的通信;
通过定义MTLSynchronized类对象实现多任务的同步与通信。
优选的,上述方法中,所述通过定义MTLSynchronized类对象实现多任务的同步与通信包括:
MTLSynchronized的构造函数调用其成员变量MTLMonitor类对象的wait函数以及MTLMutex和MTLRecursiveMutex类对象的lock函数,获取信号量或从消息队列中获取消息;
MTLSynchronized的析构函数中调用其成员变量MTLMonitor类对象的notify函数以及MTLMutex和MTLRecursiveMutex类对象的unlock函数,释放信号量和向消息队列发送消息;
MTLSynchronized的成员函数实现对信号量和消息队列的其它操作。
通过以上技术方案可知,本发明通过将VxWorks的信号量和消息队列封装成多任务库,即创建MTLMutex对象和MTLRecursiveMutex对象对信号量进行封装,创建MTLMonitor对象对消息队列进行封装,创建MTLSynchronized对象对信号量和消息队列进行统一管理,为用户提供统一的接口和用法;从而使用户仅通过创建和使用C++对象的方法即可对多任务进行同步和通信控制,大大降低了多任务协作的难度。
具体实施方式
本发明实施例针对现有技术存在的多任务协作的难度大的问题,提出了一种多任务同步与通信方法,该方法包括:创建MTLInitialize对象对多任务运行环境进行初始化;创建MTLThread对象将对多任务的操作进行封装;创建MTLMutex对象和MTLRecursiveMutex对象对信号量进行封装,创建MTLMonitor对象对消息队列进行封装,创建MTLSynchronized对象对信号量和消息队列进行统一管理,为用户提供统一的接口和用法;利用所述统一的接口和用法实现多任务的同步与通信。
本发明实施例提供的多任务同步与通信方法,利用C++类封装的方法对VxWorks的消息队列和信号量进行封装,将消息队列和信号量与一定的数据结构相结合,使用户通过定义C++类对象的方法来创建、使用和销毁消息队列与信号量,通过调用对象的方法来与其它任务通信,从而轻松地实现多任务之间的同步和通信,大大降低了多任务协作的难度。
为了使本领域技术人员更好的理解和实施本发明,下面将结合说明书附图对本发明实施例的技术方案进行进一步详细阐述。
参见图1所示,本发明实施例提供的VxWorks多任务同步与通信方法可以包括以下步骤:
S101,创建MTLInitialize对象对多任务运行环境进行初始化。
使用多任务库之前,必须创建MTLInitialize对象,对VxWorks操作系统的多任务运行环境进行初始化。MTLInitialize类的构造函数会进行任务私有变量的分配、创建任务管理类等初始化操作,通过创建MTLInitialize对象即可进行多任务运行环境的创建。
S102,创建MTLThread对象将对多任务的操作进行封装。
通过创建MTLThread对象可以实现对多任务的操作进行封装,对多任务的操作包括任务创建、任务运行、任务暂停和任务销毁。其中,MTLThread类的构造函数会进行VxWorks操作系统新任务的创建;通过从MTLThread类派生子类、再重载MTLThread类的start等方法即可运行和控制新任务。
S103,创建MTLMutex对象和MTLRecursiveMutex对象对信号量进行封装,创建MTLMonitor对象对消息队列进行封装,创建MTLSynchronized对象对信号量和消息队列进行统一管理,为用户提供统一的接口和用法。
MTLMutex和MTLRecursiveMutex类对VxWorks的信号量进行了封装,MTLMonitor类对VxWorks的消息队列进行了封装,这三个类都是MTLSynchronized类的成员变量,MTLSynchronized类负责对信号量和消息队列进行统一管理,为用户提供统一的接口和用法。
需要说明的是,所述创建MTLMutex对象对信号量进行封装包括:
在MTLMutex的构造函数中创建信号量,在MTLMutex的析构函数中删除信号量,在MTLMutex的lock函数中获取信号量,在MTLMutex的unlock函数中释放信号量。
所述创建MTLRecursiveMutex对象对信号量进行封装包括:
在MTLRecursiveMutex的构造函数中创建信号量,在MTLRecursiveMutex的析构函数中删除信号量,在MTLRecursiveMutex的lock函数中获取信号量,在MTLRecursiveMutex的unlock函数中释放信号量。
所述创建MTLMonitor对象对消息队列进行封装包括:
在MTLMonitor的构造函数中创建消息队列,在MTLMonitor的析构函数中删除消息队列,在MTLMonitor的wait函数中从消息队列获取消息,在MTLMonitor的notify函数中向消息队列发送消息。
所述创建MTLSynchronized对象对信号量和消息队列进行统一管理,为用户提供统一的接口和用法包括:
在MTLSynchronized的构造函数中获取信号量和/或从消息队列中获取消息,在MTLSynchronized的析构函数中释放信号量和/或向消息队列中发消息,
在MTLSynchronized的成员函数中实现对信号量或消息队列的其它操作。
由于信号量可实现多任务之间的同步和对资源的互斥访问,消息队列可提供多任务之间更高级别的通信与数据传送,因此这种统一封装的方式可实现绝大多数情况下的多任务之间的同步与通信处理,且符合面向对象的封装思想。
S104,利用所述统一的接口和用法实现多任务的同步与通信。
在多任务库构造完成之后,用户就可以利用统一的接口和用法来实现多任务的同步与通信。
由于MTLMutex和MTLRecursiveMutex类对信号量进行了封装,用户通过调用其lock和unlock等成员函数即可在多任务之间进行同步;MTLMonitor类对消息队列进行了封装,用户通过调用其wait和notify等成员函数即可在多任务之间进行通信;此外,还通过定义MTLSynchronized类对象实现多任务的同步与通信。
其中,通过定义MTLSynchronized类对象实现多任务的同步与通信可以包括:
MTLSynchronized类的构造函数调用其成员变量MTLMonitor类对象的wait函数以及MTLMutex和MTLRecursiveMutex类对象的lock函数,获取信号量或从消息队列中获取消息;MTLSynchronized类的析构函数中调用其成员变量MTLMonitor类对象的notify函数以及MTLMutex和MTLRecursiveMutex类对象的unlock函数,释放信号量和向消息队列发送消息;MTLSynchronized的成员函数实现对信号量和消息队列的其它操作。
从以上实施例可以看出,本发明通过将VxWorks的信号量和消息队列封装成多任务库,即创建MTLMutex对象和MTLRecursiveMutex对象对信号量进行封装,创建MTLMonitor对象对消息队列进行封装,创建MTLSynchronized对象对信号量和消息队列进行统一管理,为用户提供统一的接口和用法;从而使用户仅通过创建和使用C++对象的方法即可对多任务进行同步和通信控制,大大降低了多任务协作的难度。
此外,本发明通过采用VxWorks多任务库,在保证功能实现的前提下,使得多任务的同步和通信控制变得非常简单,大大提高了VxWorks程序的健壮性,有利于缩短项目周期,提高软件质量。
通过以上的方法实施例的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:只读存储器(ROM)、随机存取存储器(RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。