作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 FSM 对我正在开发的嵌入式系统的行为进行建模。经过一些初步测试后,我用 C 语言编写的 FSM 运行得很好。我用来编写 FSM 代码的方法是函数指针表,我在其中定义了一个表,其中包含每个状态中发生的所有函数。
void(*state_table[])(void) = {
conection,
Idle,
cal,
bi,
pot,
gal,
eis,
PrepE,
Pret,
Meas,
FS_ch,
Ending,
Error };
现在下一步是对我无法用第一种方法解决的一些复杂需求进行建模。在这个新模型中,我想使用一些并发来模拟两个应该“同时”工作的 FSM,并且我还使用了一些层次结构将这些 FSM 放入 super 状态中。
我现在遇到的问题是,我不确定如何使用 C 来编码这种并发性和层次结构。我正在查看 QP 框架,但我认为我的 FSM 还没有那么复杂,无法开始使用这些类型框架。
这是我设计的FSM。 状态71和72是 super 状态7内部的并发状态。它们之间的执行实际上是独立的,它们不共享任何变量。
如何使用 C 实现这种并发性和层次结构?
最佳答案
外部状态机在连续循环中运行,而子状态和子状态机必须运行完成。在没有抢占式调度程序的情况下,并发必须以协作方式实现 - “并发”状态必须按顺序执行,但每个状态都应在每次调用上执行确定性的保证完成操作 - 即,没有无限期的忙等待或延迟或处理花费比实时约束允许的更长的时间(在任何情况下,这都是状态机约束的基础)。
子状态机可以与主状态机相同地实现,但没有“大循环”。例如:
// 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]() ;
}
...
关于c - 如何用 C 实现分层并发有限状态机 (HCFSM)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44942471/
我是一名优秀的程序员,十分优秀!