0

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

STATEにのみ存在している必要がありますそこでは、優れた仕事の中で「必要」が必要です。私はあなたがCを使用していると推測しているので、STATEを "superior_task.c"(またはそれが呼び出されたもの)のstatic変数として宣言します。つまり、そのファイル内でのみ影響を受ける可能性があります(C++のプライベートメンバー変数に相当するC)。

次に、下位のタスクが状態変更に影響を与える必要がある場合、上位のタスクによって管理されるキューに状態変更イベントを通知します。キューが処理されると、上位ステートでプライベートSTATE変数に変更されます。

他のタスクが自分の処理のためにどのような状態であるかを知る必要がある場合は、プライベート変数にアクセッサを使用できます(例:State get_state() { return STATE; })。しかし、Martinが述べているように、他のタスクは状態を知る必要はありません。他に存在してはいけないタスク間の相互依存性があります。

+1

はい、ステートマシンを管理するスレッドを1つだけ使用し、他のすべてが入力をキューに入れ、アクション要求がポストバックされるのを待つことは、比較的簡単にデバッグすることができる優れた設計ですが、 '他のタスク自分の処理のために国が何をしているのか - 彼らはすべきではありません! –

+0

公正なポイント、私はそれが私的であるときに国家をどのように見ることができるかを示すためにさらにそれを加えました。 –

+0

はい、下位タスクは上位タスクによって中断または再開されるため、状態を知る必要はありません。それから、私はすべての定義とすべてのFreeRTOSタスクの作成を持っているtask_definitions.cだけを持っているなら、私はSTATEが優れたタスク関数内のローカル変数かもしれないと思いますか? –

関連する問題