C状态机数据结构求资料

[复制链接]
 楼主| 紫阳真人 发表于 2019-2-19 21:44 | 显示全部楼层 |阅读模式
本帖最后由 紫阳真人 于 2019-2-21 10:47 编辑

最近看别人的代码,运用了状态机,各种指针,比如下面,有些难懂,各位谁有类似的资料用来学习的。
EVENT_buf eventBuf;
FSM_T m_Fsm;/*在头文件中extern声明*/

ACT_TABLE_T stateInitActTable[] = {
        {EVENT_INIT_OK,                stateInitOKFun},
        {EVENT_INIT_FAIL,              stateInitFailFun}
};

ACT_TABLE_T stateSelftestActTable[] = {
        {EVENT_R_MOVE_COMPLETE,     stateSelftestRMoveCompleteFun},
        {EVENT_L_MOVE_COMPLETE,    stateSelftestLsMoveCompleteFun},
        {EVENT_R_MOVE_COMPLETE,    stateSelftestRsMoveCompleteFun},
        {EVENT_R_MOVE_COMPLETE,      stateSelftestRMoveCompleteFun},
        {EVENT_R_SWITCH_ACTIVE,     stateSelfTestRSwitchActiveFun},
        {EVENT_R_SWITCH_ACTIVE,      stateSelfTestRSwitchActiveFun},
        {EVENT_R_SWITCH_INACTIVE,   stateSelfTestRSwitchInActiveFun}
};

ACT_TABLE_T stateIdleActTable[] = {
        {EVENT_SET_COL_RECT,           stateIdleRtMoveFun},
        {EVENT_SET_COL_SLOT,           stateIdleSMoveFun},
        {EVENT_SET_COL_ROT,            stateIdleRMoveFun},
        {EVENT_R_MOVE_COMPLETE,     stateIdleRtMoveCompleteFun},
        {EVENT_R_SWITCH_ACTIVE,     stateSelfTestRSwitchActiveFun}
        //{EVENT_L_SWITCH_ACTIVE,    stateSelfTestLSwitchActiveFun},
        //{EVENT_R_SWITCH_ACTIVE,    stateSelfTestRSwitchActiveFun},
        //{EVENT_R_SWITCH_ACTIVE,      stateSelfTestRSwitchActiveFun}
};

ACT_TABLE_T stateSlotActTable[] = {
        {EVENT_SET_COL_RECT,           stateIdleRMoveFun},
        {EVENT_SET_COL_SLOT,           stateSlotSMoveFun},
        {EVENT_SET_COL_ROT,            stateSlotRtMoveFun},
        {EVENT_L_MOVE_COMPLETE,    stateSlotLMoveCompleteFun},
        {EVENT_R_MOVE_COMPLETE,    stateSlotRMoveCompleteFun},
        {EVENT_R_MOVE_COMPLETE,     stateIdleRMoveCompleteFun},
        {EVENT_R_SWITCH_ACTIVE,     stateSelfTestRSwitchActiveFun}
        //{EVENT_LS_SWITCH_ACTIVE,    stateSelfTestLSwitchActiveFun},
        //{EVENT_R_SWITCH_ACTIVE,    stateSelfTestRSwitchActiveFun}
};

ACT_TABLE_T stateRotActTable[] = {
        {EVENT_SET_COL_RECT,           stateIdleRMoveFun},
        {EVENT_SET_COL_ROT,            stateRotRMoveFun},
        {EVENT_SET_COL_SLOT,           stateRotSMoveFun},
        {EVENT_R_MOVE_COMPLETE,      stateRotRMoveCompleteFun},
        {EVENT_R_MOVE_COMPLETE,     stateIdleRMoveCompleteFun},
        {EVENT_R_SWITCH_ACTIVE,     stateSelfTestRSwitchActiveFun},
        {EVENT_R_SWITCH_ACTIVE,      stateSelfTestRSwitchActiveFun}
};

ACT_TABLE_T statePrestageActTable[] = {
        {EVENT_P_STOP,          statePrestageStopFun},
        {EVENT_R_MOVE_COMPLETE,     statePrestageRMoveCompleteFun},
        {EVENT_L_MOVE_COMPLETE,    statePrestageLMoveCompleteFun},
        {EVENT_R_MOVE_COMPLETE,    statePrestageRMoveCompleteFun},
        {EVENT_R_MOVE_COMPLETE,      statePrestageRMoveCompleteFun},
        {EVENT_R_SWITCH_ACTIVE,      stateSelfTestRSwitchActiveFun}
};

