表驱法
作者:无际单片机 链接:https://www.zhihu.com/question/455454057/answer/124127323438 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
第一步:建表
定义状态和事件的枚举,再搞个状态转移表:
// 状态和事件
typedef enum { IDLE, RUNNING, ERROR } State;
typedef enum { START, STOP, ERROR_EVENT } Event;
// 表结构
typedef struct {
State current; // 当前状态
Event event; // 触发事件
State next; // 下一状态
void (*action)(void); // 执行的操作
} Transition;
// 状态转移表
Transition transitions[] = {
{IDLE, START, RUNNING, start_running},
{RUNNING, STOP, IDLE, stop_running},
{RUNNING, ERROR_EVENT, ERROR, handle_error},
// 加新状态?在这加一行
};第二步:查表+执行
写个函数,根据当前状态和事件查表,更新状态并干活:
void process_event(Event event) {
int size = sizeof(transitions) / sizeof(Transition);
for (int i = 0; i < size; i++) {
if (transitions[i].current == current_state && transitions[i].event == event) {
current_state = transitions[i].next;
if (transitions[i].action) transitions[i].action();
return;
}
}
invalid_transition(); // 没找到就报个错
}