2017-01-07 39 views
0

私は、タスク間でデータをやりとりする適切な方法を提示する例を探しています:freeRTOS:タスク間でデータを渡す方法は?

私はディスプレイ、キーボード、いくつかのセンサーなどを持っています。内部ADC。 私はいつもすべてのセンサーからの値をディスプレイに表示したいと思います。ボタンを押した後、ビューを変更してテキストを表示します。別のキーを押した後、値に戻ります。

私はグローバル変数を使用しますが、どこでも悪い考えとして記述されています。一方、私がキュー(xQueueCreate、xQueueReceive、xQueueSend)を使用した場合、私はそれを表示するためのすべてのデータを持っていないと私はそれらを受信した後にコピーを作成することは、単にメモリを失うことだと思う。

+1

キューを使用しても問題はありません。 http://www.freertos.org/Embedded-RTOS-Queues.html – OldProgrammer

答えて

1

あなたはすでにデータをコピーしているためにメモリが失われていると言っていますが、このデータを保護するためには常にそうです。つまり、FreeRTOSコンテキスト切り替え、タスク処理、FreeRTOSが使用する他のすべてのリソースなど、多くのメモリを解放することに決めました。考えられる解決策は以下のとおりです。

  1. グローバル変数 - その理由は、それは悪いアイデアだ理由は、だ は、理想的には、あなたが変数(スコープ)へのアクセスを制限したいからです。同様に、 はタスクスイッチ中に他のタスクが に同じ変数を書き込み、データが破損する可能性があるため、安全に保つのが難しいです。しかし、 を保護すると、何らかのフラグを使用して変数をロックすると、それは完璧な解決策であり、sempahoreまたはキューを使用してデータが埋められていることを表示タスクに通知します。

  2. キュー - 複数のタスクから送信することができます。また、変数の表示タスクのコピーを保存すると言ったように、保存する必要がないためメモリを失う必要はありませんそれ以外の場所であればセンサーを読み取ってキューに入れ、表示タスクで受け取ったときに以前の値を変更することができます。だから、ADCの読み込みの間にそれを保存する必要はありません。

  3. キューがありますが、あなたが提案したものと少し違っています。システムで直接的な流れがある場合は、最初にキーボードをチェックしてからセンサーを調べ、次にTASK1からTASK2 - > TASK3 - > ... TASKX - > DISPLAY_TASKこのように変数には一定のフローがあり、常に1つの場所にすべてのデータがあることを確認します。
  4. すべての構造体(taskCreationのpvParameters)で同じパラメータを使うことができるので、同じ構造体を指すようになります。この場合、変数への書き込み中にmutexを使用できるデータを保護します。時間はこの変数にアクセスできます)。グローバル変数でmutexを使うこともできます。
関連する問題