|
楼主 |
发表于 2023-3-26 14:47:22
|
显示全部楼层
https://blog.csdn.net/qq_37662088/article/details/122441289
https://blog.csdn.net/qq_36969264/article/details/122365696
结合了这两位大侠的代码搞了一个比较合适自己的状态机
- #ifndef __fsm_H
- #define __fsm_H
- #include <stdbool.h> //true false
- #include <stdint.h> //uint8_t
- #include <stdio.h> //printf
- typedef struct action_map
- {
- uint8_t state;
- void (*EnterAct)(void); //进入状态之前的执行函数,执行一次
- void (*RunningAct)(void); //状态执行函数,一直执行
- void (*ExitAct)(void); //退出状态之时的执行函数,执行一次
- }action_map_t; /* 动作action表描述 */
- typedef struct event_map
- {
- uint8_t stCurState; //当前状态
- uint8_t stNextState; //下一个状态
- bool (*trans_fun)(void); //转移条件函数
- }event_map_t; /* 事件event表描述 */
- typedef struct fsm
- {
- uint8_t state; //当前状态
- uint8_t actSum; //动作总数
- uint8_t eventSum; //事件总数
- int8_t runActionID; //执行函数的id
- action_map_t *pActionMap; //动作执行
- event_map_t *pEventMap; //状态转移
- struct fsm *next; //链表
- }fsm_t; /* 状态机控制结构 */
- void FSM_Init(fsm_t* pFsm,event_map_t* pEventMap,uint8_t eveMapSum,action_map_t* pActionMap,uint8_t actMapSum,uint8_t curState);
- #endif /* __fsm_H */
复制代码- #include "fsm.h"
- #include "system.h"
- static fsm_t* head_handle = NULL;
- int8_t FSM_EnterAct(fsm_t* pFsm)
- {
- int8_t i;
- //printf("FSM_EnterAct:pFsm->state=%d\n",pFsm->state);
- if(pFsm->pActionMap){
- for(i=0; i<pFsm->actSum; i++){
- if(pFsm->state == pFsm->pActionMap[i].state){
- if(pFsm->pActionMap[i].EnterAct){
- pFsm->pActionMap[i].EnterAct(); //执行进入函数
- }
- return i;
- }
- }
- }
- return -1;
- }
- int8_t FSM_ExitAct(fsm_t* pFsm)
- {
- int8_t i;
- //printf("FSM_ExitAct:pFsm->state=%d\n",pFsm->state);
- if(pFsm->pActionMap){
- for(i=0; i<pFsm->actSum; i++){
- if(pFsm->state == pFsm->pActionMap[i].state){
- if(pFsm->pActionMap[i].ExitAct){
- pFsm->pActionMap[i].ExitAct(); //执行退出函数
- }
- return i;
- }
- }
- }
- return -1;
- }
- void FSM_Run(fsm_t* pFsm)//传入当前状态,因为需要对其进行修改,所以传变量指针
- {
- uint8_t i;
- for(i=0;i<pFsm->eventSum;i++){
- if ((pFsm->pEventMap[i].stCurState == pFsm->state) && (pFsm->pEventMap[i].trans_fun() == true))//当前状态相等并且转移条件为真
- {
- //这里可以添加自己需要执行的代码
- FSM_ExitAct(pFsm);
- pFsm->state = pFsm->pEventMap[i].stNextState;//转移为下一个状态
- pFsm->runActionID = FSM_EnterAct(pFsm);
- break;
- }
- }
- if(i==pFsm->eventSum){
- if((pFsm->runActionID>0)&&(pFsm->pActionMap[pFsm->runActionID].RunningAct)){
- pFsm->pActionMap[pFsm->runActionID].RunningAct(); //执行退出函数
- }
- }
- }
- void FSM_Process(void)
- {
- fsm_t* target;
- for(target=head_handle;target;target=target->next){
- FSM_Run(target);
- }
- }
- void FSM_Init(fsm_t* pFsm,event_map_t* pEventMap,uint8_t eveMapSum,action_map_t* pActionMap,uint8_t actMapSum,uint8_t curState)
- {
- //以链表形式
- fsm_t* target = head_handle;
- while(target){
- if(target==pFsm) return;
- target = target->next;
- }
- pFsm->next = head_handle;
- head_handle = pFsm;
-
- pFsm->state = curState;
- pFsm->actSum = actMapSum;
- pFsm->eventSum = eveMapSum;
- pFsm->pEventMap = pEventMap;
- pFsm->pActionMap = pActionMap;
-
- pFsm->runActionID = FSM_EnterAct(pFsm);
-
- Process_Start(0,"FSM_Process",FSM_Process);
-
- printf("pFsm->actSum=%d,pFsm->eventSum=%d\n",pFsm->actSum,pFsm->eventSum);
- }
- /********************END OF FILE************/
复制代码
使用
- #include "fsm.h"
- typedef enum {
- state_1 = 0,
- state_2,
- state_3,
- state_4
- }State;
- int x;
- int y = 5;
- bool trans_1to2(void)
- {
- return (x == y);
- }
- bool trans_1to3(void)
- {
- return (x > y);
- }
- bool trans_2to3(void)
- {
- return (x > y);
- }
- bool trans_3to4(void)
- {
- return (x == y);
- }
- bool trans_4to1(void)
- {
- return (x < y);
- }
- void state1_entry(void)
- {
- printf("state1_entry\n");
- }
- void state1_do(void)
- {
- //printf("state1_do\n");
- }
- void state1_exit(void)
- {
- printf("state1_exit\n");
- }
- void state2_entry(void)
- {
- printf("state2_entry\n");
- }
- void state2_do(void)
- {
- //printf("state2_do\n");
- }
- void state2_exit(void)
- {
- printf("state2_exit\n");
- }
- void state3_entry(void)
- {
- printf("state3_entry\n");
- }
- void state3_do(void)
- {
- printf("state3_do\n");
- }
- void state3_exit(void)
- {
- printf("state3_exit\n");
- }
- void state4_entry(void)
- {
- printf("state4_entry\n");
- }
- void state4_do(void)
- {
- //printf("state4_do\n");
- }
- void state4_exit(void)
- {
- printf("state4_exit\n");
- }
- event_map_t eventMap[] = {
- {state_1,state_2,trans_1to2},
- {state_2,state_3,trans_2to3},
- {state_3,state_4,trans_3to4},
- {state_4,state_1,trans_4to1},
- {state_1,state_3,trans_1to3}
- };
- action_map_t actionMap[] =
- {
- {state_1, 0, state1_do, state1_exit},
- {state_2, state2_entry, state2_do, 0},
- {state_3, state3_entry, 0, state3_exit},
- {state_4, state4_entry, state4_do, state4_exit},
- };
- fsm_t fsm1;
- void USR_Init(void)
- {
- FSM_Init(&fsm1,eventMap,sizeof(eventMap)/sizeof(event_map_t),actionMap,sizeof(actionMap)/sizeof(action_map_t),state_1);
- }
复制代码 |
|