概述
来源:裸机思维
作者:GorgonMeducer
【说在前面的话】
在前面的讲解中,我们介绍了如何使用状态图的方式来设计有限状态机明确了状态图设计的“清晰”原则switch状态机翻译模式详细说明了状态图的“无脑翻译”方法。
比如下面这个状态图就是一个典型:
通过图示,我们能清晰的看出该状态机实现的是“通用字符串输出”的功能。其实,这里我算是埋下了一个小小的“彩蛋”——当然,它的真实身份是一个陷阱。如果你已经熟悉了我前面介绍的翻译规则,很容易就会发现这里存在的巨大问题:是的,这个状态图按照switch翻译法无脑翻译的后果,将是一个根本无法正常工作的状态机:
#include <stdint.h>
#include <stdbool.h>
typedef enum {
fsm_rt_err = -1,
fsm_rt_on_going = 0,
fsm_rt_cpl = 1,
} fsm_rt_t;
extern bool serial_out(uint8_t chByte);
#define PRINT_STR_RESET_FSM()
do { s_tState = START; } while(0)
fsm_rt_t print_str(const char *pchStr)
{
static enum {
START = 0,
IS_END_OF_STRING,
SEND_CHAR,
} s_tState = START;
switch (s_tState) {
case START:
s_tState = IS_END_OF_STRING;
break;
case IS_END_OF_STRING:
if (*pchStr == '