sochen1987 发表于 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)() = {
        {
                sleepSleepOn,
                sleepTxOn,
                sleepRxOn,

        },
        {
                txSleepOn,
                txTxOn,
                txRxOn,

        },
        {
                rxSleepOn,
                rxTxOn,
                rxRxOn,

        },
        {
                syncSleepOn,
                syncTxOn,
                syncRxOn,

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

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

Etual 发表于 2012-12-10 08:56:14

查表速度快,构建表逻辑清晰方便,容易维护,但是耗费程序空间,有取有舍。

zhonggp 发表于 2012-12-10 08:57:20

这个用在什么地方的啊?

sochen1987 发表于 2012-12-10 08:57:38

Etual 发表于 2012-12-10 08:56 static/image/common/back.gif
查表速度快,构建表逻辑清晰方便,容易维护,但是耗费程序空间,有取有舍。 ...

所以是轻量级的.

Excellence 发表于 2012-12-10 09:28:30

本帖最后由 Excellence 于 2012-12-10 11:56 编辑

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

Gorgon_Meducer 发表于 2012-12-10 11:29:51

不错,请上个例程

mcu_lover 发表于 2012-12-10 12:00:10

上例程更直观

mafeimafei 发表于 2014-11-23 17:43:04

不懂,学习中。

sinxcosytana 发表于 2014-12-24 13:30:13

mark!                     

bigwei 发表于 2016-6-7 00:19:36

mark thank u
页: [1]
查看完整版本: 轻量级状态机构架