切换行为(状态),无需太多运行时间

时间:2013-11-25 12:31:44

标签: c performance switch-statement interrupt

假设我有一个有限状态机,看起来像这样:

while(1){
    swtich(case){
        case ONE:
            do_thingone();
            if(parameter1 == 0)
                case = TWO;
        break;
        case TWO:
            do_thingtwo();
            do_thingthree();
            if(parameter1 == 1)
                case = ONE;
            if(parameter0 == 0)
                case = THREE;
        break;
//and so on
    }
}

使用布尔参数p_master,我想在具有相似但不同内容的两个有限状态机之间进行切换。

while(1){
    switch(state){
        state STATE_0:
            switch(case){
                case ONE:
                    do_onething();
                    if(parameter1 == 0)
                        case = TWO;
                break;
              //case TWO:
            }
        break;

        case STATE_1:
            switch(case){
                case ONE:
                    do_anotherthing();
                    if(parameter1 == 0)
                        case = TWO;
                break;
              //case TWO:
            }
        break;
    }
}

我不想通过

检查并切换案例
if(p_master == 0)

反之亦然,每次迭代,因为我认为这会产生太多的开销(p_master只会每100次或1000次迭代更改,它甚至完全可以永远不会改变!)。在有限状态机循环中,是否有更优雅的方式在一个案例和另一个案例之间进行更改?
注意:p_master可以作为CPU级别的中断触发!

3 个答案:

答案 0 :(得分:3)

switch语句移动到函数中并调整函数指针。在C中实现有限状态机时,为每个状态(以及每个处理程序可以定义下一个处理程序)都有一个专用的“处理程序”函数是很常见的。它也可以很好地映射到您可能看到的状态机图表(每个处理程序函数一个)状态)。

请参阅this question获取一些灵感。

答案 1 :(得分:0)

函数指针。

typedef void (*State_T) (void);

void state_1(void);
void state_2(void);

void doStuff(void) {
    State_T currentState = state_1;
    while(...) {
        currentState();
    }
}

答案 2 :(得分:0)

如果您只有几个这样的状态并且可以更改标志,为什么不将它们滚动到一个开关中:

switch(state | case){
    case STATE_0 | ONE:
        do_onething();
        if(parameter1 == 0)
            case = TWO;
            break;
    case STATE_0 | TWO:
        break;
    case STATE_1 | ONE:
        do_onething();
        if(parameter1 == 0)
            case = TWO;
            break;
    case STATE_1 | TWO:
        break;
}