搜索
bottom↓
回复: 58

请教,状态机技术不流行了吗?

  [复制链接]

出4375入62汤圆

发表于 2019-9-27 16:58:21 | 显示全部楼层 |阅读模式
本帖最后由 supercoo 于 2019-9-27 17:00 编辑

各位坛友,本人初识状态机,搜索看了很多状态机的应用(还没实际用过)

觉得状态机是个好东西啊,可是不知为何我搜到大部分状态机的资料都是几年前的?   现在状态机技术有什么弊端?  不流行了?

或者相比状态机已经有了更好的技术?   还请路过的坛友不吝赐教

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2019-9-27 17:05:53 | 显示全部楼层
状态机技术不是不流行,而是设计难度太大。现在的产品功能都比较复杂,动不动要设置十几个参数,这要是状态机来表达,排列组合一下这状态数就上天了。

出0入0汤圆

发表于 2019-9-27 17:35:19 | 显示全部楼层
本帖最后由 磊磊映画 于 2019-9-27 17:38 编辑
supercoo 发表于 2019-9-27 17:04
我搜索了一下午,想找点状态机的资料,好多都是很久以前的

还有本坛马老师推荐过的《基于状态机的嵌入式 ...


状态机是一种设计模式, 也是一种编程思想,   不要被  不同人的实现框架限制,表现出 思想就行,建议查查 本坛大神 傻孩子的状态机,尤其是基于函数指针的状态机实现,非常简单。 就实现了流转 切换等。


傻孩子的查不到了,你看下这个,不要管新旧,理解 核心思想就行了
https://www.amobbs.com/thread-3316176-1-1.html

出0入75汤圆

发表于 2019-9-27 19:44:38 | 显示全部楼层
状态机是一种设计模式,是抽象的思维,不是某个框架或工具。
面向对象编程思想和状态机一样,也是抽象的,写面向对象的书也都是很多年前的了。

出0入0汤圆

发表于 2019-9-28 18:33:34 | 显示全部楼层
本帖最后由 jjj 于 2019-9-29 08:42 编辑

1状态机与RTOS没有关系。
2.我编程10多年,就两招,状态机与软件分层,到现在为止几乎满足我的所有需求。(可能我做的东西比较简单)
3.点LED、也可以使用状态机,分2个状态,STA_ON  STA_OFF
4.KEY都可以使用状态机,分按下、按下消抖、抬起、抬起消抖等状态。
5.我的状态机都是通过enum定义状态常量,然后通过switch case还实现的。上面有人说(想想自己到目前为止,还是只用 switch case,未曾用过高大上的状态机。)   其实你用的就是状态机的思想,只是 你没有意识到而已。
心中有状态,下笔如有神!!!

出0入0汤圆

发表于 2019-9-27 17:01:43 | 显示全部楼层
没有啊,一直在用,工业控制里面基于流程分步控制的项目都适用,而且流转起来很方便。经典,没有流行不流行的说法吧,适合项目的就是最好的,以不变应万变

出4375入62汤圆

 楼主| 发表于 2019-9-27 17:04:21 | 显示全部楼层
磊磊映画 发表于 2019-9-27 17:01
没有啊,一直在用,工业控制里面基于流程分步控制的项目都适用,而且流转起来很方便。经典,没有流行不流行 ...

我搜索了一下午,想找点状态机的资料,好多都是很久以前的

还有本坛马老师推荐过的《基于状态机的嵌入式系统开发》,都是10年前的

请教有没有新一点的状态机书籍或者教程推荐?

出0入98汤圆

发表于 2019-9-27 17:07:59 | 显示全部楼层
我觉得就是有限状态机的辅助设计软件入门门槛太高
要是弄得像思维导图这么简单容易上手就比较好推广这种设计思路了

出4375入62汤圆

 楼主| 发表于 2019-9-27 17:11:10 | 显示全部楼层
qq78929709 发表于 2019-9-27 17:05
状态机技术不是不流行,而是设计难度太大。现在的产品功能都比较复杂,动不动要设置十几个参数,这要是状态 ...

嗯,有道理
那像这样复杂的设计现在用什么设计呢

出0入0汤圆

发表于 2019-9-27 17:20:36 | 显示全部楼层
我还是在用状态机 状态机可以实现复杂的逻辑控制任务 环保行业流程控制比较常用  远不是操作系统可以搞定的 有的初学者搞不懂状态机喜欢用操作系统 然后搞的一团糟 因为他们弄不清操作系统到底咋运作的

出0入0汤圆

