搜索
bottom↓
回复: 34

谁能详细的讲述一下状态机程序与单片机普通程序的区别。

[复制链接]

出0入21汤圆

发表于 2008-7-25 13:10:27 | 显示全部楼层 |阅读模式
.

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

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2008-7-25 13:36:43 | 显示全部楼层
不好说,状态机程序也属于单片机普通程序。只是处理上不用死等,做个状态标志。每次循环执行时根据状态情况执行相应的处理。

出0入21汤圆

 楼主| 发表于 2008-7-25 14:32:00 | 显示全部楼层
这样将会引入大量的标志位,那程序的可读性就不好了。

出0入0汤圆

发表于 2008-7-25 16:22:26 | 显示全部楼层
不是位,是字节或字。每个数值代表一种状态。

出0入0汤圆

发表于 2008-7-25 21:44:59 | 显示全部楼层
状态机只是一种思考问题,控制/组织程序流程的方法!

出0入0汤圆

发表于 2008-8-8 17:21:15 | 显示全部楼层
WIndows程序设计就是有限状态机的典型应用,基于消息的驱动模型,然后根据消息改变状态,并将状态以消息输出

出0入0汤圆

发表于 2008-9-9 12:05:42 | 显示全部楼层
单片机编程中,用状态机思维挺好的;不像我们在书上学的那样,在键盘扫描和远程通讯时,经常用到延时函数,使得CPU效率很低;状态机思想很好的解决CPU等待时间过长的缺陷,提高了效率。

出0入4汤圆

发表于 2008-9-9 12:13:31 | 显示全部楼层
可读性是回降低,

出0入0汤圆

发表于 2008-9-9 12:45:51 | 显示全部楼层
状态机最不好的地方就是全局变量。

本人不喜欢全局变量了。
能不用就尽量不用,
能少用就尽量少用。

更喜欢基于事件的简单调度系统。

出0入0汤圆

发表于 2008-9-9 13:58:13 | 显示全部楼层
可读性是会降低一些,但如果你技术过硬的话,可以用些巧妙的方法把代码写得很漂亮很有可读性.
switch (status){
case STATUS_A:   {                }
case STATUS_B:   {                }
case STATUS_C:   {                }
case STATUS_D:   {                }
}

代码写在右边的括号里,很工整.

出0入0汤圆

发表于 2008-9-9 14:15:35 | 显示全部楼层
谁也不稀饭吃饱了撑的没事做状态鸡玩,一次处理能做完所有的任务当然最好。
但问题是有时会碰到不用状态鸡就绕不过去的坎,最典型的就是从键盘接收字符串命令。每接收到一个字符就是一种状态,得边收、边解析、边判断下一步该做什么(进入到哪一种状态)。
大家熟悉的LED扫描显示也是一种状态鸡,要把时间平摊给各个状态,才能让眼睛享受到一幅均匀的显示图案。

出0入0汤圆

发表于 2010-10-4 17:55:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-6 11:55:27 | 显示全部楼层
状态机是必不可少的,即便是多任务小OS后也还是不能省.

出0入0汤圆

发表于 2010-10-7 17:38:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-7 17:51:31 | 显示全部楼层
标记

出0入0汤圆

发表于 2012-2-24 16:41:07 | 显示全部楼层
状态机程序也是单片机程序,都能运行。不同的地方在于,状态机是一种高屋建瓴的思维模式去解决问题的。而普通的教材一般都是以读者能理解为目的编写的,相比下,状态机就比较高深了。状态机是一种思维模式,是一种思想。弄复杂的系统就需要这个东西了。

出0入0汤圆

发表于 2012-2-26 16:27:00 | 显示全部楼层
switch case语句有那么复杂么? ...

出0入0汤圆

发表于 2013-7-13 16:43:11 | 显示全部楼层
mark      

出0入0汤圆

发表于 2013-7-13 23:08:25 来自手机 | 显示全部楼层
本帖最后由 coleyao 于 2013-7-13 23:22 编辑

有时一个函数的执行会妨碍其它函数的实时性,如主循环体中有A和B两个函数,A为输入,B为输出,若B是显示函数,要求刷新周期小于5毫秒,而A的检测周期为10毫秒,若AB顺次执行,则显然B的刷新达不到要求,此时将A拆分成n个状态A1,A2……An,则A1,B……An,B每一个的时间可小于5毫秒,这样就提高了B的实时性,当然这样就降低了A的实时性,单片机程序是对时间空间资源的分配,大多场合都是可以这样用的,如果还不满足实时性要求,就只能变更单片机的时空资源了,如改主频和内部结构,如果这些资源不变的前提下通常用状态机写的程序实时性要优于顺次执行结构。

