State machine program design in FreeRTOS - vTaskStartScheduler in a switch statementで議論した後、私は4つの状態のステートマシンを持っています。FreeRTOSのステートマシンプログラムデザイン - 状態変化を管理するタスク
センサーデータがしきい値に達すると、タスクの状態が変化する必要があります。
考え方は、スイッチステートメントで状態を制御(および対応するタスクを一時停止/再開)する優れたタスクを持つことです。私の質問は、センサタスクがどのようにしてSTATEと上位タスクとの間で通信すべきですか?
解決策の1つは、イベント生成タスクによって呼び出されるset_state関数を用意することですが、私はFreeRTOSでグローバル変数を持つことはお勧めしません。
1タスク1がセンサーしきい値を検出し、STATEをキューに送信します。
2優位なタスクは、キューからデータを受信するのを待ってブロックされます。 STATEを受け取ると、switchステートメントはステート変更を処理します。
このアプローチが正しい場合、私の疑問は、どのようにしている状態が定義されるべきで関係(グローバル、または単に各タスクのスタック、または優れたタスクに存在...)
はい、ステートマシンを管理するスレッドを1つだけ使用し、他のすべてが入力をキューに入れ、アクション要求がポストバックされるのを待つことは、比較的簡単にデバッグすることができる優れた設計ですが、 '他のタスク自分の処理のために国が何をしているのか - 彼らはすべきではありません! –
公正なポイント、私はそれが私的であるときに国家をどのように見ることができるかを示すためにさらにそれを加えました。 –
はい、下位タスクは上位タスクによって中断または再開されるため、状態を知る必要はありません。それから、私はすべての定義とすべてのFreeRTOSタスクの作成を持っているtask_definitions.cだけを持っているなら、私はSTATEが優れたタスク関数内のローカル変数かもしれないと思いますか? –