当前位置: 首页 > news >正文

南宁在哪里推广网站永久免费asp空间申请

南宁在哪里推广网站,永久免费asp空间申请,合肥做淘宝网站建设,开源众包摘要#xff1a;不知道大家有没有这样一种感觉#xff0c;就是感觉自己玩单片机还可以#xff0c;各个功能模块也都会驱动#xff0c;但是如果让你完整的写一套代码#xff0c;却无逻辑与框架可言#xff0c;上来就是开始写#xff01;东抄抄写抄抄。说明编程还处于比较… 摘要不知道大家有没有这样一种感觉就是感觉自己玩单片机还可以各个功能模块也都会驱动但是如果让你完整的写一套代码却无逻辑与框架可言上来就是开始写东抄抄写抄抄。说明编程还处于比较低的水平那么如何才能提高自己的编程水平呢学会一种好的编程框架或者一种编程思想可能会受用终生比如模块化编程框架式编程状态机编程等等都是一种好的框架。今天说的就是状态机编程由于篇幅较长大家慢慢欣赏。那么状态机是一个这样的东东状态机(state machine)有5个要素分别是状态(state)、迁移(transition)、事件(event)、动作(action)、条件(guard)。什么是状态机状态机是一个这样的东东状态机(state machine)有 5 个要素分别是状态(state)、迁移(transition)、事件(event)、动作(action)、条件(guard)。状态一个系统在某一时刻所存在的稳定的工作情况系统在整个工作周期中可能有多个状态。例如一部电动机共有正转、反转、停转这 3 种状态。一个状态机需要在状态集合中选取一个状态作为初始状态。迁移系统从一个状态转移到另一个状态的过程称作迁移迁移不是自动发生的需要外界对系统施加影响。停转的电动机自己不会转起来让它转起来必须上电。事件某一时刻发生的对系统有意义的事情状态机之所以发生状态迁移就是因为出现了事件。对电动机来讲加正电压、加负电压、断电就是事件。动作在状态机的迁移过程中状态机会做出一些其它的行为这些行为就是动作动作是状态机对事件的响应。给停转的电动机加正电压电动机由停转状态迁移到正转状态同时会启动电机这个启动过程可以看做是动作也就是对上电事件的响应。条件状态机对事件并不是有求必应的有了事件状态机还要满足一定的条件才能发生状态迁移。还是以停转状态的电动机为例虽然合闸上电了但是如果供电线路有问题的话电动机还是不能转起来。只谈概念太空洞了上一个小例子一单片机、一按键、俩 LED 灯(记为L1和L2)、一人 足矣规则描述1、L1L2状态转换顺序OFF/OFF---ON/OFF---ON/ON---OFF/ON---OFF/OFF2、通过按键控制L1L2的状态,每次状态转换需连续按键5次3、L1L2的初始状态OFF/OFF图1下面这段程序是根据功能要求写成的代码。程序清单List1void main(void) {sys_init();led_off(LED1);led_off(LED2);g_stFSM.u8LedStat  LS_OFFOFF;g_stFSM.u8KeyCnt  0;while(1){if(test_key()TRUE){fsm_active();}else{; /*idle code*/}} } void fsm_active(void) {if(g_stFSM.u8KeyCnt  3) /*击键是否满 5 次*/{switch(g_stFSM.u8LedStat){case LS_OFFOFF:led_on(LED1); /*输出动作*/g_stFSM.u8KeyCnt  0;g_stFSM.u8LedStat  LS_ONOFF; /*状态迁移*/break;case LS_ONOFF:led_on(LED2); /*输出动作*/g_stFSM.u8KeyCnt  0;g_stFSM.u8LedStat  LS_ONON; /*状态迁移*/break;case LS_ONON:led_off(LED1); /*输出动作*/g_stFSM.u8KeyCnt  0;g_stFSM.u8LedStat  LS_OFFON; /*状态迁移*/break;case LS_OFFON:led_off(LED2); /*输出动作*/g_stFSM.u8KeyCnt  0;g_stFSM.u8LedStat  LS_OFFOFF; /*状态迁移*/break;default: /*非法状态*/led_off(LED1);led_off(LED2);g_stFSM.u8KeyCnt  0;g_stFSM.u8LedStat  LS_OFFOFF; /*恢复初始状态*/break;}}else{g_stFSM.u8KeyCnt; /*状态不迁移仅记录击键次数*/} } 实际上在状态机编程中正确的顺序应该是先有状态转换图后有程序程序应该是根据设计好的状态图写出来的。不过考虑到有些童鞋会觉得代码要比转换图来得亲切我就先把程序放在前头了。这张状态转换图是用UML(统一建模语言)的语法元素画出来的语法不是很标准但拿来解释问题足够了。图2按键控制流水灯状态转换图圆角矩形代表状态机的各个状态里面标注着状态的名称。带箭头的直线或弧线代表状态迁移起于初态止于次态。图中的文字内容是对迁移的说明格式是事件[条件]/动作列表(后两项可选)。“事件[条件]/动作列表”要说明的意思是如果在某个状态下发生了“事件”并且状态机满足“[条件]”那么就要执行此次状态转移同时要产生一系列“动作”以响应事件。在这个例子里我用“KEY”表示击键事件。图中有一个黑色实心圆点表示状态机在工作之前所处的一种不可知的状态在运行之前状态机必须强制地由这个状态迁移到初始状态这个迁移可以有动作列表(如图1所示)但不需要事件触发。图中还有一个包含黑色实心圆点的圆圈表示状态机生命周期的结束这个例子中的状态机生生不息所以没有状态指向该圆圈。关于这个状态转换图就不多说了相信大家结合着上面的代码能很容易看明白。现在我们再聊一聊程序清单List1。先看一下fsm_active()这个函数g_stFSM.u8KeyCnt 0;这个语句在switch—case里共出现了 5 次前 4 次是作为各个状态迁移的动作出现的。从代码简化提高效率的角度来看我们完全可以把这 5 次合并为 1 次放在 switch—case 语句之前两者的效果是完全一样的代码里之所以这样啰嗦是为了清晰地表明每次状态迁移中所有的动作细节这种方式和图2的状态转换图所要表达的意图是完全一致的。再看一下g_stFSM这个状态机结构体变量它有两个成员u8LedStat和 u8KeyCnt。用这个结构体来做状态机好像有点儿啰嗦我们能不能只用一个像 u8LedStat 这样的整型变量来做状态机呢当然可以我们把图 2中的这 4 个状态各自拆分成 5 个小状态这样用 20 个状态同样能实现这个状态机而且只需要一个 unsigned char 型的变量就足够了每次击键都会引发状态迁移 每迁移 5 次就能改变一次 LED 灯的状态从外面看两种方法的效果完全一样。假设我把功能要求改一下把连续击键5次改变L1L2的状态改为连续击键100次才能改变L1L2的状态。这样的话第二种方法需要4X100400个状态而且函数fsm_active()中的switch—case语句里要有400个case这样的程序还有法儿写么同样的功能改动如果用g_stFSM这个结构体来实现状态机的话函数fsm_active()只需要将if(g_stFSM.u8KeyCnt3)改为if(g_stFSM.u8KeyCnt 98)就可以了g_stFSM结构体的两个成员中u8LedStat可以看作是质变因子相当于主变量u8KeyCnt可以看作是量变因子相当于辅助变量。量变因子的逐步积累会引发质变因子的变化。像g_stFSM这样的状态机被称作Extended State Machine我不知道业内正规的中文术语怎么讲只好把英文词组搬过来了。2、状态机编程的优点说了这么多大家大概明白状态机到底是个什么东西了也知道状态机化的程序大体怎么写了那么单片机的程序用状态机的方法来写有什么好处呢(1)提高CPU使用效率话说我只要见到满篇都是delay_ms()的程序就会蛋疼动辄十几个ms几十个ms的软件延时是对CPU资源的巨大浪费宝贵的CPU机时都浪费在了NOP指令上。那种为了等待一个管脚电平跳变或者一个串口数据而岿然不动的程序也让我非常纠结如果事件一直不发生你要等到世界末日么把程序状态机化这种情况就会明显改观程序只需要用全局变量记录下工作状态就可以转头去干别的工作了当然忙完那些活儿之后要再看看工作状态有没有变化。只要目标事件(定时未到、电平没跳变、串口数据没收完)还没发生工作状态就不会改变程序就一直重复着“查询—干别的—查询—干别的”这样的循环这样CPU就闲不下来了。在程序清单 List3 中if{}else{}语句里else下的内容(代码中没有添加只是加了一条/*idle code*/的注释示意)就是上文所说的“别的工作” 。这种处理方法的实质就是在程序等待事件的过程中间隔性地插入一些有意义的工作好让CPU不是一直无谓地等待。(2) 逻辑完备性我觉得逻辑完备性是状态机编程最大的优点。不知道大家有没有用C语言写过计算器的小程序我很早以前写过写出来一测试那个惨不忍睹啊当我规规矩矩的输入算式的时候程序可以得到正确的计算结果但要是故意输入数字和运算符号的随意组合程序总是得出莫名其妙的结果。后来我试着思维模拟一下程序的工作过程正确的算式思路清晰流程顺畅可要碰上了不规矩的式子走着走着我就晕菜了那么多的标志位那么多的变量变来变去最后直接分析不下去了。很久之后我认识了状态机才恍然明白当时的程序是有逻辑漏洞的。如果把这个计算器程序当做是一个反应式系统那么一个数字或者运算符就可以看做一个事件一个算式就是一组事件组合。对于一个逻辑完备的反应式系统不管什么样的事件组合系统都能正确处理事件而且系统自身的工作状态也一直处在可知可控的状态中。反过来如果一个系统的逻辑功能不完备在某些特定事件组合的驱动下系统就会进入一个不可知不可控的状态与设计者的意图相悖。状态机就能解决逻辑完备性的问题。状态机是一种以系统状态为中心以事件为变量的设计方法它专注于各个状态的特点以及状态之间相互转换的关系。状态的转换恰恰是事件引起的那么在研究某个具体状态的时候我们自然而然地会考虑任何一个事件对这个状态有什么样的影响。这样每一个状态中发生的每一个事件都会在我们的考虑之中也就不会留下逻辑漏洞。这样说也许大家会觉得太空洞实践出真知某天如果你真的要设计一个逻辑复杂的程序我保证你会说哇状态机真的很好用哎(3)程序结构清晰用状态机写出来的程序的结构是非常清晰的。程序员最痛苦的事儿莫过于读别人写的代码。如果代码不是很规范而且手里还没有流程图读代码会让人晕了又晕只有顺着程序一遍又一遍的看很多遍之后才能隐约地明白程序大体的工作过程。有流程图会好一点但是如果程序比较大流程图也不会画得多详细很多细节上的过程还是要从代码中理解。相比之下用状态机写的程序要好很多拿一张标准的UML状态转换图再配上一些简明的文字说明程序中的各个要素一览无余。程序中有哪些状态会发生哪些事件状态机如何响应响应之后跳转到哪个状态这些都十分明朗甚至许多动作细节都能从状态转换图中找到。可以毫不夸张的说有了UML状态转换图程序流程图写都不用写。套用一句广告词谁用谁知道果子哥制作说明文章转载自一篇pdf文档作者Alicedodo旨在分享技术知识如有侵权请联系删除推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~嵌入式Linux微信扫描二维码关注我的公众号
http://www.pierceye.com/news/703926/