出5入42汤圆

发表于 2013-7-14 02:32:21 来自手机 | 显示全部楼层
楼上讲的浅显易懂 谢谢

出0入0汤圆

发表于 2013-7-14 06:32:28 | 显示全部楼层
的确状态机不会像刚开始接触到的一般程序那样傻等

出0入0汤圆

发表于 2013-7-27 20:35:30 | 显示全部楼层
int /* No use */
Entry_DesktopUI( /* DesktopUI的入口函数 */
        void *argv /* 没有用,reserved */
)
{
        SYS_MSG        *pMsg, Msg;
        int status = 0;
        T_UIStatus_t *pUIStatus = NULL;
        int oldState = 0;

        DESK_MSG(("Enter DesktopUI msg loop...\r\n"));
        /*
         * System initialize
         */
        __InitDeskStatus(&pUIStatus, DESK_ITEMS_NUM);

        TimerInit();
        SysQueueInit();
        GUIInit();
        //SysStatusInit(); // move to SysPM_UserPowerDownMode by hua, 2008.7.3
        //WMClient_Start(100,g_SysStatus.sysConfig.RFID,g_SysStatus.sysConfig.RFChanel);
        pMsg = &Msg;
        // auto generate INITIAL event
        pMsg->CMD = SYS_EVENT_INITIAL;
        pMsg->OP1 = 0;
        status = SysQueueSend((const SYS_MSG *)pMsg);
//        DESK_CheckError(status, "SysQueueSend");
        for(;;)
        {
                // get message from lowlevel driver
                status = SysQueueRecv(pMsg);
        //        DESK_CheckError(status);
        //        DESK_MSG("State=0x%x\r\n", gs_DeskStatus.enState);
                if ((0 == status) && (pUIStatus->pStateFuncs[pUIStatus->enState] != NULL))
                {
                        pUIStatus->enState = pUIStatus->pStateFuncs[pUIStatus->enState](pMsg, pUIStatus);
                        if (oldState != pUIStatus->enState)
                        {
                        //        DESK_MSG(("\r\nDesk new state:"));
                        //        UI_Pub_PrintNum(pUIStatus->enState, 0);
                                oldState = pUIStatus->enState;
                        }
                }               
        }
        //__UninitDeskStatus(pUIStatus);
}

出0入0汤圆

发表于 2013-7-29 10:15:36 | 显示全部楼层
学习了,谢谢

出0入0汤圆

发表于 2013-7-29 10:32:28 | 显示全部楼层
如果不是很复杂的状态调度,单片机程序没必要用状态机的形式吧,副作用比较大,状态机还是用在可编程逻辑器件上比较实用

出0入0汤圆

发表于 2013-7-29 10:46:56 | 显示全部楼层
状态机是程序实现的一种有效方式。。。

出0入0汤圆

发表于 2014-2-23 21:34:32 | 显示全部楼层
谁能用精练的语言解释一下按状态机编程和按状态图编程有什么区别?

出0入0汤圆

发表于 2014-2-23 23:04:14 | 显示全部楼层
关注中,了解不深刻

出0入0汤圆

发表于 2014-4-1 21:23:11 | 显示全部楼层
coleyao 发表于 2013-7-13 23:08
有时一个函数的执行会妨碍其它函数的实时性,如主循环体中有A和B两个函数,A为输入,B为输出,若B是显示函 ...

谢谢你,解决了我心中的疑惑。。

出0入0汤圆

发表于 2014-7-24 19:39:58 | 显示全部楼层
Mark 19楼

出0入0汤圆

发表于 2014-7-30 07:21:38 | 显示全部楼层
不错                     

出100入101汤圆

发表于 2014-7-30 09:35:37 | 显示全部楼层
状态机是写程序一种方法和思路。

出0入0汤圆

发表于 2014-11-23 17:54:37 | 显示全部楼层
状态机是一种思维模式,是一种思想。学习了。

出0入0汤圆

发表于 2014-12-16 15:00:19 | 显示全部楼层
状态机好东西.....

出85入85汤圆

发表于 2014-12-21 20:40:05 来自手机 | 显示全部楼层
IAR visualstate这个软件好像可以轻松应付这个问题。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-10-3 04:58

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

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