×
嵌入式开发 > 详情

VxWorks环境下基于Zinc的通信

发布时间:2020-07-07 发布时间:
|

1引言

VxWorks是美国Wind River Systems公司开发的一种嵌入式实时操作系统,它以高性能可剪裁的微内核以及友好的用户开发环境在嵌入式实时操作系统领域占有重要的地位。

在很多实时应用场合(如嵌入式地理信息系统) ,需要在VxWorks环境下设计图形用户界面(GUI) 。VxWorks提供了两种开发图形用户界面的组件:WindML (Wind多媒体库)和Zinc。WindML为图形、图象和声音应用程序的开发提供了基本技术,并且提供了为定制设备开发标准化驱动程序的框架。 Zinc是以WindML为基础的, Zinc是为应用创建图形用户界面提供框架的可扩展的面向对象的类库。Zinc为实现复杂的图形用户界面提供了更多的支持。

为了提高性能和简化源代码,大多数情况下在一个实时环境中的应用程序是以多任务的方式实现的, Zinc自身通常也是多任务的。一般不在外部任务里直接处理GUI ,而是在一个专用的GUI任务里执行所有的GUI处理。在多任务环境下,非GUI任务将需要在不同的时期和GUI任务通信, GUI也可能需要与外部任务通信。GUI任务与非GUI任务之间的通信方式将对整个实时系统的实时性、可靠性和稳定性产生重大的影响。因此, 深入研究VxWorks环境下Zinc所支持的GUI任务与非GUI任务之间的通信方式并确定在特定应用场合选择通信方式的原则是非常重要的。

2GUI( Zinc)任务和外部任务之间的通信方法

GUI任务和非GUI任务之间的通信大致可以分为两种:同步通信和异步通信。Zinc主要提供了如下几种通信机制供程序员选择使用:

Zinc入口点
共享内存
OS消息队列
派生设备
a)Zinc入口点

可以利用Zinc入口点实现GUI任务与非GUI任务之间的通信,主要有如下两种方法:

与Zinc通信的基本入口点是ZafEventManager::Put()程序。利用该函数可以在Zinc事件队列中放置一个事件。这是一个异步方法,因此只能适用于可接受异步通信的场合。

ZafApplication::BeginSynchronize() 和ZafApplication::EndSynchronize() 。这两个函数自身并不是通信程序,但能确保直接通信方式访问Zinc是安全的。直接通信通常由一个对象的Event()函数来实现,也可能采用其它的方式,比如数据对象更新。间接通信可以使用ZafEventManager::Unblock()函数来实现。使用一个派生设备或其它方法进行通信的时候, 使用该函数可以使正在等待事件的Zinc任务解除阻塞。

b)共享内存

在VxWorks中很容易实现共享内存。为了安全地共享内存,最好让一个信号量和共享内存关联。这样可以避免任务之间出现资源冲突。

使用共享内存的时候,通常不需要使用Zinc 提供的保证线程安全的入口点。但是当一个窗口对象的某个成员指向共享内存的时候是一个例外情况。例如,如果一个ZafButton的bitmapData 成员正指向共享内存,除非已经确保Zinc任务目前没有使用该共享内存,才能安全地更新该共享内存。可以使用ZafApplication:: BeginSynchronize() 和ZafApplication::EndSynchronize() 函数来保证在某一时刻该任务是唯一使用该共享内存的任务。

c)OS消息队列

在VxWorks环境下使用Zinc的时候,有两种不同类型的消息队列可供选用:事件管理器消息队列和VxWorks操作系统提供的消息队列。

可以通过ZafEventManager::Put()和ZafEventManager::Get()函数访问事件管理器消息队列。事件管理器队列只提供从非GUI任务到Zinc任务的通信,利用事件管理器队列进行从GUI任务到非GUI任务的通信是不实用的。

VxWorks消息队列可以实现从GUI任务到非GUI任务的通信,也可以实现从非GUI任务到GUI任务的通信,但是不允许同时在两个方向上进行通信。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
发明专利在疫情影响下的逆势增长