嵌入式开发工程师必备有限状态机
有限状态机示意图(FiniteStateMachines)图片来源:flaviocopes。com
作者PeterGalan
获取有关使用C语言为嵌入式系统的有限状态机进行编程的帮助。
有限状态机(FSM)的定义是:描述特定(逻辑)过程的一系列事件和动作的数学模型。在工程实践中,你可以找到无数类似的过程,从简单的通过几个按钮控制电机的FSM,到可以监控非常复杂的生产制造过程或航天飞机的复杂FSM系统。
我曾经为广泛应用于光通信领域的掺铒光纤放大器(EDFA)设计过固件。一个固件部分必须处理EDFA的安全问题,如果设计不当,EDFA可能会使用对人体有害的强激光。这似乎是一个常规的FSM代码设计,但其结果却是一个非常复杂的、难以遵循和维护的冗长过程。需要一种不同的方法来实施FSM,这可能会引起嵌入式代码设计者的兴趣。
有限状态机理论
根据有限状态机理论,你可能会想起两种类型的FSM表示,一种是Mealy有限状态机,另一种是Moore有限状态机。这两类FSM都处理三组变量,一组输入变量X(k),一组内部状态U(k)和一组输出变量Y(k)。这两类FSM使用相同的转换函数来映射UxX
Mealy和MooreFSM的区别在于用于输出状态的第二个映射函数。Mealy的输出状态映射函数表示UxXY映射,而Moore表示一个更简单的映射,从UY。从实现的角度来看,虽然MooreFSM可能更简单,但MealyFSM也有其优势。例如,与内部状态的数量相比,它可以有更多或不同的输出状态,而在MooreFSM中,每个内部状态都与一个输出状态相关联。
通用的MealyFSM可用下面的表格来表示:
其中uk列表示当前的内部状态,xk行表示当前的输入状态。表格显示下一个内部状态(映射)和相应的输出状态(映射)。
图1:单级EDFA安全状态图。
图1显示了FSM另一种更常见的表达形式,即状态图。你可以看到一个完整的单级EDFA安全序列状态图。
每个EDFA使用一个或两个(更常见的两级EDFA)激光泵,将能量提供给EDFA内的特殊光纤线圈。通过放大器,该能量从上一个节点传输到下一个节点的光信号(光子)放大。当连接EDFA和其它节点的光纤断开并且检测到信号丢失(LOS)时,就会出现问题。这种情况必须立即处理,激光功率必须降低或完全切断。其它情况也需要立即关注。整个安全序列是EDFA固件实施的一部分。
FSM的基本实施
实现有限状态机(通常用于嵌入式控制软件),最好的编程语言是什么?答案可能是C语言。还有许多其它更现代的、面向对象的编程语言,但C语言就像嵌入式系统的母语言。一个经验丰富的嵌入式软件设计师,如何在C语言中实现这种FSM?它很可能从这样一个函数开始:
如果查看上面的代码,您可以看到条件(事件标志组合)如何在满足条件的情况下,将currState变量从初始、禁用状态移动更改为下一个状态。每次这样的内部状态变化,都会触发一个特定动作,在某些情况下,输出状态会触发多个动作。
到目前为止一切都还正常进行,但随着整个过程变得更加复杂,ifelse决策语句也变得更加复杂(而且嵌套更深)。然后,如果需要修改任何ifelse决策语句,它可能会影响诸多其它语句。接下来,整个处理功能将需要反复测试。两级EDFA需要两个类似的FSM功能,再加上另一个控制ADFA放大器的FSM功能,需要做很多工作。
改进FSM的实现
还有另一种方法来表达有限状态机:通过状态转换表(STT)来实现。STT是MealyFSM描述的另一种形式。这样的表通常有四列,行数根据需要确定。每行描述从当前状态到下一状态的转换。转换由事件(一个或多个事件标志的组合)触发。该动作描述了与转换相关的所有动作。例如,如下是一个STT(只是它的片段),对应于图中所示的状态图。
为什么这样的表示比状态图更好?因为它可易于实现。下面,来看看如何用C语言来实现。
一位经验丰富的软件设计师,会将FSM代码拆分成几个源文件,并从FSMexample。h头文件开始,其中包含特殊类型的定义和所有函数的原型。下面是此类头文件的一个示例。
对于经验不足的程序员来说,前两个定义可能值得解释。每个函数定义一个特定函数指针的名称。在C中,这些定义与使用delegate关键字的定义相同。它们是C语言编程中非常强大的工具,使C程序能够像使用C这样面向对象的编程语言,更方便地编写程序。除了最后一个函数外,其它所有函数都应该非常清楚。一类是FFSMEVENTT类型的函数,它们用于测试某些系统状态(标志),并返回true或false。请注意IsLosON()和IsLosOFF()等成对的函数。在这种特殊情况下,只需测试一个:通过硬件(HW)报告的状态标志,来测试输入信号的丢失。如果检测到信号丢失,此函数将返回true,否则将返回false。第二个函数只是一种封装器,它调用第一个函数并返回一个否定的结果。
这里定义的第二类函数是FFSMACTIONT类型。这是动作功能,它们控制(打开或关闭)微控制器所需的内部外部设备或一些HW电路,整个嵌入式系统由这些电路组成。
无论FSM如何实现,都需要这两类功能,例如状态图过程或STT实现。现在,FSMsstKernel()函数是一个新功能。它取代了实现函数FSMstage1()的状态图。它处理STT类型的数据。这些数据被定义为SFSMSTTT类型,并作为FSMsstKernel()函数的参数。由于FSMsstKernel()需要修改至少一个数据项,因此必须将其作为指向SFSMSTT类型数据的引用指针。
图2:单级EDFA安全状态图模拟。
FSMsstKernel()所做的事情非常简单。它在SFSMROWT类型的行(数组元素)中循环,并查找presentState与当前内部状态currentState相同的行。如果找到这样的行,将调用其对应的事件测试函数,并将它们的返回值anded放在一起,以确定是否满足了移动到下一个内部状态的条件。但有个限制,只能将两个逻辑值anded加在一起。如果需要更多个,则需要通过另一个FFSMEVENTT类型的事件,来扩展SFSMROWT数据结构。如果内部状态之间的转换,必须将条件事件ored放在在一起,那又如何处理呢?每个事件(或它们anded的组合)必须在单独的、但在其它方面相同的行中提供。
然后,FSMsstKernel()继续(如果瞬态条件满足)启动在行数据中找到的动作。最后,它将行的nextState复制到stt的currentState。
如果我想使用FSMsstKernel()来处理更多STT行数截然不同的FSM,该怎么办?必须定义ROWMAX常量,以满足最长的STT,但最好的解决方案是用行的链接列表替换行数组。然后,每个SFSMSTTT型数据,将使用一个最佳内存空间。然而,一些简单的嵌入式系统,不支持动态分配内存空间。
现在,在FSMsstKernel()中取消对这两个printf()语句的注释,可以看到FSM是如何从当前状态发展到下一个状态的。这显然不适用于嵌入式系统,但整个代码可能会在PC机上进行测试,例如在MicrosoftVisualStudio中。
完成和编译
一旦FSMexample。h和FSMexample。c完成后(甚至可以编译它们并创建对应的。obj文件),就可以将它们添加到应用程序中。在另一个源文件中,需要创建STT表。这意味着首先定义STT的每一行,最后定义STT本身。然后可以调用FSMsstKernel()函数。您很可能会在FW应用程序的main()函数中,将其作为后台任务之一调用。您可以定义更多这样类似SFSMSTTT变量,并调用FSMsstKernel()来引用它们。
为了更好地可视化,请在MSVisualStudio下的PC上编写以下源文件:
在编译和运行程序(以及FSMexample。h和FSMexample。cpp)时,如果FSMsstKernel()中的两个printf()语句并未注释掉,您应该会看到如图2所示的结果。
关键概念:
检查有限状态机的基本实现。
考察有限状态机实现的改进。
思考一下:
如果通过一种不同的方法来实施有限状态机?
一批创业者被雷军误导把公司做死了雷军的2022年度演讲不出意外地火了。他几段至暗时刻在朋友圈刷屏:金山从死到生的故事,卓越网从生到死的故事当下这个艰难时刻,几碗甜鸡汤特别能鼓舞人心:连雷军这样的老……
解决黑头小妙招小芙知道,很多仙女宝宝之所以喜欢做皮肤清洁,主要想清除鼻子上的黑头,一段时间不清洁,就会出现很多,影响美观,那黑头到底是什么,为什么总是会反反复复出现?这期听小芙慢慢道来……
苹果市值一日飙升近2000亿美元,上一次这样涨还是十几天前北京时间11月11日凌晨,美股三大指数收涨,道指涨3。69,纳指上涨7。34,标普500指数涨5。53,各板块普涨。受大盘的影响,很多科技公司的市值也有了较大幅度的升值,比如A……
深度分析下一轮牛市最为看好的几个币种(1)linkB圈可以没有ETH,但不能没有link。期待的:Build:持有link质押,可以获得生态新项目代币。想象一下2017年牛市拿eth可获得山寨币……
几块钱一瓶的维生素B6,竟可以摆平牛皮癣,了解下在B族维生素的大家庭中,维生素B6是非常重要的一个成员,它是一种水溶性的维生素,在多种食物中都天然含有。维生素B6对人体的作用小小的维生素B6虽然不起眼,但在人体内……
心理365你相信眼见为实吗?AI人工智能真是什么都能干了哈。现在它可以去伪造视频,也就是说我可以说一段话,然后拍一个视频,然后通过人工智能的技术就可以把这段话变成奥巴马在说,或者是范冰冰在说,或者是随便一……
肝气一堵疾病似虎,分享4种疏肝理气的中成药,建议收藏肝气一堵,疾病似虎!大家好,我是屈医生,今天给大家分享4种疏肝理气的中成药,文章最后再给大家分享一个疏肝的经络,建议收藏,学会了全家受用。中医认为肝主疏泄,主生殖肝可以调……
心美,世界才美心美,你的语言就美。说话文明有礼仪,言语温和可亲。心美,你的行为就美。举止文雅,助人为乐,善行善举。心美,你的待人处事才美。待人接物和蔼可亲,处事……
快船官宣伦纳德!湖人好事连连,库里喜获殊荣,字母哥情商真的高NBA常规赛比赛样本数量已经足够多,也足以支撑不少观点。有的球队或许本赛季一直就这样了,有的球队只是磨合出现问题,他们后期还会有反弹的机会。也就是说,各支球队有各支球队的问题以……
读完基督山伯爵,明白了三个道理,最后一个让人豁然开朗文牧心图来源网络,与文无关,侵删人生的路漫长而曲折。常常有困难、诱惑和选择摆在人们的面前。有的人活得痛苦与绝望,有的人却活得自在。大仲马在这本著作……
爱是什么,爱是缘分,亦是珍惜这世间最好的爱情,应该是既能两两相吸,又能两两相惜。爱情,是红尘里最美的情感,是人生不可或缺的精神需要和心灵寄托。因为有爱,尘世间的饮食男女才会相依相恋。爱情,本是……
23张显微镜下的美轮美奂神奇微观世界图在显微镜下,由氧化铜组成的矿物质赤红石的晶体鹈鹕的电子显微镜图像(一种充满空气的中空骨,是鸟类的典型特征)通过电子显微镜看到的蛆虫显微镜下宝石甲虫眼睛附近的区……
40岁来临前,给你11条改变人生的建议有人说,40岁是一扇门,分出了人生的两个阶段。此前的生活里,奔波和忙碌是永远的主旋律。到了下半场,取舍和进退成了要紧的话题。所谓四十不惑,不是什么都知道,而是……
人生不免走弯路弯路不免会走,但经历切肤之痛后我们就学精了(首发于www。qiqixie。com)这个周末,我太太,曼达去海边儿跟朋友度假了。头头则去参加他一个同学的婚礼。这家里就剩我一……
洗缩水的毛衫,真能恢复如初吗?软糯的羊绒衫,暖身的毛衣,绝对是冬日衣橱里的主角,然而,一个不小心洗错了,M变成XS的惨剧就这样发生了。不过近来市面上开始出现一些还原神器专门给洗缩水了的毛衫等羊毛羊绒制……
英特尔追赶先进制程脚步,Intel18A提前至2024下半年处理器龙头英特尔在IEDM2022(2022IEEE国际电子零件会议)展示最新技术蓝图时,表示保持快速步伐,不仅走在正轨,未来还要加速交货。随着不断缩小的硅与物理量子效应冲击,……
朝阳浪马轮胎抢抓机遇创新实干以优良业绩回报家乡人民非常感谢市委、市政府!最艰难时期已经过去,企业生产经营正有序恢复,浪马人决不辜负市委、市政府的关心、关怀和期待,定以优良业绩回报家乡人民!日前,朝阳浪马轮胎有限责任公司董事长李……
澳华内镜研究报告AQ300上市,对比奥巴和澳华(报告出品方作者:华创证券,郑辰,李婵娟,万梦蝶)一、解密奥林巴斯内镜王者之路(一)奥林巴斯从多元化发展路径到以医疗为核心的瘦身转型奥林巴斯1919年成立,以显微镜……
150亿公里外!我国公布航天四大目标,追赶美国中国航天深空探测大动作来了!目标定在150亿公里外,我国航天太强了!探月自从嫦娥五号探测器将月球样本带回来后,我国的探月工程就暂时修整了。不过,第四期探月工程即将展……
暴雪出轨是一种习惯暴雪和网易,终于还是分手了。时隔13年,熟悉的剧情再度重演:同样的更换代理,同样的国区停服。到明年1月24日,包括《魔兽世界》《炉石传说》《守望先锋》等暴雪旗下的一……
老了脑子越来越不灵活,这些加速大脑衰老的习惯你中招了吗?正如你所知道的那样,随着年龄增长,脑力或多或少地会有所下降,智力下降、记忆力减退是正常的现象。所以理所应当的认为人老了大脑也就是老了,实际上大脑的衰老比想象的要来得早。有……
杨迪没收到跨年晚会邀请,谢娜离开湖南卫视,也没在其他平台露面每年到了年末,很多人忙着休假玩乐,娱乐圈艺人却是最忙的时候,因为各种跨年晚会、盛典和演出扎堆,有人气的自然资源好,商机不断,赶场赚钱忙。随着跨年临近,几大卫视以及一些网络……
需求恢复强度橡胶行情紧俏展望2023年,整个产业链的修复要取决于全球经济的恢复。若全球经济持续低迷,尽管终端市场有一定的修复,但是效果也将大打折扣,难有实质性的改观,对于上游天然橡胶的支撑也显得薄弱。……
Reno9系列玩机技巧速览卡片,让桌面即好看又好用!OPPOReno9系列出厂即搭载了非常好用的ColorOS13系统,上面有各种既人性化又实用的功能,之前也和大家详细介绍了快速转移数据以及一些系统上的设置技巧,接下来就正式和大……