3. 需求分析基础:需求层次与分类

做实时系统这么多年,我最大的体会是:需求分析做不好,后面全是坑。你想想看,一个时序约束没搞清楚,到了集成测试阶段才发现,那代价可就大了。今天咱们就聊聊需求分析的基础——需求层次和分类。

3.1 需求层次:从业务到系统的三层结构

我个人习惯把需求分成三个层次:业务需求、用户需求、系统需求。这三层不是随便分的,它们对应着不同角色的关注点。

3.1.1 业务需求

业务需求是最高层。它回答的是:为什么要做这个系统?

举个例子,一个工业控制系统的业务需求可能是:

  • 将生产线故障响应时间缩短到50ms以内
  • 降低30%的停机维护成本
  • 满足ISO 26262功能安全ASIL-D等级

我在项目中遇到过,有些团队一上来就写功能列表,结果做出来的东西跟业务目标对不上。说白了,业务需求是老板和客户关心的,它决定了项目的价值。

关键点:业务需求通常不涉及具体技术实现,它描述的是系统在业务层面要达成的目标。

3.1.2 用户需求

用户需求是中间层。它描述的是:用户用系统做什么?

还是那个工业控制系统,用户需求可能是:

  • 操作员能在3秒内查看任意传感器的实时数据
  • 系统在故障发生时自动记录前后各5秒的波形
  • 维护人员可以通过手持终端查看设备状态

嗯,这里要注意:用户需求是从用户视角出发的,不是从开发者视角。我见过不少需求文档,写着「系统需要支持Modbus TCP协议」——这其实是系统需求,不是用户需求。用户不会关心你用Modbus还是CAN,他只关心能不能读到数据。

3.1.3 系统需求

系统需求是最底层,也是最技术化的。它描述的是:系统具体要做什么?

系统需求会细化到:

  • CPU在50ms内完成所有传感器数据的采集与处理
  • 系统支持最多128个Modbus TCP从站设备
  • 看门狗定时器超时时间为100ms,触发后执行安全停机

我曾经在一个项目中,业务需求写的是「高可靠性」,用户需求写的是「系统不能死机」,结果到了系统需求层面,大家吵了一个星期才定下来:MTBF(平均无故障时间)要大于100,000小时,故障恢复时间不超过200ms。你看,这才是能落地的系统需求。

我的建议:写系统需求时,一定要有可量化的指标。别写「响应要快」,要写「响应时间≤10ms」。否则测试的时候你没法验证。

3.2 功能需求与非功能需求

需求除了分层,还要分类。最常用的分类就是功能需求非功能需求。这个分类在实时系统中尤其重要,因为很多坑都出在非功能需求上。

3.2.1 功能需求

功能需求就是系统做什么。它描述的是系统的行为、功能、输入输出关系。

举个例子,一个实时数据采集系统的功能需求:

  • 系统每10ms采集一次温度传感器数据
  • 当温度超过85°C时,系统触发报警并记录时间戳
  • 系统支持通过UART接口以115200bps的波特率发送数据

功能需求相对好写,因为它是「看得见摸得着」的。但要注意,功能需求要写清楚边界条件。比如「当温度超过85°C时触发报警」——那如果传感器故障,读到的值是0xFF呢?这个也要写清楚。

3.2.2 非功能需求

非功能需求描述的是系统做得怎么样。它关注的是系统的质量属性。在实时系统中,非功能需求往往比功能需求更难满足。

常见的非功能需求包括:

类别 说明 实时系统示例
性能 响应时间、吞吐量、资源利用率 中断响应时间≤5μs,CPU利用率≤70%
可靠性 MTBF、故障恢复时间 MTBF≥50,000小时,故障恢复≤100ms
安全性 功能安全等级、故障容错 满足IEC 61508 SIL 3,单点故障不导致系统崩溃
可维护性 代码可读性、模块化程度 支持OTA升级,升级过程不影响关键任务
实时性 截止时间、抖动、延迟 任务A的截止时间为20ms,抖动≤1ms
避坑指南:我曾经在一个项目中,功能需求写得非常详细,但非功能需求只写了「系统要稳定」。结果到了测试阶段,发现中断响应时间超标,CPU利用率达到95%,系统频繁丢包。后来花了两个月重构,才把非功能需求补上。所以,非功能需求一定要在需求阶段就写清楚,别等到测试再发现。

3.2.3 功能需求与非功能需求的关系

这两者不是独立的。你想想看,一个功能需求「每10ms采集一次数据」,如果非功能需求要求「CPU利用率≤50%」,那你就得考虑怎么优化采集算法,或者用DMA来减轻CPU负担。

说白了,功能需求决定了系统能不能用,非功能需求决定了系统好不好用。在实时系统中,非功能需求往往决定了系统能不能可靠地运行

3.3 需求分析的常见误区

做了这么多年,我总结了一些常见误区,分享给大家:

  1. 混淆用户需求和系统需求:用户说「我要快」,你得翻译成「响应时间≤10ms」。
  2. 忽略非功能需求:尤其是实时性、可靠性这些,等到测试再补就晚了。
  3. 需求写得太模糊:别写「系统要稳定」,要写「MTBF≥100,000小时」。
  4. 没有考虑边界条件:正常情况好写,异常情况(传感器故障、通信超时)才是真正的考验。
一个小技巧:写需求的时候,可以问自己三个问题:
1. 这个需求能不能被测试验证?
2. 这个需求有没有明确的量化指标?
3. 这个需求在异常情况下怎么处理?
如果三个问题都能回答清楚,这个需求基本就合格了。

好了,需求分析的基础就聊到这里。下一章咱们会深入讨论时序规格的定义方法,包括时序图、时间约束语言这些实战工具。到时候我会拿一个真实的嵌入式项目来拆解,保证干货满满。