- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
VxWorks中主备数据一致性功能组件的设计与实现
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用户的工作有所帮助。
上一篇:高清晰度数字电视传输系统设计与实现
下一篇:基于JTAG的ARM芯片系统调试