状况机思路在单片机程序规划中的使用
状况机的概念
状况机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵敏使用。在一个思路清晰而且高效的程序中,必定有状况机的身影显现。
比方说一个按键指令解析程序,就能够被看做状况机:本来在A状况下,触发一个按键后切换到了B状况;再触发另一个键后切换到C状况,或许返回到A状况。这便是最简略的按键状况机比方。实践的按键解析程序会比这更杂乱些,但这不影响咱们对状况机的知道。
进一步看,击键动作自身也能够看做一个状况机。一个细微的击键动作包括了:开释、颤动、闭合、颤动和从头开释等状况。
相同,一个串行通讯的时序(不论它是遵从何种协议,规范串口也好、I2C也好;也不论它是有线的、仍是红外的、无线的)也都能够看做由一系列有限的状况构成。
显现扫描程序也是状况机;通讯指令解析程序也是状况机;乃至连继电器的吸合/开释操控、发光管(LED)的亮/灭操控又轨迹不是个状况机。
当咱们翻开思路,把状况机作为一种思想导入到程序中去时,就会找到解决问题的一条有用的捷径。有时候用状况机的思想去考虑程序该干什么,比用操控流程的思想去考虑,或许会更有用。这样一来状况机便有了更实践的功用。
程序其实便是状况机
惹祸你还不了解上面这句话。请想想看,计算机的大厦不便是树立在“0”和“1”两个根本状况的地基之上么?
状况机的要素
状况机可概括为4个要素,即现态、条件、动作、次态。这样的概括,主要是出于对状况机的内涵因果联系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:
①现态:是指当时所在的状况。
②条件:又称为“事情”。当一个条件被分量,将会触发一个动作,或许碑文一次状况的搬迁。
③动作:条件分量后碑文的动作。动作碑文完毕后,能够搬迁到新的状况,也能够依旧保持原状况。动作不是必需的,当条件分量后,也能够不碑文任何动作,直接搬迁到新状况。
④次态:条件分量后要迁往的新状况。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。
假如咱们进一步概括,把“现态”和“次态”一致起来,而把“动作”疏忽(降格处理),则只剩下两个最要害的要素,即:状况、搬迁条件。
状况机的一共办法有许多种,咱们能够用文字、图形或表格的方法来一共一个状况机。
朴实用文字描绘是很低效的,所以就不介绍了。接下来先介绍图形的方法。
状况搬迁图(STD)
状况搬迁图(STD),是一种描绘体系的状况、以及彼此转化联系的图形方法。状况搬迁图的画法有许多种,不过一般都迥然不同。咱们结合一个比方来阐明一下它的画法,如图1所示。
(原文件名:图1状况搬迁图.jpg)
①状况框:用方框一共状况,包括所谓的“现态”和“次态”。
②条件及搬迁箭头:用箭头一共状况搬迁的方向,并在该箭头上标示触发条件。
③节点圆圈:当多个箭头指向一个状况时,能够用节点符号(小圆圈)衔接汇总。
④动作框:用椭圆框一共。
⑤附加条件判别框:用六角菱形框一共。
状况搬迁图和咱们常见的流程图比较有着实质的差异,详细体现为:在流程图中,箭头代表了程序PC指针的跳转;而在状况搬迁图中,箭头代表的是状况的改动。
咱们会发现,这种状况搬迁图比一般程序流程图更简练、直观、易懂。这正是咱们需求到达的意图。
状况搬迁表
除了状况搬迁图,咱们还能够用表格的方法来一共状况之间的联系。这种表一般称为状况搬迁表。
表1便是前面介绍的那张状况搬迁图的另一种描绘方法。
(原文件名:表1状况搬迁表.jpg)
①选用表格方法来描绘状况机,长处是可包容更多的文字信息。例如,咱们不光能够在状况搬迁表中描绘状况的搬迁联系,还能够把每个状况的特征描绘也包括在内。
②假如表格内容较多,过于臃肿不利于阅览,咱们也能够将状况搬迁表进行拆分。通过拆分后的表格依据其详细内容,表格称号也有所改变。
③比方,咱们能够把状况特征和搬迁联系分隔列表。被独自拆分出来的描绘状况特征的表格,也能够称为“状况真值表”。这其间比较常见的便是把每个状况的显现内容独自列表。这种描绘每个状况显现内容的表称之为“显现真值表”。相同,咱们把独自表述根据按键的状况搬迁表称为“按键功用真值表”。别的,假如每一个状况包括的信息量过多,咱们也能够把每个状况独自列表。
④由此可见,状况搬迁表作为状况搬迁图的有利弥补,它的表现方法是灵敏的。
⑤状况搬迁表长处是信息包括面大,缺陷是视觉上不行直观,因而它并不能替代状况搬迁图。比较抱负的是将图形和表格结合使用。用图形展示微观,用表格阐明细节。二者互为参照,相辅相成。
用状况机思路完成一个时钟程序
接下来,我迁就状况机的使用,结合流程图、状况搬迁图和状况搬迁,举一个实践比方。下面这张图是一个时钟程序的状况搬迁图,如图2所示。
(原文件名:图2时钟程序状况搬迁图.jpg)
把这张图稍做概括,就能够得到它的另一种表现方法——状况搬迁表,如表2所示。
(原文件名:表2时钟程序状况搬迁表.jpg)
状况机使用的注意事项
根据状况机的程序调度机制,其使用的难点并不在于对状况机概念的了解,而在于对体系作业状况的合理委任。
初学者往往会把某个“程序动作”当作是一种“状况”来处理。我称之为“伪态”。那么怎么委任“动作”和“状况”。本匠人的心得是看二者的实质:“动作”是不安稳的,即便没有条件的触发,“动作”一旦碑文完毕就完毕了;而“状况”是相对安稳的,假如没有外部条件的触发,一个状况会一向继续下去。
初学者的另一种比较丧命的过错,便是在状况委任时漏掉一些状况。我称之为“漏态”。
“伪态”和“漏态”这两种过错的存在,将会导致程序结构的松散。因而要特别当心防止。
更杂乱的状况机
前面介绍的是一种简略的状况结构。它只要一级,而且只要一维,如图3所示。
(原文件名:图3线性状况机结构.jpg)
假如有必要,咱们能够树立更杂乱的状况机模型。
1 多级状况结构
状况机能够是多级的。在分层的多级状况机体系晒干,一个“父状况”下能够委任多个“子状况”,这些子状况一起具有上级父状况的某些共性,一起又各自具有自己的一些特性。
在某些状况下,还能够进一步委任子状况。比方,咱们能够把前面的时钟比方修正如下:
把一切和时钟功用有关的状况,合并成1个一级状况。在这个状况下,又能够委任出3个二级子状况,分别为显现时刻、设置小时、设置分钟;
相同,咱们也能够把一切和闹钟功用有关的状况,合并成1个一级状况。在这个状况下,再委任出4个二级子状况,分别为显现闹钟、设置“时”、设置“分”、设置鸣叫时刻。
咱们需求用另一个状况变量(寄存器)来一共这些子状况。
子状况下面当然还能够有更低一级的孙状况(子子孙孙无穷尽也),然后将整个状况体系变成了树状多级状况结构,如图4所示。
(原文件名:图4树状多级状况结构.jpg)
2 多维状况结构
状况结构也能够是多维的。从不同的视点对体系进行状况的委任,这些状况的某些特性是穿插的。比方,在依照按键和显现委任状况的一起,又依照体系的作业进程做出另一种状况委任。这两种状况委任一起存在,彼此穿插,然后构成了二维的状况结构空间。
举一个这方面的比方,如:空调遥控器,如图5所示。
(原文件名:图5多维状况机结构.jpg)
相同,咱们也能够构建三维、四维乃至更多维的状况结构。每一维的状况都需求用一个状况变量(寄存器)来一共。
不管多级状况结构和多维状况结构看上去多么诱人,匠人的劝告是:咱们仍然要尽或许地简化状况结构,能用单级、单维的结构,就不要给自己找事,去玩那噩梦般的杂乱结构。
简略的才是最有用的。
完毕语
对状况机的了解需求一个由浅入深的进程。这个进程应该是与实践使用和详细事例考虑相结合的。当一种杰出的思路成为规划的习气,它就能给规划者带来报答。愿这篇手记里介绍的根据状况机的编程思路能给新手们带来一些启迪,协助我们找到“程序规划”的感觉。