发表于 2019-9-27 17:31:48 | 显示全部楼层
Athelloren 发表于 2019-9-27 17:20
我还是在用状态机 状态机可以实现复杂的逻辑控制任务 环保行业流程控制比较常用  远不是操作系统可以搞定的 ...

状态机是一种设计模式 跟操作系统有啥关系

出590入992汤圆

发表于 2019-9-27 17:41:11 | 显示全部楼层
买了本状态机的书,结果还只有影印版本,也认为现在:状态机似乎没有那么热了,或者有其它更好的替代,所以一直没有关注了。

出0入0汤圆

发表于 2019-9-27 17:57:04 | 显示全部楼层
状态机一直在用,我们做工控的,不过都是大家默认会使用的,毕竟难的是抽离状态,而不是代码编写。

出40入42汤圆

发表于 2019-9-27 17:57:32 | 显示全部楼层
不是不流行,是太经典了,大家都在用都在学,所以讨论的少

出0入0汤圆

发表于 2019-9-27 18:05:40 | 显示全部楼层
有大师能简单介绍一下状态机的原理吗?以前关心过,一直迷迷糊糊,简单的用跑马灯,液晶屏显示,串口输入几个任务讲一下

出0入0汤圆

发表于 2019-9-27 19:08:09 | 显示全部楼层
我认为,主要是最近几年的硬件发展太快了,32位机已经白菜价,稍微复杂一点的应用可以直接上os了,就没必要去写状态机。状态机适合资源非常少又需要跑好几个任务的场合。

出0入0汤圆

发表于 2019-9-27 19:25:12 | 显示全部楼层
这跟初中物理课本一样 通用的基础知识 翻来覆去好多年 不会有新意了 自然没新题了

出100入101汤圆

发表于 2019-9-27 19:52:28 | 显示全部楼层
某个模块或任务,都可以用状态机架构

出0入0汤圆

发表于 2019-9-27 20:04:53 | 显示全部楼层
状态机实现最基本是实现封装,继承,和多态性的结合,相当于C++的类,再将其和状态机结合成真正意义上的有FSM,这种方式高效安全,但用起来有点怪怪的感觉,因为全部是用强制上下层转换来实现。指来指去好晕
LZ可以看一下C语言的OOP编程。包你可以升天

出0入0汤圆

发表于 2019-9-27 20:12:58 | 显示全部楼层
状态机特别是有限状态机,应用很广很基础,在新的编程思想出来之前,还要广泛使用很多年

出140入8汤圆

发表于 2019-9-27 21:54:16 | 显示全部楼层
枫叶情缘 发表于 2019-9-27 17:57
状态机一直在用,我们做工控的,不过都是大家默认会使用的,毕竟难的是抽离状态,而不是代码编写。 ...


功能业务需求抽离成状态是重点...

出0入0汤圆

发表于 2019-9-27 22:18:24 来自手机 | 显示全部楼层
我一直用状态机,而且运行在OS中,更加好用

出0入0汤圆

发表于 2019-9-27 23:10:11 | 显示全部楼层
本帖最后由 RAMILE 于 2019-9-27 23:11 编辑

你真的渴望状态机的力量吗


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出100入113汤圆

发表于 2019-9-28 07:56:42 | 显示全部楼层
资源少的MCU还常用,资源丰富的基本上RTOS了编程比状态机简单。

出0入0汤圆

发表于 2019-9-28 09:09:39 来自手机 | 显示全部楼层
RAMILE 发表于 2019-9-27 23:10
你真的渴望状态机的力量吗

谢过,我愿意实践实践

出0入0汤圆

发表于 2019-9-28 09:12:48 | 显示全部楼层
调度器:
https://www.amobbs.com/thread-5702323-1-1.html

