打印

C状态机数据结构求资料

[复制链接]
971|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
紫阳真人|  楼主 | 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:  方式的

这里只是个结构体的处理, 看成变量就是了

使用特权

评论回复
5
紫阳真人|  楼主 | 2019-2-21 10:51 | 只看该作者
airwill 发表于 2019-2-20 21:24
这里好象不大象状态机的程序.  最常见的状态机出来程序是
switch() case:  方式的

我现在贴了statemanager.c的全部内容,注释我自己加的,应该是状态机,可能跟你说的不是同一种

使用特权

评论回复
6
紫阳真人|  楼主 | 2019-2-26 20:51 | 只看该作者
CAN控制器状态机的分析与实现.pdf (819.94 KB)
C嵌入式编程设计模式.pdf (158.69 KB)
c语言状态机资料.pdf (240.82 KB)
PSiCC2-CN.pdf (4.49 MB)
单片机程序的状态机模型.pdf (155.57 KB)
基于抽象状态机的网格系统设计和分析.pdf (346.21 KB)
基于有限状态机的工控系统软件设计.pdf (201.87 KB)
嵌入式软件中状态机的抽象与实现.pdf (262.73 KB)
有限状态机FSM在PLD中的实现分析.pdf (667.78 KB)
有限状态机的一种实现框架.pdf (345.14 KB)
有限状态机在嵌入式软件中的应用.pdf (142.67 KB)
有限状态机在数控系统软件中的应用研究.pdf (183.78 KB)
状态机原理在控制程序设计中的应用.pdf (308.24 KB)













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

使用特权

评论回复
7
千岁寒| | 2019-6-6 14:11 | 只看该作者
wono01 发表于 2019-2-20 09:49
UML 状态图的实用C/C++设计 嵌入式系统的事件驱动型编程技术 第二版
看下这本 ...

多谢 学习中

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:必须有所突破

75

主题

525

帖子

9

粉丝