轻量级状态机构架
本帖最后由 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 static/image/common/back.gif
查表速度快,构建表逻辑清晰方便,容易维护,但是耗费程序空间,有取有舍。 ...
所以是轻量级的. 本帖最后由 Excellence 于 2012-12-10 11:56 编辑
有针对某个芯片或某个开发板的例程吗?看看。谢。 不错,请上个例程 上例程更直观 不懂,学习中。 mark! mark thank u
页:
[1]