创建嵌入式软件可能是一项具有挑战性的工作,这种体验可以是定义明确、受控的过程。无论嵌入式开发周期在这个范围内的哪个位置,设计周期中都有一些元素应该对它们都是通用的。这些包括收集需求、创建设计、构建软件、测试软件,最终维护软件。执行任一阶段所花费的时间量将根据所使用的设计周期过程而有所不同,但通过掌握设计周期的这些方面,将确保在分配的预算内持续、按时地开发产品。
本文对设计周期的每一个方面都提供了最简短的介绍。
需求
收集并恰当地记录需求可能是任何开发过程的关键步骤之一。如果一个团队不知道他们在构建什么,那么他们注定会失败。需求可以用多种方式来定义,但是一个好的通用定义是,需求是软件为了解决特定问题而必须表现出来的属性。就像生活中任何事情一样,需求比定义稍微复杂一些,因为它们有两种不同的风格;功能性和非功能性。
功能需求描述了软件要展示的行为,这意味着功能需求实际上是软件的一种能力。另一方面,非功能性需求是约束解决方案的需求,嵌入式开发人员关注的不是系统的能力,而是如何限制这种能力。这些类型的需求通常面向系统性能、可维护性等等。
有许多不同的方法来记录和维护需求,无论是基于网络的系统还是简单的文档。在任何一种情况下,软件需求规格说明书(SRS)的使用都是记录需求的非常有用的工具。SRS用于以工程团队能够理解的技术术语陈述要求,而不是以最终客户能够理解的语言陈述要求。
SRS有许多目的,不仅仅是记录要求。它们可以用来估计成本,确定项目风险,甚至评估和创建开发进度。在整个设计周期中,随着验证的进行,SRS可用于创建要求可追溯性矩阵,该矩阵可用于确保每个要求都得到实施和测试。
设计
如果嵌入式开发人员想要最小化错误数量和软件构造问题,设计阶段是极其重要的。一个经过适当思考和设计的软件实现起来几乎是轻而易举的,因为设计阶段做了所有繁重的工作!
设计阶段有一些非常重要的输出,是软件构造所需要的。这些是软件架构和详细的软件设计。软件架构是对软件系统的子系统和组件以及它们之间关系的描述。这个文档驱动详细的设计,并指示软件应该如何构造。它允许工程师在编写一行代码之前,考虑整个设计和所有相互关联的部分。
软件设计阶段还有助于产生软件模型,这些模型可以作为正确的解决方案进行测试和验证。该设计有助于为编写的软件提供蓝图,这大大有助于减少软件返工的时间和成本,当然也有助于减少bug。请记住,虽然只是因为时间花费在预先设计软件上,但这并不意味着高风险的区域不会被识别,这些区域确实需要编写一些测试代码,以便充分理解设计所必需的组件,这是一个相当大的过程。
构建
构建阶段很可能是大多数嵌入式开发工程师花费时间并且想要花费时间的地方。软件构建是指通过编码、验证、单元测试、集成测试和调试的组合来详细创建工作软件。虽然测试通常被认为是一个独立的阶段,但它也作为构建的一部分来执行是很重要的。
在建造阶段会发生很多事情,但是真正发生的是,被创造出来的设计,软件架构,从简单的流程图和图表转换成工作代码。创建设计给出了如何实现软件的路线图,但工程师仍然需要尽量降低复杂性,可能需要实现编码标准,如MISRA-C,并需要确保代码是模块化的。如果要重用代码,开发人员可能需要遵守API或硬件抽象层(HAL ),以确保代码在未来可以重用。
在构建过程中,度量和统计也很重要。有许多不同类型的度量可以被跟踪,但是一些最有用的是代码开发、修改、重用和复杂性。限制一个函数变得多复杂对于那些被迫维护代码库的可怜的嵌入式开发人员来说是非常重要的。这个独特的度量标准也可以用来确定验证一个功能所需的最小测试用例数量。
测试
软件测试包括动态验证,即程序在有限的测试用例集上提供预期的行为,这些测试用例是从通常无限的执行域中适当选择的。正如前面提到的,虽然测试被分成了不同的类别,但是它应该贯穿于整个设计周期。测试软件的目的是识别软件中的故障、错误和缺陷。
理解这些潜在测试状态定义的差异是很重要的。故障是指系统或部件不能在规定的性能要求范围内执行其所需的功能,而故障可以是程序中的错误步骤、处理器数据。这两者是有区别的,但是有时候开发者可能并不在乎这种区别。当这种情况发生时,他们可以简单地将其归类为缺陷。
嵌入式开发人员有许多方法可以跟踪、执行和创建测试。一个简单的方法是使用软件需求规格说明文档来生成需求跟踪矩阵。矩阵变成了一个简单的列表,可以识别需求并将其与代码模块、测试用例以及测试结果联系起来。需求和任何圈复杂度分析也可以用来生成测试用例。
维护
软件维护涉及到所有设计周期阶段的重复,有点曲折。维护工程师需要能够更新软件以包含新的需求,同时维护现有系统的完整性,而不是从零开始。这可能涉及对当前设计的详细分析,了解在哪里进行架构和设计更新,实现这些更新,当然,在下一个版本发布之前还要测试它们。软件维护变成了重复的设计周期。
软件维护人员通常从修改请求日志开始工作,并以某种形式进行电子跟踪。该软件允许对更新以及现场可能发现的任何错误进行优先排序。工程师需要研究任何提议的变更的影响,并经济高效地实施它们。
软件设计周期可以像任何团队希望的那样复杂或简单。任何设计周期的这五个阶段都包含了大量的知识,对每个阶段的正确掌握将为任何嵌入式开发人员提供在设定的时间表和预算内一致地构建嵌入式软件所需的理解。这篇文章仅仅触及了这个非常丰富的研究领域的皮毛。