




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VxWorks 环境下基于环境下基于 Zinc 的的 GUI 任务与非任务与非 GUI 任务任务 之间的通信之间的通信 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 任务之间的通信方式并确定在特定应用 场合选择通信方式的原则是非常重要的 2 GUI 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 任务的通信 但是不允许同时在两个方向上进行通信 d 派生设备 选用共享内存或消息队列作为通信方法时 Zinc 需要与该通信方法进行交互 这可以通过 派生设备实现 使用派生设备的目的是为了检查是否有来自另一个任务的通信 每当 ZafEventManager Get 函数被调用 事件管理器轮询该设备 看看是否有新消息 这个派 生设备仅仅需要检查共享内存或消息队列 如果有新信息可用 派生设备可以直接调用对象 的 Event 函数在队列上面放置一个新事件 也可以自己处理这个消息 派生设备还可用于实现从 GUI 任务到非 GUI 任务的通信 ZafEventManager UnBlock 函数对这种通信方法是非常有用的 在正常的情况下 如果没有需要处理的事件 Zinc 会阻 塞自己 如果采用一个派生设备监听一个 VxWorks 消息队列 向该队列发送一个消息后解 除事件管理器的阻塞可以更及时地轮询该派生设备 派生设备自身不会阻塞 也不会导致 Zinc 暂停 3 选择通信方式的原则选择通信方式的原则 上述关于 GUI 任务的通信方法各有其优缺点 在选择通信方法的时候 应该以具体的应 用场合为依据 一般应遵循如下的原则 a 应该尽可能选用简单的通信方式 在大多数情况下 Zinc 入口点足够用 Zinc 入口点是最简单的关于 GUI 任务的通信方式 因 为它们不需要 Zinc 任务内部的任何专门代码 可用的最简单入口点是 ZafEventManager Put 函数 然而 它有下列缺点 第一 它只允许从非 GUI 任务到 GUI 任 务的通信 第二 它是异步的 第三 因为要防止 ZafEventManager Get 和 ZafEventManager Put 函数同时访问 Zinc 事件队列以对其进行保护 ZafEventManager Put 可能会阻塞 如果异步通信是可接受的 但是不能接受阻塞 可以采用下列两种方法 第一 使用 ZafEventManager Put 函数 并且另外有一个可被阻塞的任务向 Zinc 队列中放置事件 这个任务可以监听一个 OS 消息队列 而原先产生消息的任务正是使用 OS 消息队列来发送 消息 第二 创建一个设备以监听 OS 消息队列 产生消息的任务发送一个消息给 OS 消息队 列 然后由派生设备接收并解释 派生设备可以放置一个事件在 Zinc 队列中 或者自己处理 这个事件 只是这两种方法都给应用程序增加了一点复杂性 b 如果需要进行同步通信 必须使用函数对 ZafApplication BeginSynchronize 和 ZafApplication EndSynchronize 调用 ZafApplication BeginSynchronize 之后 可以保证对 Zinc 对象的任何访问是安全 的 该方法很简单 且不需要在 GUI 任务中添加专门的代码 使用 ZafApplication BeginSynchronize 的缺点是该函数会阻塞 使用该方法时必须采取预防措 施 c 采用共享内存进行通信时必须创建保护和同步机制 共享内存是从 GUI 任务到非 GUI 任务的两种通信方法之一 其优点是对数据的访问简单 而直接 共享内存没有对数据访问进行保护的内在支持 所以必须创建一个对访问进行保护 及同步的机制 并且访问共享内存的所有任务都应该使用该机制 采取这种方案的缺点是容 易发生阻塞 d 在不能接受阻塞的应用场合 最好使用 OS 消息队列 OS 消息队列是从 GUI 任务到非 GUI 任务和从非 GUI 任务到 GUI 任务进行通信的另一种 方法 使用 OS 消息队列进行通信的时候 需要在 GUI 任务和非 GUI 任务中编写访问消息队 列的代码 在正确进行设置的情况下 消息队列不会引起阻塞的问题 创建消息队列时 必 须保证消息队列有足够的消息容量或者建立处理消息队列溢出的机制 4 Zinc 的事件模型的事件模型 Zinc 中的 GUI 任务与非 GUI 任务的多种通信方式都与 Zinc 的事件模型有关 因此在设计 和实现 GUI 任务与非 GUI 任务之间的通信时 需要对 Zinc 的事件模型有深入的理解 Zinc 具有一个事件驱动的体系结构 输入设备与应用程序之间的交互是通过事件完成的 由于 VxWorks 本身不是事件驱动的实时操作系统 在 VxWorks 运行平台中 Zinc 主要从输入设备 和应用任务获取事件 然后 Zinc 以标准的方式将这些事件打包 并且将它们路由给适当的对象以进行进一步的 处理 在 EGIS 中 GSM 通讯任务使用了自定义的事件与 GUI 任务进行异步通信 基于 Zinc 的 EGIS 事件模型如图 1 所示 图 1 基于 Zinc 的 EGIS 事件路由示意图 从图 1 中 在 VxWorks 中 Zinc 事件的主要来源是输入设备和应用程序 比如 GSM 通信程 序 由于 VxWorks 不支持事件驱动的系统 事件管理器周期性地查询或接收来自输入设备 的数据并以 Zinc 定义的事件结构包装成事件 一旦事件管理器获得事件 Zinc 主控进程重 新获得对应用程序的控制 该进程从时间管理器中得到事件并传送给窗口管理器 窗口管理 器决定事件的最终目的地和合适的路由并将其发送 最终窗口对象的 Event 方法收到每个 事件并对其进行处理 在 EGIS 中 通过重载 Event 函数实现对自定义事件的处理 5 EGIS 系统中系统中 GUI 任务与非任务与非 GUI 任务之间通信的实现任务之间通信的实现 嵌入式地理信息系统包括了两个部分 跑车分系统和中心显示分系统 跑车上包括一台 PC 机 一台 GPS 接收机和一台短信收发设备 中心包括一台 VxWorks 目标机 一台 PC 机 用于开发和调试 和一台短信收发设备 其中 VxWorks 目标机上运行的是 EGIS 各功能 模块 为了提高系统性能和简化代码 将目标机上的 EGIS 软件划分为两个任务 GUI 任务和 GSM 通信任务 GUI 任务的主要功能是 负责界面和菜单的实现 并且需要根据 GSM 实时接 收到的经纬度数据在地图上画出跑车的运行轨迹 GSM 通讯任务的主要功能是 实时接收 以短消息方式传输的 GPS 经纬度数据 存放在环形缓冲区中 并通知 GUI 任务 EGIS 系统需要满足两方面的实时性 第一 GSM 通信任务接收经纬度数据的实时性 第二 GUI 任务响应菜单操作的实时性和特定情况下画出跑车轨迹的实时性 为此 在该系统中采 取两种通信方式 Zinc 入口点和共享内存 GUI 任务与非 GUI 任务之间通信的实现主要包 括如下几个方面 a 用户事件的定义 Zinc 中的事件共分为七类 其中包括用户事件 用户事件的取值范围为 10 000 到 32 767 在 EGIS 中定义的用户事件为 const ZafEventType TRACKING 10028 其中 ZafEventType 是 Zinc 事件类型 b 用户事件的发送 用户事件的发送通过下面的调用完成 zafApplication EventManager Put TRACKING 其中 zafApplication 是 Zinc 全局变量 也是 GUI 任务的任务变量 某些程序可能同时被 多个任务调用 这些程序可能要求全局变量或静态变量对于每个调用该程序的任务具有一个 不同的值 为了适应这种情况 VxWorks 提供了一种所谓任务变量的机制 一个 4 字节的 变量可以以任务变量的方式被添加到一个任务的上下文中 这样每当任务切换的时候同时切 换该变量的值 由于在 GUI 任务和 GSM 通信任务中的 zafApplication 具有不同的值 因此 可以在创建 GSM 通信任务的时候通过参数传递使 GSM 通信任务获得 GUI 任务的任务变量 zafApplication if GSMTaskID taskSpawn SERIAL PORT 90 VX FP TASK ZAF VXW STACK SIZE FUNCPTR Trace int zafApplication 0 0 0 0 0 0 0 0 0 ERROR taskVarAdd GSMTaskID int 将 zafApplication 添加为任务变量 通过参数传递 GUI 任务的任务变量 zafApplication 在 GSM 通信任务中 int Trace CGIS Window pWindow ZafApplication application taskVarAdd 0 int 将 zafApplication 添加为任务变量 zafApplication application GSM 通信任务变量 zafApplication 赋值 zafApplication EventMa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农发行阿拉善盟阿拉善左旗2025秋招结构化面试经典题及参考答案
- 乙丙橡胶装置操作工技能比武考核试卷及答案
- 2025年酒驾醉驾行为应知应会考题及答案
- 2025年尘肺医师鉴定考试(职业性尘肺病及其他呼吸系统疾病)题库及答案(安徽六安)
- 纺织纤维梳理工技术考核试卷及答案
- 供应链管理师适应性考核试卷及答案
- 压缩机操作工数字化技能考核试卷及答案
- 中职德语考试试题及答案
- 中药酒(酊)剂工数字化技能考核试卷及答案
- 供电公司高考试卷及答案
- 稳评从业人员培训考试及答案解析
- 2025年度反洗钱阶段考试培训试考试题库(含答案)
- 2025年甘肃省兰州市榆中县招聘乡村医生考试参考试题及答案解析
- 收割芦苇施工方案
- 燃气入户安检课件
- 普通黄金现货购买合同8篇
- 预防静电安全知识培训课件
- 三力测试考试题库及答案视频讲解
- 2025年河南省人民法院聘用书记员考试试题及答案
- 2025年中学教师资格考试《综合素质》核心考点与解析
- 2025党校中青班入学考试试题及答案
评论
0/150
提交评论