0

C18 を搭載した PIC18 で 16 ステートの FSM を構築しています。私は、各状態を、他の状態にジャンプしてジャンプする独自の機能として持つことを検討しています。プログラムがどこに行くべきかを判断するために、各状態の最後に「state##();」の分岐ケースを書きたいと思いますが、コンパイラーがこれを期待する可能性が高いため、これはすぐに死ぬと思います永遠に分岐するのではなく、戻ること。私のマイクロコントローラーのスタックはすぐにいっぱいになり、最終的にはオーバーフローします。

C18 は、私の関数呼び出しが返されず、命令を CALL/BRANCH ではなく GOTO/JMP に置き換えることを知っているほど賢いですか? GOTO が C に存在することは知っていますが (読みやすさの理由から、通常は強くお勧めしません)、ここよりも GOTO を使用する適切な理由は思いつきません。_asm _endasm ブロックを使用して強制的に goto できることは承知していますが、必要がない場合は問題を回避できます。関数に行って戻ってこないようにするには、C でどのように言うのが最善でしょうか?

当然、すべての助けに感謝します

4

1 に答える 1

2

あなたが話しているのは、関数呼び出しがスタックし続ける唯一の方法であるある種の再帰的な設計になるようです。ステートマシンがどのように機能するかについて、あなたは正しい考えを持っているとは思いません。C での FSM の優れたテンプレートについては、これを見てみてください。

C ステートマシンの設計

サンプル コードの一部を投稿したい場合、またはそれをどのように実装することを考えていたかを投稿したい場合は、さらに支援することができます。

于 2013-03-08T19:53:45.493 に答える