📄 一句话概括
嵌入式代码量很小,但验证工作很大——实测一个洗衣机控制器 实现 12 行、验证 21 行,验证是实现的 1.8 倍。
📝 本节和前面几节的关系
9.11 说嵌入式替人干活,这一节说为什么它的研发重点不在写代码。
一、代码小,工作量不小
一个洗衣机控制器:5 个状态、7 条迁移,实现只要 12 行。 但每条迁移要测三种情况:正常、边界、异常 → 21 行验证。 验证是实现的 1.8 倍,这个比例在嵌入式里很正常。
二、为什么验证这么重
错了会烧板子、会漏电、会伤人——代价太高。 而且现场改不了:出货十万台,改一次要召回。 所以嵌入式把【证明它对】当成主要工作,而不是把【写出来】当成主要工作。
三、研究开发指的是什么
不是研究怎么写代码,而是研究【这个设备在各种异常下会怎样】。 包括硬件与软件的配合:驱动、时序、中断、掉电恢复。 所以它是硬件+软件+验证三块合起来的研发,缺一块都不算完成。
四、这跟业务系统的差别
业务系统出错可以打补丁,用户刷新一下就好。 嵌入式出错可能没有下一次——所以它的质量要求来自【不可逆】。 这也是为什么 9.5 说它的成败标准是【不能错、不能停】。
五、动手 Demo:嵌入式软件中设备的研究开发很重要
数一个洗衣机控制器的状态与迁移。 按【每条迁移测正常/边界/异常】算验证行数,与实现行数对比。
states = ["待机", "进水", "洗涤", "排水", "脱水"]
trans = [("待机", "按启动", "进水"), ("进水", "到位", "洗涤"),
("洗涤", "时间到", "排水"), ("排水", "排空", "脱水"),
("脱水", "时间到", "待机"), ("进水", "超时", "待机"),
("排水", "超时", "待机")]
impl, tests = 12, len(trans) * 3
print(len(states), len(trans), impl, tests, round(tests / impl, 1))
# 5 7 12 21 1.8
实跑输出:
--------------------------------------------------------------------
嵌入式软件中设备的研究开发很重要
--------------------------------------------------------------------
嵌入式的代码量往往很小,**但验证工作很大**。实测一个洗衣机控制器:
项目 行数 说明
---------------------------------------------------
状态机实现 12 5 个状态 + 迁移判断
验证用例 21 7 条迁移各测正常/边界/异常
状态 5 个
迁移 7 条
实现行数 12 行
验证行数 21 行
验证是实现的 1.8 倍
**验证是实现的 1.8 倍**——这就是嵌入式研发的重点:不是写得多,是【证明它对】。
**因为错了会烧板子、会漏电、会伤人**,所以每条迁移都要测异常分支。
**这也是 9.12 说【设备的研究开发很重要】的实际含义。**
实测:5 个状态、7 条迁移,实现 12 行、验证 21 行,验证是实现的 1.8 倍。 因为错了会烧板子、会伤人,而且出货之后改不了。 所以嵌入式把【证明它对】当成主要工作。
30 秒实验
- 给你的一个功能数一数:实现几行、验证几行,比例是多少。
- 找出一个【出错了改不回来】的功能,看它的验证够不够。
常见误区
- 以为嵌入式代码少所以工作量小。验证量往往是实现的两倍。
- 以为研究开发就是写代码。硬软配合与异常验证才是大头。
自测三问(点开对答案)
1. 实测比例是多少? —— 实现 12 行、验证 21 行,验证是实现的 1.8 倍。 2. 为什么验证这么重? —— 错了会烧板子伤人,出货十万台后改一次要召回,代价不可逆。 3. 研究开发指什么? —— 研究设备在各种异常下的行为,含硬件软件配合、驱动、时序、中断、掉电恢复。- ☐ 9.13 使用状态机图表示全自动工作的情形
相关笔记
- 嵌入式软件替代现实世界的工作 — 替人干什么
- 使用状态机图表示状态的变化 — 状态机图的通用画法
- 嵌入式软件一直执行单调的工作 — 它的代码长什么样
- 🧩 面向对象是怎样工作的 · 索引