|
随着实时软件在可靠性和安全性要求极高的环境和系统中的广泛使用,对软件可靠性的依赖正在以前所未有的速度增长,实时软件的可靠性设计与保证在实时系统中占据着越来越重要的位置。可靠性是实时软件的一个重要指标。通常,将强实时系统定义为具有严格时限且紧急重要的系统,并当作关键任务来处理。可采用静态分析、保留资源及冗余配置的方法,使关键任务的时限能得到满足。但是,实时软件在故障表现、失效机理、唯一性及复杂性等方面与常规软件有着本质的差别,且与实时系统平台相关。实时软件的可靠性设计有别于传统软件。在实时软件的设计过程中,常采用相应的技术和工具,进行避错设计。避错是提高实时软件可靠性的基本方法,但只能达到一定的限度。要想进一步提高可靠性,一般要在避错设计的基础上进行容错设计。
一、避错设计
避错设计是传统的可靠性设计技术,在长期的可靠性实践中产生了大量的理论并积累了丰富的经验,是实现实时软件高可靠性目标的有力保证。它在充分应用软件工程技术、方法、工具和加强软件工程管理的基础上,针对实时软件的具体特点,采用形式化设计、抗干扰设计、软硬件相结合等技术和方法。此外,彻底的软件测试是保证实时软件可靠性的重要手段。
1.实时操作系统与BIOS设计
实时操作系统和BIOS的设计,不仅是保证系统响应及时性及实时任务处理等的根本,而且是设计实时应用软件的基础。
(1)实时操作系统设计
实时操作系统不仅要覆盖系统的常规功能,还必须具有任务或时间的实时处理能力,要求能支持半导体盘、Watchdog和XIP程序的上电直接运行等。实时操作系统设计的基本目标是,提高系统引导速度、运行快速性和代码可靠性。
为提高系统和代码的运行速度,一般避免使用可靠性较低的软硬驱设备,将重复执行的代码放置在可靠性较高且不易丢失数据的固态存储器中。这样不仅提高了系统的引导速度,还提高了可靠性。而且,ROM盘可以以I/O或局部映射的方式访问,不占用实模式主存空间,并可在保护模式下对其进行访问。
XIP方式的提出,是建立在程序运行的高可靠性和新的存储结构要求的基础上,操作系统应是XIP格式的。目前,一些XIP格式的实时操作系统已开发成功,它们具有精简的内核和OM的可配置性。选择实时操作系统时,可根据要求,使用相应的配置工具,即可获得合适的配置结果。例如,为保证兼容性和系统配置的简洁性,可将一个XIPDOS配置到64KB之内,仅包括一个实时运行内核和最小化的命令解释器。
对可靠性要求更高的实时系统,常采用容错操作系统。它不仅在软件结构上保证了可靠性,而且对容错计算管理层中的错误检测与诊断、系统重组与降级、错误恢复与重构,以及软件故障检测、限制与恢复等提供支持,从而进一步提高了可靠性。
(2)BIOS设计
由于BIOS直接与硬件挂接,因此其设计直接影响系统的性能。通常,为保证BIOS的功能及系统运行的可靠性,BIOS的设计应遵循简洁性、可裁剪性、可调试性、可调整性和独立性,以及可靠性和可维护性等原则。遵照这些原则,首先,BIOS在软件结构上采用模块化设计思想并在建立一个可覆盖所有应用的功能模块集的基础上,建立模块的筛选层;其次,在BIOS代码中,为各个阶段可能的软硬件调试与维护预留适当的调试出口、寄存器状态监视、嵌入式dbug等,为调试提供方便。当然,这些功能也应是可筛选的。此外,在确保BIOS代码覆盖系统基本硬件资源和确保BIOS代码集基本配置的基础上,BIOS代码应尽量小,以便在内存的F段节省出一定的空间,以备特殊用途。
为了能从根本上保证程序指令的高可靠执行,实时软件已逐步从加载运行的重定位*.ee格式,转向就地运行的预定位*.bin格式。因此,不论实时操作系统,还是BIOS,都应该是XI格式的。它也是程序固化和就地执行的前提。当然,用高级语言、或用高级语言与汇编语言混合编制实时应用软件时,代码与数据的分离和定位是XIP格式的关键。
2.实时应用软件设计
目前,软件开发有很多有效的形式化方法。它们针对不同的软件系统、管理模式和开发使用环境发挥不同的作用。其中,基于生命周期模型的开发方法对软件工程管理和提高软件产品可靠性最有效。它遵循软件生命周期的划分,明确规定每个阶段的任务。在软件开发中,按照工程管理的原则清晰地划分软件的时间和任务阶段,严格按要求完成每个阶段的任务并产生该阶段文档,同时对相应阶段进行评审或测试,进而保证软件产品的可靠性。在目前尚无更有效的软件工程方法和开发模型的情况下,严格遵循软件工程原理,按照软件生命周期模型进行软件工程设计,是保证实时软件可靠性的基础。
(1)健壮性设计
实时软件仅有正确性远远不够,还必须具有一定的防止错误输入的能力,在发生故障时应能有效地控制事故的蔓延,并进行报警输出处理,使之具有较强的健壮性。提高软件健壮性的措施有:
·检查输入数据的数据类型,防止操作失误。
·模块调用时检查参数的合法性,控制事故蔓延。
·降低模块之间的耦合度,简化软件的复杂性,实现信息隐蔽。
这些措施虽然明显地提高了软件的健壮性,但没有从根本上解决问题,且工作量极大。在常规软件设计中,数据结构与其操作分离,使它们之间存在着潜在的不一致性,不利于改进软件健壮性。面向对象程序设计把数据结构与其操作封装在一个对象中,不允许其它类直接访问它的数据,改变了传统的数据访问方式,从而彻底消除了潜在的不一致性,提高了软件健壮性。
(2)抗干扰设计
实时软件一般是嵌入式软件,其可靠性常常受到嵌入环境和外部干扰的制约。因此,进行软件抗干扰设计势在必行。容错设计、冗余设计、抽象复算、指令复机、纠错编码、设备重复、自动诊断、自动重组、自动修复系统等技术都是有效的抗干扰设计方法。
实时软件因受干扰而使程序"跑飞"或"死锁"时,可重新启动,并初始化。程序的限界运行也是处理程序因干扰而"跑飞"的有效方法。程序运行的时间监视是处理因干扰导致"死锁"的一种有效方法。限时运行方法常用于已知子程序或程序功能块运行时间的情况。软件陷阱是在程序中的适当地方加入陷阱入口/出口语句,当因干扰而发生程序"跑飞"时,就可能落入预设的陷阱。陷阱的出口由设计人员预先设定,这样程序运行就进入可控阶段。有时,实时软件的数据采集会因环境的电磁等干扰而使所采集的数据中含有干扰成分。为此,可在实时软件中植入数字滤波器,对数据进行平滑处理,以提高数据精度。
此外,软件工具的应用也是实时软件可靠性的重要保证。目前,在软件需求分析、软件设计、软件测试、正确性证明、软件验收、软件维护及软件工程管理等各个阶段都有相关的工具予以支持。软件工具根据任务需求,严格按既定的标准和规范工作。在软件开发中,应尽可能使用优秀的软件开发工具。同时,对软件的部分功能和性能测试,软件工具也是极其有效、甚至必不可少的。
在软件生命周期的各个阶段、尤其在需求分析和软件设计等重要阶段进行严格的评审和测试,是发现错误、提高可靠性的有效办法。此外,软件可靠性问题不仅来自于软件设计,更大程度上来自于无约束的随意修改。因此,在实时软件的可靠性设计中,要严格技术状态管理,建立软件修改报告制度,按规定履行更改手续,保持软件技术状态的一致性、可操作性和可检查性。 |
|