我的串口数据处理:
  1. //--------------------------------------------------
  2. //串口1发送一串数据
  3. //--------------------------------------------------
  4. void uart1sendframe(U8 s[],U8 size)//发送一帧
  5. {
  6.         idata U16 i;
  7.         idata U8 chk=0;

  8.         uart1_sendbyte(0xAA);                          //开始
  9.         uart1_sendbyte(size);                        //消息长度
  10.         chk=0x55+size;
  11.         for(i=0;i<size;i++)                                //数据区
  12.         {
  13.                 chk=chk+s[i];                                   //计算校验和               
  14.                 uart1_sendbyte(s[i]);
  15.         }
  16.         uart1_sendbyte(chk);                        //校验
  17. }
  18. //--------------------------------------------------
  19. //模拟串口1中断
  20. //--------------------------------------------------
  21. void uart1_mint(U8 ud)
  22. {
  23.         switch(uart1state)
  24.         {
  25.                 case 0://起始码0
  26.                         if(ud==0XAA)                       
  27.                         {
  28.                                 uart1state++;
  29.                                 uart1chk=ud;//从第1字节开始计算校验
  30.                         }
  31.                         break;
  32.                 case 1://帧长
  33.                         uart1size=ud;//计录数据长度
  34.                         uart1chk+=ud;//计算校验
  35.                         uart1rec=0;
  36.                         uart1state++;                       
  37.                         if(uart1size>UARTBUFSIZE)
  38.                         {
  39.                                 uart1state=0;
  40.                         }
  41.                         else if(uart1size==0)
  42.                         {
  43.                                 uart1state++;
  44.                         }
  45.                         break;       
  46.                 case 2://数据
  47.                         uart1buf_rx[uart1rec]=ud;
  48.                         uart1chk+=ud;                //计算校验
  49.                         uart1rec++;                        //接收数据计数
  50.                         if(uart1rec>=uart1size)
  51.                                 uart1state++;
  52.                         break;
  53.                 case 3://校验
  54.                         if(ud==uart1chk)
  55.                         {
  56.                                 uart1_proc();//帧数据处理       
  57.                         }       
  58.                         uart1state=0;
  59.                         break;       

  60.                 default:
  61.                         uart1state=0;
  62.                         uart1tick=0;
  63.                         break;
  64.         }
  65. }
复制代码

出0入8汤圆

发表于 2019-9-28 09:12:57 | 显示全部楼层
想想自己到目前为止,还是只用 switch case,未曾用过高大上的状态机。
是不是 low 了点。

出0入8汤圆

发表于 2019-9-28 09:57:10 来自手机 | 显示全部楼层
比如按键模块中使用状态机,如果在while循环中使用感觉还是不太好,那样的话主程序语句会写得很长!

出0入0汤圆

发表于 2019-9-28 11:34:38 | 显示全部楼层
很欣赏傻孩子的话:心中有状态,无态也有态。

出0入0汤圆

发表于 2019-9-28 13:06:26 | 显示全部楼层
leiyitan 发表于 2019-9-27 21:54
功能业务需求抽离成状态是重点...

同感

出0入0汤圆

发表于 2019-9-28 14:16:55 | 显示全部楼层
状态机只是对抽像事物一种量化的方法吧

出0入8汤圆

