资源描述:
《vxworks基于zinc的gui任务与非gui任务通信》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、VxWorks环境下基于Zinc的GUI任务与非GUI任务之间的通信1 引言 VxWorks是美国WindRiverSystems公司开发的一种嵌入式实时操作系统,它以高性能可剪裁的微内核以及友好的用户开发环境在嵌入式实时操作系统领域占有重要的地位。在很多实时应用场合(如嵌入式地理信息系统),需要在VxWorks环境下设计图形用户界面(GUI)。VxWorks提供了两种开发图形用户界面的组件:WindML(Wind多媒体库)和Zinc。WindML为图形、图象和声音应用程序的开发提供了基本技术,并且提供了为定制设备开发标准化驱动程序
2、的框架。Zinc是以WindML为基础的,Zinc是为应用创建图形用户界面提供框架的可扩展的面向对象的类库。Zinc为实现复杂的图形用户界面提供了更多的支持。 为了提高性能和简化源代码,大多数情况下在一个实时环境中的应用程序是以多任务的方式实现的,Zinc自身通常也是多任务的。一般不在外部任务里直接处理GUI,而是在一个专用的GUI任务里执行所有的GUI处理。在多任务环境下,非GUI任务将需要在不同的时期和GUI任务通信,GUI也可能需要与外部任务通信。GUI任务与非GUI任务之间的通信方式将对整个实时系统的实时性、可靠性和稳定性产
3、生重大的影响。因此,深入研究VxWorks环境下Zinc所支持的GUI任务与非GUI任务之间的通信方式并确定在特定应用场合选择通信方式的原则是非常重要的。2 GUI(Zinc)任务和外部任务之间的通信方法 GUI任务和非GUI任务之间的通信大致可以分为两种:同步通信和异步通信。Zinc主要提供了如下几种通信机制供程序员选择使用:·Zinc入口点·共享内存·OS消息队列·派生设备a)Zinc入口点 可以利用Zinc入口点实现GUI任务与非GUI任务之间的通信,主要有如下两种方法:·与Zinc通信的基本入口点是ZafEventManag
4、er::Put()程序。利用该函数可以在Zinc事件队列中放置一个事件。这是一个异步方法,因此只能适用于可接受异步通信的场合。·ZafApplication::BeginSynchronize()和ZafApplication::EndSynchronize()。这两个函数自身并不是通信程序,但能确保直接通信方式访问Zinc是安全的。直接通信通常由一个对象的Event()函数来实现,也可能采用其它的方式,比如数据对象更新。间接通信可以使用ZafEventManager::Unblock()函数来实现。使用一个派生设备或其它方法进行通信的
5、时候,使用该函数可以使正在等待事件的Zinc任务解除阻塞。b)共享内存 在VxWorks中很容易实现共享内存。为了安全地共享内存,最好让一个信号量和共享内存关联。这样可以避免任务之间出现资源冲突。 使用共享内存的时候,通常不需要使用Zinc提供的保证线程安全的入口点。但是当一个窗口对象的某个成员指向共享内存的时候是一个例外情况。例如,如果一个ZafButton的bitmapData成员正指向共享内存,除非已经确保Zinc任务目前没有使用该共享内存,才能安全地更新该共享内存。可以使用ZafApplication::BeginSyn
6、chronize()和ZafApplication::EndSynchronize()函数来保证在某一时刻该任务是唯一使用该共享内存的任务。c)OS消息队列 在VxWorks环境下使用Zinc的时候,有两种不同类型的消息队列可供选用:事件管理器消息队列和VxWorks操作系统提供的消息队列。 可以通过ZafEventManager::Put()和ZafEventManager::Get()函数访问事件管理器消息队列。事件管理器队列只提供从非GUI任务到Zinc任务的通信,利用事件管理器队列进行从GUI任务到非GUI任务的通信是不
7、实用的。 VxWorks消息队列可以实现从GUI任务到非GUI任务的通信,也可以实现从非GUI任务到GUI任务的通信,但是不允许同时在两个方向上进行通信。d)派生设备 选用共享内存或消息队列作为通信方法时,Zinc需要与该通信方法进行交互,这可以通过派生设备实现。使用派生设备的目的是为了检查是否有来自另一个任务的通信。每当ZafEventManager::Get()函数被调用,事件管理器轮询该设备,看看是否有新消息。这个派生设备仅仅需要检查共享内存或消息队列。如果有新信息可用,派生设备可以直接调用对象的Event()函数在队列上
8、面放置一个新事件,也可以自己处理这个消息。 派生设备还可用于实现从GUI任务到非GUI任务的通信。ZafEventManager::UnBlock()函数对这种通信方法是非常有用的。在正常的情况下,如果