我正在使用C18在PIC18上构建16状态FSM。我正在考虑将每个状态作为自己的函数跳转到其他状态并被其他状态跳跃。我很想在每个状态结束时编写一个“状态##();”的分支案例,以确定程序应该去哪里,但我认为这很快就会死,因为编译器可能会期望这个返回,不是永远分支;我的微控制器上的堆栈很快就会填满并最终溢出。
C18是否足够聪明,知道我的函数调用永远不会返回并用GOTO / JMP而不是CALL / BRANCH替换指令?我知道GOTO存在于C中(并且出于可读性的原因通常强烈反对),但我想不出比使用它更合适的理由。我知道我可以强迫它转到一个_asm _endasm块,但如果没有必要,我会省去麻烦。 C中最好的方式是去一个函数并且永远不会回来?
当然,所有帮助都表示赞赏
答案 0 :(得分:2)
你所谈论的似乎是某种递归设计,这是函数调用将继续堆叠的唯一方式。我不认为你对状态机的工作方式有正确的认识。尝试在C中查看这个用于FSM的优秀模板:
如果您想发布一些示例代码或者考虑如何实现它,我们可以提供更多帮助。