查看: 2732|回复: 1

单片机裸奔之状态机浅谈

[复制链接]
发表于 2017-7-6 09:23:00 | 显示全部楼层 |阅读模式
关键词: 单片机编程 , 状态机
单片机裸奔之状态机浅谈

说 到单片机编程,不得不说到状态机,状态机做为软件编程的主要架构已经在各种语言中应用,当然包括C语言,在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。灵活的应用状态机不仅是程序更高效,而且可读性和扩展性也很好。状态无处不在,状态中有状态,只要掌握了这种思维,让它成为您编程中的一种习惯,相信您会受益匪浅。


状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果联系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:

①现态:是指当前所处的状态。

②条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。

③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。

④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

如果我们进一步归纳,把“现态”和“次态”统一起来,而把“动作”忽略(降格处理),则只剩下两个最关键的要素,即:状态、迁移条件。

状态机的表示要领有许多种,我们可以用文字、图形或表格的形式来表示一个状态机。

举个简单的例子:就按键处理来说,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。  当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到处理疑问的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。废话不多说,实践才是检验真理的唯一标准。

也许有人觉得状态机把问题复杂化了,其实做过软件设计的人无形之中已经在用状态机,下面就总结介绍几种状态机。




第一种:switch case结构状态机

 switch()。

  case1:。

  if(not反复执行状态1)。

  进入1状态前要做的准备。

  进入1状态的过程。

  if(not反复执行状态1)。

  离开状态1的过程。

  case2:。

  ...。

但这种方式不能很有效预定义所有的状态,也不能把这些状态之间的切换过程合理的定义出来,“状态”本身没有一个合理的定义,几乎是一种面向过程的方式,只过这种方式足够简单,也最容易让人接受,缺点就没有“状态”的定义和指派功能,导致状态的混乱,出现状态处理重复代码,甚至处理不一致的问题,按照OO的观念,状态描述本来就应该是一种实体。

第二种状态机:ifelse语句结构状态机

这种状态机相对灵活一点,但对于一些大的项目,系统软件设计会相对复杂。

以上2种状态机是是大家接触最多的,也是经常用到的,这里不多说了。下面重点谈谈第三种状态机。

第三种状态机:消息触发状态机

该类型的状态机实现方式也是很多的,形态多样,但万变不离其宗的就是状态机的4要素及现态、条件、动作、次态。

下面介绍一种消息触发类型的状态机。

基于消息驱动的状态机机制

原理:一旦有消息触发,系统服务函数立即寻找所在状态的消息与消息处理函数对,找到后执行消息处理函数

步骤:

1.添加消息与消息映射



BEGIN_MESSAGE_ MAP(Name,Count) :状态机名,消息数

ADD_NEW_MSG_ITEM (Msg,OnMsg) :消息与消息处理函数

END_MESSAGE_MAP:结束



2.在这里注册

BEGIN_Register_Task:头

...

ADD_Register_Task(Name,Count):状态机名,消息数

...

END_Register_Task:尾

1.划分电子秤状态,完成以上步骤后,完成OnMsg消息处理函数

Void OnMsg(void)

{



}

说明:以上用宏完成,具体宏是如下定义:

#defineBEGIN_MESSAGE_MAP(Name,Count) constMSG_NODE_TYP MSG_node_Array_##Name[(Count)]={

#define ADD_NEW_MSG_ITEM(Msg,OnMsg) {Msg,OnMsg},

#define END_MESSAGE_MAP };

#define BEGIN_Register_Task const MSG_MAP TaskMap[TotalTask]={

#define ADD_Register_Task(Name,Count) {(MSG_NODE_TYP*)MSG_node_Array_##Name,Count},

#define END_Register_Task };

从以上代码可知:

1. 添加消息与消息映射实际上是定义消息与消息处理函数对的数组,以形成一个表

2. 注册状态机实际上是把所有消息对数组的入口定义成一个数组,以形成一个表

消息是如何被执行的?

分发消息

