|
本帖最后由 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周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|