0

我正在使用 C18 在 PIC18 上构建 16 状态 FSM。我正在考虑将每个状态作为自己的函数,它会跳转到其他状态并被其他状态跳转。我很想在每个状态的末尾写一个“state##();”的分支案例来确定程序应该去哪里,但我认为这会很快死掉,因为编译器可能会期望这个回归,而不是永远的分支;我的微控制器上的堆栈会很快填满并最终溢出。

C18 是否足够聪明,知道我的函数调用永远不会返回并相应地用 GOTO/JMP 而不是 CALL/BRANCH 替换指令?我知道 GOTO 存在于 C 中(出于可读性原因,通常强烈建议不要这样做),但我想不出比这里更合适的理由来使用它。我知道我可以强制它使用 _asm _endasm 块转到,但如果没有必要,我会为自己省去麻烦。在 C 语言中说去一个函数并且永远不会回来的最好方法是什么?

自然,感谢所有帮助

4

1 回答 1

2

您所说的似乎是某种递归设计,这是函数调用不断堆积的唯一方式。我认为您对状态机的工作方式没有正确的想法。试着看看这个 C 中 FSM 的一个很好的模板:

C 状态机设计

如果您想发布一些示例代码或您正在考虑如何实现它,我们可以提供更多帮助。

于 2013-03-08T19:53:45.493 回答