状态:让系统记住刚才发生了什么
约 10 分钟
只用逻辑门的电路像一个只看眼前的裁判:同样的输入总给同样的输出。可是自动夜灯需要知道「刚才有人,现在正在倒计时」;密码锁需要知道「已经输入了前两位」。这类关于过去的信息叫状态。
同样输入,不同状态,结果不同
夜灯当前检测不到人。如果状态是「从来没人来」,灯应该灭;如果状态是「人刚离开,十秒还没到」,灯应该继续亮。眼前输入相同,输出不同,原因就是系统记住的过去不同。
最小的记忆单元可以保存一个 0 或 1,许多记忆单元组合成寄存器,再组合成更大的存储器。时钟到来时,电路把新的状态锁进去,下一拍继续使用。CPU 的寄存器、计数器和内存,都建立在「保存状态」这件事上。
用状态图把过程画出来
自动夜灯可以有三个状态:
DAY:白天,灯灭。WAIT:夜晚无人,灯灭。ON:夜晚有人或正在延时,灯亮。
箭头上写切换条件,例如光线变暗时从 DAY 到 WAIT,检测到人时从 WAIT 到 ON,十秒无人时从 ON 回到 WAIT。这叫状态机:有限个状态,加上清楚的转换规则。
一定要设计初始状态
设备刚通电时从哪里开始?如果没有复位规则,记忆单元可能处于不可预测状态,灯也许莫名亮起。复位就像开学第一天统一回到起跑线,让系统进入已知状态。
状态不能无限增加
每遇到一个例外就新增状态,图会变成蜘蛛网。先保留完成目标所需的最少状态,给每个状态清楚命名,再检查是否有走不出去的死路。
练一练:给红绿灯画三个状态,写出每个状态的输出以及切换到下一个状态的条件。
小纸条
为什么同样是「没有人」,自动夜灯有时灭、有时还亮着?