C18 : Will the compiler "know" a function call will never return?

标签 c microcontroller pic mplab mplab-c18

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

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

当然,感谢所有帮助

最佳答案

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

C state-machine design

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

关于C18 : Will the compiler "know" a function call will never return?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15299680/

相关文章:

interrupt - 这是禁用 PIC24 中断的安全方法吗?

clang-format 对已格式化的文件进行更改

c - 无时钟 I2C STM32L0

c - MicroC rs-485、pic16f887 字符串发送问题

c - #定义二进制值

c - 2 秒后加速闪烁 LED

c - 我们在嵌入式 c 或嵌入式 c++ 中有 '@' 运算符吗?如果是,请向我解释以下代码?

c - 分配给变量与立即使用返回值

c - 使用 GtkClipboard 获取 URL

c - C 中的后缀求值