void Default_DisposeMessage(unsigned char *pMsg)
{
unsigned chari;
unsigned charcount=TaskMap[g_Status].cItemCount;//定位到状态表
for(i=0;i {
if(*pMsg==TaskMap[g_Status].pMsgItems.msg)//看能否匹配消息
{
TaskMap[g_Status].pMsgItems.pMsgFunc();//找到就执行消息处理函数
return;
}
}
}
void DispatchMessage(unsigned char*pMsg)
{
if(*pMsg)
{
Default_DisposeMessage(pMsg);
}
}
核心函数:消息处理中心
void Message_Dispose_Central(void)
{
BYTE Msg;
while(GetMessage(&Msg)) //获取消息
{
TranslateMessage(&Msg); //解释消息
DispatchMessage(&Msg); //分发消息
}
}


以下课程可免费试听C语言、电子、PCBSTM32LinuxFPGA、JAVA、安卓等。
想学习的你和我联系预约就可以免费听课了。
宋工企鹅号:3524-6590-88   Tel/WX:173--1795--1908



发表于 2017-7-14 17:01:50 | 显示全部楼层
文章很不错,补充一点连接器知识供大家交流
拍明芯城电子元器件网上商城是快速撮合的IC元器件交易平台,是一家完整提供“线上快捷交易+线下供应链服务”的专业垂直电商平台。客户可使用各类终端,便捷登陆网页进行询报价和在线交易,还可免费使用本平台提供的商用管理软件,可为客户提供一站式供应链配套服务。ICZOOM 电子元器件网上商城的资深成员来自于大型半导体企业、供应链企业和垂直电商企业,拥有10年以上行业从业经验,共同致力于整合全球IC元器件上下游资源, 以完善的在线交易系统和专业的人才团队为客户提供更高效、安全、便捷的服务。拍明芯城电子元器件网上商城采购客服电话:4006-938-369 0755-86036281

推荐料号:SZH-003T-P0.5、SPH-002T-P0.5S、SPHD-002T-P0.5、SEH-001T-P0.6L、SPH-001T-P0.5L、SGVHSF-002T-0.2、SAN-002T-0.8K、SPND-001T-C0.5、SPND-002T-C0.5、SXA-001T-P0.6L、SMM-003T-P0.5、ZHR-3、EHR-2、SYF-01T-P0.5A 、PHR-4 、ZHR-2、SPUD-001T-P0.5、XHP-10、SSH-003T-P0.2-H、SBH-001T-P0.5、PHR-6        、XHP-3 、SSHL-002T-P0.2、EHR-11、EHR-12、EHR-6 、XHP-6        、XHP-5 、PHR-7、SLF-41T-P1.3E、SPAL-002T-P0.5、SSH-003GA-P0.2、SSF-21T-P1.4、SYF-41T-P0.5A、GHR-03V-S、EHR-7、SPNI-002T-P0.5、SADH-002G-P0.2、EHR-8、PHR-8 、4P-SCN、XHP-7、VHR-2N 、XAP-02V-1、PHR-10、SHR-02V-S-B、SSFH-001T-P0.5、SSFH-002T-P0.5        、PHR-9 、EHR-10、XHP-8 、SHR-02V-S、SWPT-001T-P025、SZF-01T-P0.7、GHR-04V-S、SLC-22T-2.0、SHIM-01T-P0.5、PALR-03V、XHP-9 、SGHD-002GA-P0.2、04CZ-6H、PARP-02V 、SHIF-01T-P0.5、HRP-04-S 、XAP-03V-1、RA-SC1290、PHR-5-BK、SYM-41T-P0.7、XMAS-03V-S 、ZHR-9、PHR-4-BK、SZM-41T-P0.7 、PNIS-02V、SVF-61T-P2.0、XMAS-04V-S、SVM-61T-P2.0 、SMP-02V-BC、H3P-SHF-AA、HLS-03V、GHR-02V-S、SMR-02V-N、VHR-4N、VHR-5N、SHR-10V-S-B、H4P-SHF-AA、GHR-06V-S 、PHR-4-R、SVT-41T-P1.1 、XAP-04V-1、SHR-04V-S-B 、PHR-11、HRP-06-S 、PAP-03V-S、XAP-05V-1、SMR-03V-B、VAR-2 、ZHR-10、SVM-42T-P2.0、VHR-6N、XHP-13 、SWPJT-21T-P0.5、PNIS-03V 、SVF-81T-P2.0、ZHR-7 、PHR-13、PNIRP-03V-S、ZLP-02V、HRP-08-S 、03HR-6S-P-N、SHR-14V-S-BSHR-05V-S、PHDR-16VS、PHDR-20VS、PAP-05V-S        、EHR-14 、SACHL-003G-P0.2、PHR-12 、PNIRP-04V-S、SHR-05V-S-B、VHR-7N 、PNIS-06V、02SUR-32S、PNIRP-02V-S、SHR-06V-S-B、PALR-04VF、XAP-14V-1、PALR-05VF、PAP-06V-S 、PHR-14、ADHR-03V-H 、ELP-02V 、SWPJR-21T-M0.5A、SHR-06V-S
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表