最近在把sysml的状态机图写成C代码的时候特意学习了这方面的内容,感觉这个利用宏定义的方法比较简单有效,适合实现轻量级的状态机。在FPGA和ucos下写个了测试任务跑了,很好用。 简单的说是利用一组宏定义: #define STATE_ENTRY_ACTION if ( currentState != previousState ) { #define STATE_TRANSITION_TEST previousState = currentState; } if ( nextState == currentState ) { #define STATE_TRANSITION_TEST_EXCLUSIVE } else if ( nextState == currentState ) { #define STATE_EXIT_ACTION } if ( nextState != currentState ) { #define STATE_EXIT_ACTION_EXCLUSIVE } else if ( nextState != currentState ) { #define STATE_END currentState = nextState; } break; 然后写状态机的时候就可以像写清单一样简单,比如后面附的那个电机控制程序: case 1: STATE_ENTRY_ACTION //进入状态时的行为 CountdownTimer = 38*10; pwm0a = 127 + 30; pwm0b = 127 + 30; STATE_TRANSITION_TEST //状态转换的判断,以及状态中的行为 if ( --CountdownTimer == 0 ) NextState = 2; STATE_EXIT_ACTION //离开状态时的行为 STATE_END 带EXCLUSIVE的宏的额外作用是限制每个周期的仅进行一个类型的行为,比如进行了entry类的,就不再执行do类的。 如果大家还有更好的方法,贴出来讨论讨论,少走点弯路。 |
|
来自: BlackBluePLC > 《C语言》