搜索
bottom↓
回复: 9
打印 上一主题 下一主题

轻量级状态机构架

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2012-12-10 08:50:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sochen1987 于 2012-12-10 13:15 编辑

直发构架,适合轻量级状态机.有更好的构架可以交流.

/*
state txition table
                     |               |               |               |             |
current state  | sleep      | tx            | rx           | sync      |
input(output)  |              |                |              |              |
-----------------------------------------------------------------------
sleep on        | (already) | (invalid)   | sleep(ok) | (invalid) |
tx on             | tx(ok)      | (invalid)   | tx(ok)      | (invalid) |
rx on             | rx(ok)      | (invalid)   | (already)  | (invalid)|
*/


enum STATE {
        SLEEP,
        TX,
        RX,
        SYNC,

        MAX_STATES,
};

enum INPUT {
        SLEEP_ON,
        TX_ON,
        RX_ON,
       
        MAX_INPUTS,
};

enum OUTPUT {
        OK,
        ALREADY,
        INVALID,
};


enum STATE g_state;                       

static enum OUTPUT sleepSleepOn(void);
static enum OUTPUT sleepTxOn(void);
static enum OUTPUT sleepRxOn(void);

static enum OUTPUT txSleepOn(void);
static enum OUTPUT txTxOn(void);
static enum OUTPUT txRxOn(void);


static enum OUTPUT rxSleepOn(void);
static enum OUTPUT rxTxOn(void);
static enum OUTPUT rxRxOn(void);


static enum OUTPUT syncSleepOn(void);
static enum OUTPUT syncTxOn(void);
static enum OUTPUT syncRxOn(void);

               
static enum OUTPUT (* const input[MAX_STATES][MAX_INPUTS])() = {
        {
                sleepSleepOn,
                sleepTxOn,
                sleepRxOn,

        },
        {
                txSleepOn,
                txTxOn,
                txRxOn,

        },
        {
                rxSleepOn,
                rxTxOn,
                rxRxOn,

        },
        {
                syncSleepOn,
                syncTxOn,
                syncRxOn,

        },
};
具体例程就不给出了,以上为例子:
发生一次SLEEP_ON事件:
通过output = input[g_state][SLEEP_ON]()返回具体的信息
如果在SLEEP状态下,output为ALREADY,无需具体的SLEEP_ON操作,状态不做任何跳转
如果在RX状态下,output为OK并执行具体的SLEEP_ON操作,状态跳转到SLEEP状态

其实状态机更考验一个设计者将一个连续的大块事件划分成‘合理’的碎片事件的能力,合理的划分能力甚于优良的构架,毕竟代码只是工具。

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

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

出0入0汤圆

2
发表于 2012-12-10 08:56:14 | 只看该作者
查表速度快,构建表逻辑清晰方便,容易维护,但是耗费程序空间,有取有舍。

出0入0汤圆

3
发表于 2012-12-10 08:57:20 | 只看该作者
这个用在什么地方的啊?

出0入0汤圆

4
 楼主| 发表于 2012-12-10 08:57:38 | 只看该作者
Etual 发表于 2012-12-10 08:56
查表速度快,构建表逻辑清晰方便,容易维护,但是耗费程序空间,有取有舍。 ...

所以是轻量级的.

出0入0汤圆

5
发表于 2012-12-10 09:28:30 | 只看该作者
本帖最后由 Excellence 于 2012-12-10 11:56 编辑

有针对某个芯片或某个开发板的例程吗?看看。谢。

出0入296汤圆

6
发表于 2012-12-10 11:29:51 | 只看该作者
不错,请上个例程

出0入264汤圆

7
发表于 2012-12-10 12:00:10 来自手机 | 只看该作者
上例程更直观

出0入0汤圆

8
发表于 2014-11-23 17:43:04 | 只看该作者
不懂,学习中。

出0入0汤圆

9
发表于 2014-12-24 13:30:13 | 只看该作者
mark!                     

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-3-29 16:42

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

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