关于状态机,下面两种写法哪种正确?

[复制链接]
1194|5
手机看帖
扫描二维码
随时随地手机跟帖
discussant|  楼主 | 2018-7-13 22:19 | 显示全部楼层 |阅读模式
本帖最后由 discussant 于 2018-7-15 17:33 编辑

写法一:
void StateProcess()
{
    if(State==C_OFF_STATE)
    {
        f_heat=0;//只要在关的状态,一直不加热
        if(KeyEvent==C_KEY_EVENT_ON)//状态转换条件
        {
            State=C_ON_STATE;//状态转换
        }
    }
    else if(State==C_ON_STATE)
    {
        f_heat=1;//只要在开的状态,一直加热
        if(KeyEvent==C_KEY_EVENT_OFF)//状态转换条件
        {
            State=C_OFF_STATE;//状态转换
        }
    }
    if(f_heat)
    GPIO_HEAT=1;
    else
    GPIO_HEAT=0;
}

写法二:
void StateProcess()
{
    if(State==C_OFF_STATE)
    {
        if(KeyEvent==C_KEY_EVENT_ON)//条件
        {
            State=C_ON_STATE;//状态转换
            f_heat=1;//动作
        }
    }
    else if(State==C_ON_STATE)
    {
  
        if(KeyEvent==C_KEY_EVENT_OFF)//条件
        {
            State=C_OFF_STATE;//状态转换
            f_heat=0;//动作
        }
    }
    if(f_heat)
    GPIO_HEAT=1;
    else
    GPIO_HEAT=0;
}

相关帖子

discussant|  楼主 | 2018-7-13 22:27 | 显示全部楼层
再举一个单片机例子。写显示程序,有的人喜欢在每个循环先把显示缓冲区全部清0,然后把每个状态的该置为1的缓冲区的位置为1.但是后的人只有在状态变化的时刻才改变这个显示缓冲区。

使用特权

评论回复
discussant|  楼主 | 2018-7-13 22:33 | 显示全部楼层
我在首帖的第一个例子的加热程序,每个循环都会f_heat=1;或f_heat=0;这样即使程序因某个原因导致f_heat异常也会很快恢复原值。但是有的人写的程序就是在状态变化的那个时刻才改变f_heat,如果这个值由于某个原因变了呢?

使用特权

评论回复
discussant|  楼主 | 2018-7-15 17:34 | 显示全部楼层
单片机程序

使用特权

评论回复
discussant|  楼主 | 2020-2-25 13:30 | 显示全部楼层
谢谢!

使用特权

评论回复
lhj200304| | 2020-7-9 09:49 | 显示全部楼层
discussant 发表于 2018-7-13 22:27
再举一个单片机例子。写显示程序,有的人喜欢在每个循环先把显示缓冲区全部清0,然后把每个状态的该置为1的 ...

多次刷写可以容错抗干扰

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

246

帖子

1

粉丝