ACT_TABLE_T stateErrorActTable[] = {
        {EVENT_ERR_TO_SELFTEST,        stateErrorReSelftestFun}
};

STATE_TABLE_T fsmTable[] = {
        {STATE_INIT,         sizeof(stateInitActTable)           / sizeof(ACT_TABLE_T), enterInit,        exitInit,        stateInitActTable},
        {STATE_SELFTEST,     sizeof(stateSelftestActTable)       / sizeof(ACT_TABLE_T), enterSelftest,    exitSelftest,    stateSelftestActTable},
        {STATE_IDLE,         sizeof(stateIdleActTable)           / sizeof(ACT_TABLE_T), enterIdle,        exitIdle,        stateIdleActTable},
        {STATE_S,         sizeof(stateSlotActTable)           / sizeof(ACT_TABLE_T), enterSlot,        exitSlot,        stateSActTable},
        {STATE_R,          sizeof(stateRotActTable)            / sizeof(ACT_TABLE_T), enterRot,         exitRot,         stateRActTable},
        {STATE_P,     sizeof(statePrestageActTable)       / sizeof(ACT_TABLE_T), enterPrestage,    exitPrestage,    statePrestageActTable},
        {STATE_ERROR,        sizeof(stateErrorActTable)          / sizeof(ACT_TABLE_T), enterError,       exitError,       stateErrorActTable}
};        /*在状态转换中,执行入口和出口函数,在processEvent();处执行后面列表中函数*/

void initStateMachine(void)
{
        memset(&m_Fsm, 0, sizeof(m_Fsm));/*在m_Fsm后面开辟sizeof(m_Fsm)个内存空间,并填写0,然后返回m_Fsm*/
        fsmRegister(&m_Fsm, fsmTable);/*把上面状态表赋值给m_Fsm*/
        m_Fsm.curState = STATE_INIT;/*当前状态为STATE_INIT*/
}

void addEvent(EVENT event)
{
        if(eventBuf.count >= MAX_EVENT_BUF)
        {
                /* eventBuf overflow */
                //while(1);
        }
        else
        {
                intMasterDisable();
                eventBuf.event[eventBuf.writeIndex] = event;
                eventBuf.count++;
                eventBuf.writeIndex++;
                if(MAX_EVENT_BUF <= eventBuf.writeIndex)
                {
                        eventBuf.writeIndex = 0;
                }
                intMasterEnable();
        }
}

void processEvent(void)
{
        if(eventBuf.count != 0)
        {
    EVENT event = EVENT_MAX;/*20*/
                /* there is event in the eventBuf */
                intMasterDisable();
                event = eventBuf.event[eventBuf.readIndex];
                eventBuf.count--;
                eventBuf.readIndex++;
                if(MAX_EVENT_BUF <= eventBuf.readIndex)
                {
                        eventBuf.readIndex = 0;
                }
                intMasterEnable();
                fsmEventHandle(&m_Fsm, event);/*m_Fsm在初始化状态机过程中,包含了所有的状态信息*/
        }
}


wono01 发表于 2019-2-20 09:49 | 显示全部楼层
UML 状态图的实用C/C++设计 嵌入式系统的事件驱动型编程技术 第二版
看下这本
 楼主| 紫阳真人 发表于 2019-2-20 10:03 | 显示全部楼层
wono01 发表于 2019-2-20 09:49
UML 状态图的实用C/C++设计 嵌入式系统的事件驱动型编程技术 第二版
看下这本 ...

感谢
airwill 发表于 2019-2-20 21:24 | 显示全部楼层
这里好象不大象状态机的程序.  最常见的状态机出来程序是
switch() case:  方式的

这里只是个结构体的处理, 看成变量就是了
 楼主| 紫阳真人 发表于 2019-2-21 10:51 | 显示全部楼层
airwill 发表于 2019-2-20 21:24
这里好象不大象状态机的程序.  最常见的状态机出来程序是
switch() case:  方式的

我现在贴了statemanager.c的全部内容,注释我自己加的,应该是状态机,可能跟你说的不是同一种
 楼主| 紫阳真人 发表于 2019-2-26 20:51 | 显示全部楼层


























这些是我从本论坛其他地方搬运来的,先马后看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
千岁寒 发表于 2019-6-6 14:11 | 显示全部楼层
wono01 发表于 2019-2-20 09:49
UML 状态图的实用C/C++设计 嵌入式系统的事件驱动型编程技术 第二版
看下这本 ...

多谢 学习中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:必须有所突破

76

主题

532

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部