我正在使用FSM来模拟我正在开发的嵌入式系统的行为。经过一些初步测试后,我用C编码的FSM工作得很好。我用来编写FSM的方法是指向函数的表,我在其中定义了一个表,其中包含了在每个状态中发生的所有函数。
void(*state_table[])(void) = {
conection,
Idle,
cal,
bi,
pot,
gal,
eis,
PrepE,
Pret,
Meas,
FS_ch,
Ending,
Error };
现在,下一步是对第一种方法无法解决的一些复杂问题进行建模。在这个新模型中,我想使用一些并发来模拟两个应该在“同一时间”工作的FSM,并且我还使用了一些层次结构来将这些FSM放在一个超级域中。
我现在遇到的问题是我不知道如何使用C对这种并发和层次结构进行编码。我正在研究QP框架,但我认为我的FSM仍然不是那么复杂,开始使用这种框架。
这是我设计的FSM。 状态71和72是超状态7内的并发状态。执行在它们之间是非常独立的,它们不共享任何变量。
如何使用C?
实现此并发和层次结构答案 0 :(得分:1)
外部状态机以连续循环运行,而子状态和子状态机必须运行完成。缺少抢占式调度程序时的并发必须协同实现 - “并发”状态必须按顺序执行,但每个都应该在每次调用时执行确定性的保证到完成操作 - 即没有无限期忙等待或延迟或处理需要更长时间才能实现您的实时约束(这在任何情况下都是状态机约束的基础)。
子状态机可以与主状态机相同地实现,但没有“大循环”。例如:
// Main state machine
static int current_state0 = 0 ;
int main( void )
{
static const void(*state_table[])(void) =
{
conection,
Idle,
cal,
bi,
pot,
gal,
eis,
PrepE,
Pret,
Meas,
FS_ch,
Ending,
Error
} ;
// Main loop - execute the current state
for(;;)
{
state_table[current_state0]() ;
}
}
void superState7()
{
// Execute concurrent sub-statemachines
subStateMachine71() ;
subStateMachine72() ;
}
// Sub-state machine
static int current_state71 = 0 ;
void subStateMachine71()
{
static const void(*state_table[])(void) =
{
state711,
state712,
state713,
state714
} ;
// Execute current substate
state_table[current_state71]() ;
}
...