状态机在嵌入式开发中的应用
状态机(FSM - Finite State Machine)是嵌入式开发中最常用的设计模式之一。它能够帮助开发者将复杂的逻辑分解为清晰的状态和转换,特别适合处理按键检测、协议解析、模式切换等场景。 什么是状态机? 状态机是一种抽象的计算模型,由以下要素组成: 要素 说明 状态 (State) 系统在某一时刻的稳定条件或工作模式 事件 (Event) 触发状态转换的外部信号或内部条件 转换 (Transition) 状态之间的有向转移 动作 (Action) 状态转换时执行的操作 状态转移图 状态机可以用状态转移图直观地表示: +-----------------+ | | | IDLE |<---------------+ | | | +--------+--------+ | | | 事件:EV_KEY_PRESS | | | v | +--------+--------+ | | | | | PRESSED |-------+ | | | | | +-----------------+ | | | | 定时器超时 | | 按键释放 (消抖完成) | | | | v | +-----------------+ +--------+------>+ | | | | RELEASED |---------------------->+ | | 消抖完成,进入IDLE +-----------------+ 核心要素详解 状态定义 typedef enum { STATE_IDLE, // 空闲状态 STATE_PRESSED, // 按键按下(消抖中) STATE_ACTIVE, // 按键确认按下 STATE_RELEASED, // 按键释放(消抖中) } KeyState; 事件定义 typedef enum { EV_KEY_PRESS, // 按键按下 EV_KEY_RELEASE, // 按键释放 EV_TIMEOUT, // 定时器超时 } KeyEvent; 状态表 typedef struct { KeyState current_state; KeyEvent event; KeyState next_state; void (*action)(void); // 转换时执行的动作 } StateTransition; // 状态转换表 static const StateTransition g_trans_table[] = { {STATE_IDLE, EV_KEY_PRESS, STATE_PRESSED, Start_DebounceTimer}, {STATE_PRESSED, EV_TIMEOUT, STATE_ACTIVE, On_KeyConfirmed}, {STATE_ACTIVE, EV_KEY_RELEASE,STATE_RELEASED, Start_DebounceTimer}, {STATE_RELEASED, EV_TIMEOUT, STATE_IDLE, On_KeyReleased}, }; 实现方式 1. Switch-Case 实现 最简单直观的方式: ...