相关文章:

  • 免费商城网站建设建设银行企业网站首页
  • 北京哪家网站建设公司比较好帝国cms怎么做网站地图
  • 做网站制作外包数据可视化
  • 专注大连网站建设青海项目信息网
  • 网站开发开题报告范文可以做免费的网站吗
  • 淄博网站备案wordpress代码实现下载
  • 网站做全景做的好看的网站
  • 宜春专业的企业网站建设公司网站建设待遇怎样
  • 苏州企业网站建设制作服务在线培训平台
  • 成都创建公司网站wordpress的多说美化
  • 企业网站建设的方案书用织梦做模板网站
  • 馆陶做网站容桂低价网站建设
  • 帮一个企业做网站流程免费做app的软件有哪些
  • 河间哪里有做网站的wordpress禁用修正版
  • 网站建设对网络营销的影响做网站的怎么挣钱
  • 个人备案的网站涉及到资金抖音代运营服务达不到退费标准
  • 做网站投放广告湘潭学校网站建设 磐石网络第一
  • 营销手机网站目前专业做水果的网站有哪些
  • 莆田仿站定制模板建站网站设计应该考虑的重要因素
  • 简述网站制作过程企业网络推广网站建设
  • 外贸营销网站建设介绍wordpress分库技术
  • 做竞品分析的网站安卓小程序开发入门
  • 做网站的外包公司可以进吗做旅游网站赚钱吗
  • 网站网页设计基本理论教育学校网站源码 php
  • 吉林省建设厅网站专家新华社官网
  • 代做吧机械网站天津建站管理系统价格
  • 开发网站公司都需要什么岗位人员有了网站怎么写文章
  • 白水网站建设郑州网站推广优化公司
  • 做网站的参考文献专业建设报告
  • asp网站搭建工具中英文网站前端怎么做