Chinaunix首页 | 论坛 | 博客
  • 博客访问: 306944
  • 博文数量: 57
  • 博客积分: 1435
  • 博客等级: 上尉
  • 技术积分: 644
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-21 22:51
文章分类

全部博文(57)

文章存档

2013年(7)

2012年(1)

2011年(7)

2009年(7)

2008年(7)

2007年(28)

我的朋友

分类:

2007-06-18 00:51:53

VxWorks中主备数据一致性功能组件的设计与实现

摘  要:数据一致性是主备用系统必须解决的问题。目前主备系统的一致性都采用手工编程来实现,导致代码结构繁杂,且效率不高。利用VxWorks的异常处理机制,结合RISC CPU的特性,设计实现了一个数据一致性功能组件。这个组件可使数据的一致性处理自动化。
关键字:数据一致性;异常处理;精简指令集计算机
 

1 引言

    在电信、电力、国防等应用领域中,其所用设备必须确保有极高的可靠性。为了达到此目的,很多设备都采用主备用结构,当主用设备发生故障时,备用设备可马上接替主用工作,这就要求主用与备用数据要保持高度的一致性。vxWorks是在电信、电力、国防等应用领域中广泛使用的实时操作系统,它提供全开放的寻址空间,多任务内核(wind),基于优先级进行任务调度,具有快的上下文切换和低的中断等待特点。但考察目前运行的基于vxWorks的系统,在实现主备用数据一致性方面,还没有一个优雅高效的方法。作者在开发国家863计划项目—“中国第三代移动通信系统”CDMA2000系统集成项目过程中,研究开发了一个主备数据一致性功能组件(下简称一致性组件),可实现主备设备间内存数据的自动同步。一致性组件结合MOTOROLA  PowerPC 系列RISC CPU的特点,并利用vxWorks操作系统的异常处理机制,使得主备数据的一致性操作自动化。

2 目前主备用系统的一致性解决方案及其不足

    在目前的主备用系统中,为了保证主备之间数据一致性,代码多呈如下样式。
    主用:
         L1:修改数据
         L2:将更新数据发送到备用
        …
        L1:修改数据 
        L2:将更新数据发送到备用
    备用:
            获取主用数据并进行数据同步
    在上面的流程中,主用的L1语句是具体的业务逻辑处理代码,有可能触发数据更新操作(如赋值语句)。频繁的在业务逻辑处理中加入L2语句(为实现一致性功能),导致整个代码显得凌乱,可读性不高;又因为主备系统常用于实时环境中,还经常需要获取更新数据的数值及其在物理内存中的位置(用于日志登记或标记更新页面),而这些烦琐的底层操作极易产生错误。所以,非常需要一种简便高效的方法,可以将L2语句从L1语句间剥离出来,使程序员专注于业务逻辑的处理,同时也使程序代码清晰化。一致性组件解决了以上问题。


 
图一:主用端程序模块组成

3 一致性组件的整体结构设计

    为了实现数据一致性操作的自动化,一致性组件由以下几个功能模块组成:
    1) 初始化模块。用来启动组件功能,只在主用设备上运行。
    2) 写操作监视功能模块。主要用来发现数据的更新操作,只在主用设备上运行。
    3) 更新数据截取模块。主要用来提取更新数据,只在主用设备上运行。
    4) 数据同步任务模块。用来进行主备用数据间的一致性同步,主备设备都要运行。
    当加载一致性组件后,完整的主用端程序构成如图一所示。
    在图一中,主程序模块中的I1,I2,In是L1语句在内存中的汇编语言表示形式。数据段中的D1,D2,Dn是可能要被修改的数据。
     以下是一致性组件各功能模块的任务划分
3.1 初始化模块
    在计算机内存中,数据和代码是分别存储的。为了实现写操作的自动发现功能,在初始化模块中,将要需维护数据一致的内存数据区设置为不可写状态。这样每当CPU对该数据区进行写操作时,将触发DSI (Data Storage Interrupt) 异常,CPU自动转到DSI异常处理程序进行异常处理。
3.2 写操作监视功能模块
    本模块功能由DSI异常处理程序来完成。每当CPU产生一异常时,vxWorks都自动将当前程序的上下文信息保存起来,以便异常处理程序处理完异常情况后,返回原程序引发异常的指令处,继续向下执行。vxWorks中提供默认的异常处理程序,多是显示一些异常信息,并终止原程序的执行。但用户也可以编写自己的异常处理程序,并用其替代系统默认的异常处理程序。新的DSI异常处理程序通过以下一些操作,实现了对被更新数据的定位。
    1) 获取引发异常的当前代码段指令地址(记为I1)。
    2) 对于将要被改写的数据,获取其地址(记为D1)。
    3) 设置此内存数据段为可写状态。
    4) 在图一中I2(I2=I1+4,因为在POWERPC RISC CPU中,每条指令长度都为4Byte长 )指令处设置指令地址断点(Instruction Address Breakpoint)。
3.3 更新数据截取模块
    DSI异常处理程序执行完成后,将返回原程序并继续向下执行。因当前数据区可写,D1处的内存数据被更新,并接着执行图一中所示的下一条指令I2。因I2处设置了指令地址断点,所以触发IAB(Instruction Address Breakpoint) 异常, CPU转而执行IAB异常处理程序。IAB异常处理程序主要用来提取更新数据,完成的功能如下。
    1) 根据数据地址D1,读取4Byte (数据总线宽度为32位)的更新数据。
    2) 将更新数据写入发送缓冲区。
    3) 再次将数据区设置回不可写状态。
    4) 删除I2指令处的指令地址断点。
3.4 数据同步任务模块
    数据同步任务模块用来实现主备用数据之间的一致性,由不同于主程序任务的另一单独的任务来完成。因为在更新数据截取模块中已将更新数据保存在发送缓冲区中,数据同步任务模块的实现比较简单。在主用端,数据同步任务将发送缓冲区的更新数据发送到备用端的接收缓冲区;在备用端,数据同步任务从接收缓冲区提取更新数据并进行数据一致性更新。
    写操作监视功能模块和更新数据截取模块均在内核态运行,采用汇编语言实现,并通过代码优化,运行效率很高,有效弥补了用户态和内核态间切换的开销。

4 总结

    一致性组件自动实现主备用数据之间的一致性操作,可广泛应用于各种主备用设备中。使用一致性组件,只需在程序开始对组件进行初始化,并启动数据同步任务即可。它使程序员不必考虑数据一致性问题,而把精力集中于具体的业务逻辑处理,从而提高了效率,并使代码更简洁。该组件已经用于国家863计划项目—“中国第三代移动通信系统”CDMA2000系统集成中,产生了很好的效果;本项目已通过验收并正在进行产业化。本组件设计中综合利用了RISC CPU的结构特点和vxWorks的异常处理技术,希望通过本文,对广大vxWorks用户的工作有所帮助。

参考文献:
[1] Wind River.VxWorks Programmer"s Guide.Wind River Systems Inc,1998
[2] Motorola.MPC860 PowerQUICC User’s Manual. Motorola, 1998
[3] Motorola. PowerPC™ 604e RISC Microprocessor User"s Manual. Motorola, 1998
[4] Motorola. PowerPC™ Microprocessor Family: The Programming Environments For 32-Bit Microprocessors. Motorola, 1997

阅读(1426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~