这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 基础知识每日一题——第四十五题

共7条 1/1 1 跳转至

基础知识每日一题——第四十五题

高工
2014-08-11 13:04:32     打赏
活动简介:

“每日一题”是EEPW参考西电XDLab社推出的旨向初学者普及基础知识的一项活动,每天在此帖内公布“每日一题”的题目。大家可以根据自己的理解对题目进行回答和相互讨论,我们鼓励大家积极发言。第二天会给出参考答案。每天一帖,所有的题目都将汇集至此,以期方便大家查找。

 

活动宗旨:

活动目的在于通过“每日一题”让大家每天进步一点点,增强大家的基础知识,提高大家对电子制作的兴趣。我们鼓励大家积极发言,如果不懂、是菜鸟,请积极发问;如果懂、是大神,请慷慨解囊。


        今日题目:请简述状态机编程原理?






基础知识每日一题

高工
2014-08-11 13:52:06     打赏
2楼

早上起床-洗刷-吃早饭-上中午班-吃中午饭-上下午班-吃下午饭-洗澡-睡觉-早上起床。。。。。

就是这种状态来回切换,每一个状态做的事不一样。


菜鸟
2014-08-11 14:59:17     打赏
3楼
发生事件(event)后,根据当前状态(cur_state),决定执行的动作(action),并设置下一个状态号(nxt_state)。

助工
2014-08-11 21:37:45     打赏
4楼
我是过来学习的。哈哈

高工
2014-08-12 09:44:33     打赏
5楼

状态机是把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。

有限状态机的工作原理如图1所示,发生事件(event)后,根据当前状态(cur_state)
,决定执行的动作(action),并设置下一个状态号(nxt_state)。

                         -------------
                         |           |-------->执行动作action
     发生事件event ----->| cur_state |
                         |           |-------->设置下一状态号nxt_state
                         -------------
                           

 当前状态
                      图1 有限状态机工作原理

                              e0/a0
                              --->--
                              |    |
                   -------->----------
             e0/a0 |        |   S0   |-----
                   |    -<------------    | e1/a1
                   |    | e2/a2           V
                 ----------           ----------
                 |   S2   |-----<-----|   S1   |
                 ----------   e2/a2   ----------
                       图2 一个有限状态机实例

              --------------------------------------------
              当前状态   s0        s1        s2     | 事件
              --------------------------------------------
                       a0/s0      --       a0/s0   | e0
              --------------------------------------------
                       a1/s1      --        --     | e1
              --------------------------------------------
                       a2/s2     a2/s2      --     | e2
              --------------------------------------------

               表1 图2状态机实例的二维表格表示(动作/下一状态)

    图2为一个状态机实例的状态转移图,它的含义是:
        在s0状态,如果发生e0事件,那么就执行a0动作,并保持状态不变;
                 如果发生e1事件,那么就执行a1动作,并将状态转移到s1态;
                 如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;
        在s1状态,如果发生e2事件,那么就执行a2动作,并将状态转移到s2态;
        在s2状态,如果发生e0事件,那么就执行a0动作,并将状态转移到s0态;
    有限状态机不仅能够用状态转移图表示,还可以用二维的表格代表。一般将当前状
态号写在横行上,将事件写在纵列上,如表1所示。其中“--”表示空(不执行动作,也
不进行状态转移),“an/sn”表示执行动作an,同时将下一状态设置为sn。表1和图2表示
的含义是完全相同的。
    观察表1可知,状态机可以用两种方法实现:竖着写(在状态中判断事件)和横着写(
在事件中判断状态)。这两种实现在本质上是完全等效的,但在实际操作中,效果却截然
不同。

    在我的理解就是不停的检测状态的变化,然后根据状态变化执行相应的动作,然后退出动作处理再进行状态检测,这样就形成一个闭环操作。


高工
2014-08-12 10:05:23     打赏
6楼

  解答:

  1、什么是状态机?

  有限状态自动机,简称状态机,是表示有限个状态以及在这些状

  态之间的转移和动作等行为的数学模型。

  2、为什么要引入状态机?

  大家在学习 C 语言编程的时候,通常会用流程图来描述程序的执行

  过程,但是流程图是存在缺陷的。

  举个例子,电子表只有两个按键,用这两个按键可以完成修改、查

  看时间日期等功能。但是如果我们用流程图来描述程序的执行过程将会是这

  样的:

  这样程序的流程图将会无限地分支下去。

  可是如果我们这些流程都看成是各种“状态”,按键表示从一种状

  态转移到另一种状态,我们就能得到下面这种“状态转移图”:

  于是我们就可以比较方便地描述程序中各种状态之间的关系,便可

  以得到下面的程序思路:

  /*************A 键中断***************/

  跳转

  swith(Status)

  {

  //根据当前状态处理 A 键所引发的状态

  case DISP_TIME:Status=DISP_DATE;break;

  键,显示日期

  case DISP_DATE:Status=DISP_SEC; break;

  case DISP_SEC: Status=DISP_TIME;break;

  case SET_HOUR:if(++Hour>23) Hour=0;break;

  //时间显示按键 A

  //小时设置时按

  A 键调整小时

  case SET_MINUTE:if(++Month>12) Month=0;break;

  case SET_DATE:if(++Date>31) Date=0;break;

  }

  /*************B 键中断***************/

  swith(Status)

  状态跳转

  {

  //根据当前状态处理 A 键所引发的

  case DISP_TIME :Status=SET_HOUR;break;

  键,显示小时

  case DISP_DATE :Status=SET_HOUR;break;

  键,显示小时

  case DISP_SEC :Second=0;break;

  //时间显示时按 B

  //日期显示时按 B

  //秒钟显示时按 B

  键,秒归零

  case SET_HOUR :Status=SET_MINUTE;break; //小时设置时按 B

  键,分钟设置

  case SET_MINUTE :Status=SET_MONTH;break;

  键,月设置

  case SET_MONTH :Status=SET_DATE;break;

  B 键,日设置

  case SET_DATE :Status=DISP_DATE;break;

  //分钟设置时按 B

  //月设置时按

  //日设置时按 B 键,

  显示时间

  }

  这样我们就把 A/B 两个按键的各种状态都描述了出来,这就是“状态机

  编程”的一个例子。

  状态机编程是工程上运用非常广泛的一种编程思想,希望大家在编程中

  逐渐形成这种好的编程习惯。


工程师
2014-08-12 14:43:20     打赏
7楼
学习了

共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]