分享

状态机图的entry\do\exit的简单实现方法 (amoBBS 阿莫电子论坛)

 BlackBluePLC 2014-11-07
最近在把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类的。


如果大家还有更好的方法,贴出来讨论讨论,少走点弯路。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多