打印

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

[复制链接]
1355|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 | 只看该作者
单片机程序

使用特权

评论回复
5
discussant|  楼主 | 2020-2-25 13:30 | 只看该作者
谢谢!

使用特权

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

多次刷写可以容错抗干扰

使用特权

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

本版积分规则

68

主题

249

帖子

1

粉丝