版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、不用怀疑,单片机的万能语言就是状态机。还希望大家不要条件反射式的看到状态机就以为我要讲什么VHDL的东西状态机是一种思维模式,是计算机理论的立足之本(不相信请参考清华大学出版社的自动机理论与应用)因此状态机的实现与语言本身关系并不是绝对的。本文要讨论的状态机,从实现方式上更类似于Java中常用的那种思维模式,而与VHDL相去甚远。路要一步一步走,饭要一口一口吃,为了不把后来人吓跑,状态机理论中更多复杂的部分,我会在以后专门写文章讨论,这里我先找一个切入点,从我常用的2种状态机编写方式为大家慢慢展开。首先,关于几个问题,比如:什么地方用状态机?状态机究竟有几种写法?状态机效率到底高不高?是不是把
2、简单问题弄复杂了?这类问题统统不在本文讨论之列,简而言之谁用谁知道。其实,还不能简单的就这么下了结论,套八股文而不求甚解的也大有人在因此我要说:关于状态机的各种问题“谁思考谁实践谁坚持谁知道”。状态机入门第一式:switchcase线到底要点:用switch结构配合一个状态变量,通过修改状态变量的值来切换状态。范例:/!定义状态名称与状态值之间的关系,增加可读性TOC o 1-5 h z#defineFSM_START0 x00#defineFSM_STATE_A0 x01#defineFSM_STATE_B0 x02#defineFSM_RESET0 xFFboolfsm_example_A
3、(形参列表)staticuint8_ts_chFSMState=FSM_START;/!定义状态变量switch(s_chFSMState)caseFSM_START:/!这里添加状态机初始化代码s_chFSMState=FSM_STATE_A;/!进入下一状态break;caseFSM_STATE_A:/!这里添加状态机A进入下一状态的检测代码讦(某某条件)/!这里做一些进入下一状态时要做的准备工作s_chFSMState=FSM_STATE_B;/!进入下一状态break;caseFSM_STATE_B:/!这里添加状态机A进入下一状态的检测代码讦(某某条件)/!这里做一些进入下一状态时要
4、做的准备工作s_chFSMState=FSM_STATE_A;/!进入下一状态elsef(/span某某条件)elsef(/span某某条件)elsebreak;caseFSM_STOP:caseFSM_RESET:default:/!这里添加状态机复位相关的代码chFSMState=FSM_START;/!状态机复位/!返回false表示状态机已经不需要继续运行了returnfalse;/!返回true表示状态机正在运行returntrue;总结:从范例可知,这种状态机就是一根筋并不是说他走不出什么分支来,而是说通常他没有办法让多个状态同时处于激活状态。状态机入门第二式:if判断变化无穷要点
5、:用ifelseelseif结构的组合来描述状态流程图。什么是状态流程图?我不想多解释,因为就那么个简单的东西,说多了反而神秘兮兮的状态流程图你可以简单粗暴的认为,他就是流程图,等你用得多了,你就渐渐明白为啥多了“状态”二字;如果你后来或者先前学过状态图,那么很快你就会明白状态流程图比状态图“高级”了多少。1、不管怎么说,你可以先为你要处理的事物画一个流程图。如果流程图都不会画,就不用凑热闹了。2、接下来,把流程图上每一个方框或者判断筐都“简单粗暴”地看成一个状态。3、将每一个状态用f结构表示出来f(/span状态标志)/!状态代码4、自己看着办,合并多余的状态,优化优化代码。范例:/!首先将
6、布尔量的状态标志压缩在一个字节里面以节省内存开支typedefunionuint8_tValue;uint8_tByte;structunsignedBIT0:1;unsignedBIT1:1;unsignedBIT2:1;unsignedBIT3:1;unsignedBIT4:1;unsignedBIT5:1;unsignedBIT6:1;unsignedBIT7:1;Bits;byte_t;#defineFSM_ACTION_FLAGs_tbState.Bits#defineFSM_STOP_ALL_ACTIONS()dos_tbState.Value=0;while(0)#defineF
7、SM_START#defineFSM_STATE_A#defineFSM_STATE_B(0=s_tbState.Value)FSM_ACTION_FLAG.BIT0FSM_ACTION_FLAG.BIT1#defineFSM_STATE_HFSM_ACTION_FLAG.BIT7boolfsm_example_B(形参列表)staticbyte_ts_tbState=0;/!定义状态变量if(FSM_START)/!起始状态/!这里放置状态机初始化的代码FSM_STATE_A=true;/!进入状态B,start装台自动结束if(FSM_STATE_A)/!一个典型的简单状态/!这里放置状态
8、A的代码或者/!这里放置某些条件以开启别的状态if(某些条件)/!这里做一些“进入”下一个状态之前的准备工作FSM_STATE_B=true;/!开启下一个状态FSM_STATE_A=false;/!结束当前状态if(FSM_STATE_B)/!一个典型的监视状态/!这里检测某些条件if(/span某些条件)/!这里做一些“开启”某个状态的准备工作FSM_STATE_C=true;/!开启某一个状态而不结束当前状态FSM_STATE_D=true;/!你当然可以一次触发多个状态else讦(/span某些条件)/!满足某些条件以后关闭当前状态FSM_STATE_B=false;if(FSM_ST
9、ATE_F)/!一个典型的子状态机调用讦(!fsm_example_a(/span实参列表)/!等待子状态机返回false/!子状态机运行完成,进入下一状态/!结束当前状态/!进入下一状态x代表某个字母FSM_STATE_F=false;FSM_STATE_x=true;if(FSM_STATE_H)/!一个典型的中止状态/!某些状态机的操作,比如释放某些资源FSM_STOP_ALL_ACTIONS();returnfalse;/!复位状态机/!返回false表示状态机结束returntrue;/!返回true表示状态机保持运行总结:从范例可知,这种状态机非常灵活,通过布尔变量的开启和关闭,你
10、可以自由的控制某些状态的开启。同一时刻可能有多个状态是激活的。这种结构几乎可以翻译任何流程图。具体还有很多好处,可以在使用中体会。状态机入门第三式:状态在心中,无态也变态要点:所有的函数都可以看作是状态机,只不过普通的函数是一个只有单一状态的状态机。如果函数有返回值,且这个返回值能表征至少两种以上不同的状态(比如返回是一个指针,那么NULL和非NULL就是两种状态;比如返回是一个布尔变量,那么true和false就是两种状态;比如返回的是一个整数,并且整数的某些特征可以被分类,那么这些不同分类就是几种不同的状态),那么这些返回值就可以被用作指示当前状态机的运行情况。状态机可以调用子状态机。所有
11、的状态都应该是none-block的,简单说就是不会把系统定死在某一个状态里面很久都出不来,比如while(1)或者循环次数较大的for结构;否则状态机的存在意义就大打折扣直接按照流程图写代码不就好了,干吗非要翻译成状态机?状态机中,状态的功能应该是等待某一个事件的发生(或者说条件的满足);某些情况下,一些一次性执行完的流程也可以独立成一个状态它当然没有等待任何条件的满足,你可以认为他是无条件进行状态转移的。总体说来,状态机是一个万能的计算机语言表述方式,与具体的载体语言关系不大。心中有状态,代码怎会无状态?状态机是裸机条件下多任务的廉价实现方案。在状态机多任务条件下,操作系统牵涉的几乎所有概念都会有所涉及,比如任务的同步,临界区的保护,任务间的通讯,任务的优先级,资源的动态分配等等
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年山东省潍坊市中考英语模拟试卷(含答案)
- 八年级道德与法治《竞合之道:在合作中竞争在竞争中合作》教学设计
- 初中八年级地理《产业经纬·家国振兴-中国经济发展探究》大单元导学案
- 八年级上册物理《声音的特性》基于核心素养的单元教学设计
- 实体检测记录
- 初中八年级科学 液体的压强 知识清单
- 建筑工地管理卫生防疫规程
- 北师大版三年级上册数学《小数的初步认识》单元复习课教学设计
- 2026年自学考试概率论与数理统计经典试题及答案解析
- 八年级生物上册《细菌》导学案
- 2026浙江杭州萧山区义蓬街道国有企业招聘4人笔试参考题库及答案详解
- 2026年春季学期苏教版二年级科学下册期末检测试卷及答案(三套)
- 2026年山东师范综合评价测试题及答案
- 2026年全国《安全生产月》知识培训试题及答案
- 肺结核诊疗指南(2025版)
- 2026新教材语文 AI赋能24 一定要争气 教学课件
- 2026年黑龙江省政府采购代理机构从业人员考试复习题及答案
- 2026年期末幼儿园卫生保健汇报
- 山东省2026年普通高校招生(春季)统一考试数学试题
- 2026年山东高考物理考试试卷及答案
- 小学生科普风力发电课件
评论
0/150
提交评论