1. 有限状态机:嵌入式开发的思维利器
第一次接触有限状态机(Finite State Machine, FSM)是在大三的微机原理实验课上。当时需要设计一个电梯控制系统,我用一堆if-else嵌套实现了基本功能,但代码已经臃肿到难以维护。直到助教展示了他的FSM版本——清晰的逻辑、模块化的结构、不到我一半的代码量,那一刻我才明白为什么说"状态机是嵌入式开发的必修课"。
在嵌入式领域,FSM是对系统行为建模的数学工具,它将复杂流程分解为有限的状态集合,以及触发状态转移的事件和动作。想象十字路口的交通灯:红灯、黄灯、绿灯就是它的状态,定时器超时就是触发状态切换的事件。这种模型特别适合处理:
- 外设驱动(UART数据接收、按键消抖)
- 协议解析(Modbus、CAN总线)
- 用户界面(菜单导航)
- 控制逻辑(温控系统)
以STM32的按键检测为例,传统轮询方式需要处理抖动、长按、连发等复杂情况,而状态机可以优雅地拆分为:
c复制typedef enum {
IDLE,
DEBOUNCE,
PRESSED,
HOLD
} ButtonState;
ButtonState currentState = IDLE;
2. C语言实现状态机的四种经典模式
2.1 嵌套switch法
最直观的实现方式,外层switch处理状态,内层switch处理事件:
c复制void handleEvent(Event event) {
switch(currentState) {
case STATE_A:
switch(event) {
case EVENT_X:
action1();
currentState = STATE_B;
break;
// 其他事件处理...
}
break;
// 其他状态处理...
}
}
优点:逻辑直白,适合初学者理解状态机概念
缺点:代码膨胀快,添加新状态/事
