【解析新特性】300W单路输出工业电源>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 大家现在应用单片机,【状态机】技术有用上?

共6条 1/1 1 跳转至

大家现在应用单片机,【状态机】技术有用上?

助工
2019-09-30 22:04:41    评分

大家晚上好!

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

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

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




关键词: 状态机     单片机     软件     嵌入式     CML    

助工
2019-09-30 22:11:41    评分
2楼
状态机是一种设计模式,是抽象的思维,不是某个框架或工具。
面向对象编程思想和状态机一样,也是抽象的,写面向对象的书也都是很多年前的了。



助工
2019-09-30 22:16:36    评分
3楼


1状态机与RTOS没有关系。
2.我编程10多年,就两招,状态机与软件分层,到现在为止几乎满足我的所有需求。(可能我做的东西比较简单)
3.点LED、也可以使用状态机,分2个状态,STA_ON  STA_OFF
4.KEY都可以使用状态机,分按下、按下消抖、抬起、抬起消抖等状态。

5.我的状态机都是通过enum定义状态常量,然后通过switch case还实现的。上面有人说(想想自己到目前为止,还是只用 switch case,未曾用过高大上的状态机。)   其实你用的就是状态机的思想,只是 你没有意识到而已。


心中有状态,下笔如有神!!!



助工
2019-09-30 22:20:12    评分
4楼

我觉得就是有限状态机的辅助设计软件入门门槛太高,所以现在用状态机的人不多

要是弄得像思维导图这么简单容易上手就比较好推广这种设计思路了。


工程师
2019-09-30 22:27:31    评分
5楼

状态机,还是挺有用的,比如:如下是我经常用在串口接收和处理上:


//--------------------------------------------------

//串口1发送一串数据

//--------------------------------------------------

void uart1sendframe(U8 s[],U8 size)//发送一帧

{

        idata U16 i;

        idata U8 chk=0;


        uart1_sendbyte(0xAA);                          //开始

        uart1_sendbyte(size);                        //消息长度

        chk=0x55+size;

        for(i=0;i<size;i++)                                //数据区

        {

                chk=chk+s[i];                                   //计算校验和                

                uart1_sendbyte(s[i]);

        }

        uart1_sendbyte(chk);                        //校验

}

//--------------------------------------------------

//模拟串口1中断

//--------------------------------------------------

void uart1_mint(U8 ud)

{

        switch(uart1state)

        {

                case 0://起始码0

                        if(ud==0XAA)                        

                        {

                                uart1state++;

                                uart1chk=ud;//从第1字节开始计算校验

                        }

                        break;

                case 1://帧长

                        uart1size=ud;//计录数据长度

                        uart1chk+=ud;//计算校验

                        uart1rec=0;

                        uart1state++;                        

                        if(uart1size>UARTBUFSIZE)

                        {

                                uart1state=0;

                        }

                        else if(uart1size==0)

                        {

                                uart1state++;

                        }

                        break;        

                case 2://数据

                        uart1buf_rx[uart1rec]=ud;

                        uart1chk+=ud;                //计算校验

                        uart1rec++;                        //接收数据计数

                        if(uart1rec>=uart1size)

                                uart1state++;

                        break;

                case 3://校验

                        if(ud==uart1chk)

                        {

                                uart1_proc();//帧数据处理        

                        }        

                        uart1state=0;

                        break;        


                default:

                        uart1state=0;

                        uart1tick=0;

                        break;

        }

}



助工
2019-09-30 22:31:11    评分
6楼
想想自己到目前为止,还是只用 switch case,未曾用过高大上的状态机。
是不是 low 了点。



共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]