发表于 2019-9-29 08:48:20 | 显示全部楼层
jjj 发表于 2019-9-28 18:33
1状态机与RTOS没有关系。
2.我编程10多年,就两招,状态机与软件分层,到现在为止几乎满足我的所有需求。( ...

这个道理我明白。
但我想楼主要的状态机,并不是简单 switch case,
剖析学习一个 FSM 框架,也应该蛮有意思的,至于用不用,那是另外一回事,反正我到现在,从来没用过。

出0入0汤圆

发表于 2019-9-29 09:23:53 | 显示全部楼层
傻孩子板块看一下

出0入0汤圆

发表于 2019-9-29 09:43:16 | 显示全部楼层
怎么会没有用,你看连QT都提供了一套statemachine框架。

出190入0汤圆

发表于 2019-9-29 10:12:53 | 显示全部楼层
状态机的使用难点不是状态机本身,而是把如何状态抽象出来

出0入59汤圆

发表于 2019-9-29 15:19:52 | 显示全部楼层
都已经融入日常了,不需要特意提了

出0入0汤圆

发表于 2019-9-29 15:31:02 | 显示全部楼层
能用状态机实现的全部只用状态机实现

出425入0汤圆

发表于 2019-9-29 15:41:25 | 显示全部楼层
本帖最后由 guolun 于 2019-9-29 15:48 编辑

如果我离开QP框架,我都不会编程了。

出0入25汤圆

发表于 2019-9-29 23:14:04 来自手机 | 显示全部楼层
软件开发有本好书:设计模式,可能论坛里大多不是计算机科班出身的。

出10入12汤圆

发表于 2019-9-29 23:16:45 | 显示全部楼层
基本处于基本技能了吧……
USB、IDE、SATA什么的都是一大把状态机

出0入0汤圆

发表于 2019-9-30 08:58:14 | 显示全部楼层
不错,时间片轮询的道理也类似

出0入91汤圆

发表于 2019-9-30 09:01:57 | 显示全部楼层
FPGA 写逻辑控制 现在主流的还是状态机吧

出4375入62汤圆

 楼主| 发表于 2019-9-30 09:04:01 | 显示全部楼层
lswood 发表于 2019-9-29 23:14
软件开发有本好书:设计模式,可能论坛里大多不是计算机科班出身的。

请教书的详细信息?

出10入210汤圆

发表于 2019-9-30 09:06:14 | 显示全部楼层
security 发表于 2019-9-28 09:12
想想自己到目前为止,还是只用 switch case,未曾用过高大上的状态机。
是不是 low 了点。 ...

if
else if

也不错。

出0入8汤圆

发表于 2019-9-30 09:07:48 | 显示全部楼层
supercoo 发表于 2019-9-30 09:04
请教书的详细信息?

《设计模式:可复用面向对象软件的基础》
不过这本书可能过于枯燥了,这本是鼻祖。
市面上有一大把对应的书籍,先看其他的。

出0入8汤圆

发表于 2019-9-30 09:13:12 | 显示全部楼层

好吧,一路 low 到底,直接坐在鄙视链的的地板上吧。

出0入0汤圆

发表于 2019-9-30 15:12:19 | 显示全部楼层
适用的就是最好的,没啥过时的东西。

出0入0汤圆

发表于 2019-9-30 20:41:35 | 显示全部楼层
kenson 发表于 2019-9-27 20:04
状态机实现最基本是实现封装,继承,和多态性的结合,相当于C++的类,再将其和状态机结合成真正意义上的有F ...

C的oop 编程  有什么书或者资料推荐吗

出0入0汤圆

发表于 2019-9-30 20:46:49 | 显示全部楼层
状态机是编程必须要掌握的,非常经典.

出0入0汤圆

发表于 2019-9-30 21:24:22 | 显示全部楼层
贝塔 发表于 2019-9-30 20:41
C的oop 编程  有什么书或者资料推荐吗

当然是QP
http://www.state-machine.com/qpc/exa.html

出0入0汤圆

发表于 2019-9-30 21:27:31 | 显示全部楼层
kenson 发表于 2019-9-30 21:24
当然是QP
http://www.state-machine.com/qpc/exa.html

全英文哈  看着有点压力

出0入0汤圆

发表于 2019-9-30 21:35:42 | 显示全部楼层
贝塔 发表于 2019-9-30 21:27
全英文哈  看着有点压力

他有中文的,只不过翻译的好垃圾

出0入0汤圆

发表于 2019-9-30 21:49:33 | 显示全部楼层
技术无关流不流行  适用就好

出0入0汤圆

发表于 2019-9-30 23:20:53 | 显示全部楼层
本帖最后由 RAMILE 于 2019-9-30 23:21 编辑
kenson 发表于 2019-9-30 21:35
他有中文的,只不过翻译的好垃圾


有个网友实在看不下去,自己重新翻译一遍放网上下载,这个版本里面已经没有量子物理的比喻了

我买了一个打印版的,看了一遍翻译的挺不错,然后扔架子上吃灰

出0入147汤圆

发表于 2019-10-1 07:21:11 来自手机 | 显示全部楼层
不是不流行,而是你接触不到,比如在汽车电子领域,广泛使用Simulink图形化编程,其中的StateFlow就是很重要的一个组件

出0入0汤圆

发表于 2019-10-1 08:51:40 | 显示全部楼层
RAMILE 发表于 2019-9-30 23:20
有个网友实在看不下去,自己重新翻译一遍放网上下载,这个版本里面已经没有量子物理的比喻了

我买了一个 ...

是吗?可否给个链接?

出0入0汤圆

发表于 2019-10-1 08:55:06 | 显示全部楼层
这个翻译者绝对是用机械来翻译的,他把自己的联系方式就关闭了,就怕人找他麻烦。

出0入4汤圆

发表于 2019-10-8 13:07:06 | 显示全部楼层
RAMILE 发表于 2019-9-30 23:20
有个网友实在看不下去,自己重新翻译一遍放网上下载,这个版本里面已经没有量子物理的比喻了

我买了一个 ...

层主,有没有翻译比较好的这个版本的链接,一直想学学这个,谢谢了!

出0入0汤圆

发表于 2019-11-15 15:06:35 | 显示全部楼层
dreampet 发表于 2019-10-1 07:21
不是不流行,而是你接触不到,比如在汽车电子领域,广泛使用Simulink图形化编程,其中的StateFlow就是很重 ...

第一次知道这种图形化开发STM32
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 12:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表