假设我有一个有限状态机,看起来像这样:
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级别的中断触发!
答案 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;
}