当前位置:首页 > 公众号精选 > 嵌入式大杂烩
[导读]星标「嵌入式大杂烩」,一起进步!来源:www.cnblogs.com/autosar/archive/2012/06/22/2558604.html状态机模式是一种行为模式,在《设计模式》这本书中对其有详细的描述,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式...





状态机模式是一种行为模式,在 《设计模式》这本书中对其有详细的描述,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实需要一番考虑。


近日在看了一个开源系统时,看到了一个状态机的实现,也学着写了一个,与大家分享。


首先,分析一下一个普通的状态机究竟要实现哪些内容。


状态机存储从开始时刻到现在的变化,并根据当前输入,决定下一个状态。这意味着,状态机要存储状态、获得输入(我们把它叫做跳转条件)、做出响应。


如上图所示,{s1, s2, s3}均为状态,箭头c1/a1表示在s1状态、输入为c1时,跳转到s2,并进行a1操作。


最下方为一组输入,状态机应做出如下反应:


当某个状态遇到不能识别的输入时,就默认进入陷阱状态,在陷阱状态中,不论遇到怎样的输入都不能跳出。


为了表达上面这个自动机,我们定义它们的状态和输入类型:


typedef int State;
typedef int Condition;

#define STATES 3   1
#define STATE_1 0
#define STATE_2 1
#define STATE_3 2
#define STATE_TRAP 3

#define CONDITIONS 2
#define CONDITION_1 0
#define CONDITION_2 1
在嵌入式环境中,由于存储空间比较小,因此把它们全部定义成宏。此外,为了降低执行时间的不确定性,我们使用O(1)的跳转表来模拟状态的跳转。


首先定义跳转类型:


typedef void (*ActionType)(State state, Condition condition);

typedef struct
{

State next;
ActionType action;
} Trasition, * pTrasition;
然后按照上图中的跳转关系,把三个跳转加一个陷阱跳转先定义出来:


// (s1, c1, s2, a1)
Trasition t1 = {
STATE_2,
action_1
};

// (s2, c2, s3, a2)
Trasition t2 = {
STATE_3,
action_2
};

// (s3, c1, s2, a3)
Trasition t3 = {
STATE_2,
action_3
};

// (s, c, trap, a1)
Trasition tt = {
STATE_TRAP,
action_trap
};
其中的动作,由用户自己完成,在这里仅定义一条输出语句。


void action_1(State state, Condition condition)
{
printf("Action 1 triggered.\n");
}
最后定义跳转表:


pTrasition transition_table[STATES][CONDITIONS] = {
/*      c1,  c2*/
/* s1 */
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

电感是导线内通过交流电流时,在导线的内部及其周围产生交变磁通,导线的磁通量与生产此磁通的电流之比。电感器也叫电感线圈,是利用电磁感应原理制成的,由导线在绝缘管上单层或多层绕制而成的,导线彼此互相绝缘,而绝缘管可以是空心的...

关键字: 电感 磁通量 电感器

根据交通运输部水运科学研究院提出的智慧港口的概念,智慧港口是利用新一代信息技术,将港口相关业务和管理创新深度融合,使港口更加集约、高效、便捷、安全、绿色,创新港口发展模式,实现港口科学可持续发展。

关键字: 智慧港口 信息技术 业务

近年来,世界主要汽车大国纷纷加强新能源汽车战略谋划、强化政策支持、完善产业布局,新能源汽车已成为全球汽车产业转型发展的主要方向和促进世界经济持续增长的重要引擎。2021年,全国新能源汽车实现产量354.5万辆,销量352...

关键字: 新能源 汽车 引擎

2007-2021年,全球针状焦行业专利申请人数量及专利申请量总体呈现增长态势。虽然2021年全球针状焦行业专利申请人数量及专利申请量有所下降,但是这两大指标数量仍较多。整体来看,全球针状焦技术处于成长期。

关键字: 针状焦行业 专利申请人 增长态势

按企业主营业务类型分,我国智能家居行业竞争派系可分为传统家电企业、互联网企业以及其他企业三派。传统家电企业代表有海尔智家、美的集团、格力电器等,具有供应链和销售渠道,制造能力和品牌优势突出;互联网企业代表有小米集团、百度...

关键字: 智能家居 互联网企业 供应链

军工电子是集红外技术、激光技术、半导体及嵌入式技术与虚拟仿真技术为一体的综合性军工技术体系,是国防信息化建设的基石。军工电子行业包含在军工行业内,专注于军工行业电子产品布局。根据其军工产品的不同可分为卫星导航、通信指挥、...

关键字: 军工电子 嵌入式技术 信息化建设

我国汽车零配件行业细分种类众多,从汽车零配件主要产品来看,发动机系统行业内有潍柴动力、华域汽车等主要从业企业;在车身零部件领域内,福耀玻璃、中策橡胶具有一定的规模优势;行驶系统领域内有中策橡胶提供的轮胎以及华为等企业提供...

关键字: 汽车零配件 发动机 行驶系统

茶饮料是指以茶叶或茶叶的水提取液、浓缩液、茶粉(包括速溶茶粉、研磨茶粉)或直接以茶的鲜叶为原料添加或不添加食品原辅料和(或)食品添加剂,经加工制成的液体饮料。根据国家标准《茶饮料(GB/T 21733-2008)》的规定...

关键字: 茶饮料 茶叶的水 食品添加剂

全球液压行业专利技术在21世纪初得到初步发展,这一时期液压专利申请人数量和申请量处于较低水平。2011-2012年,液压行业专利技术的发展总体处于成长期,2012年以后中全球液压行业专利技术申请量或申请人数量整体处于波动...

关键字: 液压行业 专利授权 技术类型

从上市企业的总市值情况来看,2022年7月28日,中芯国际、紫光国微和韦尔股份总市值遥遥领先,中芯国际总市值达到3238.21亿元,紫光国微总市值达到1358.77亿元,韦尔股份总市值达到1277.07亿元;其次是兆易创...

关键字: 上市企业 集成电路 行业

嵌入式大杂烩

461 篇文章

关注

发布文章

编辑精选

技术子站

关闭