2017-05-12 16 views
0

私はFreeRTOSバイナリミューテックスを持ついくつかの問題を抱えています。私aplicationに同じ優先度を持つ複数のスレッド(タスク)がある、これら2つのアクセスは、リリースを取り、ミューテックスミューテックス内にあるI/O機能を提出します。一つのタスクが他に飢餓をやっているいくつかのタイミングによってはFreeRTOSミューテックス、複数のタスク

。それは可能ですか?

FreeRTOSは、リソースを待っているタスクがどのように多くの時間を考慮に入れますか?

おかげ

+0

クリティカルセクション内からファイルI/Oをやっているのはなぜですか?それは悪い考えのように思える。 –

+0

はマルチスレッドセーフである必要があります。 – jabella

+0

スレッドセーフな方法は他にもあります。飢餓を避ける最良の方法は、あなたのミューテックスを可能な限り小さく保つことです:いくつかのCPUサイクル以上かかる何もしないでください。呼び出し元をブロックすることはできません(例えば、ファイルI/O)。 I/Oスレッドを安全に保つ最良の方法は、あるスレッドが特定のデバイスにアクセスできるようにすることです。私は、あなたのプログラムがどの記憶装置に接続しているのかわからないが、たぶん1つの "ポート"または "インターフェース"しか持っていないので、複数のスレッドが話をする理由はない。それはあなたのプログラムをどのように組織するかの問題です。 –

答えて

3

あなたは、複数のタスクでタイトなループでミューテックスを使用していますか?もしそうなら、1つのタスクがあなたが考えるよりも長い間ミューテックスを保持する論理的な理由があります。タスクAとBが同じ優先順位を持っている場合はBと同じ優先順位を持っているので、Aが戻ってミューテックスを与えたときに、Aがミューテックスを保持しているとBがミューテックスを待って、その後、コンテキストスイッチが発生しません(それは場合に発生しますBはより高い優先度を持っていましたが、優先度の高いタスクにタスクスイッチが発生した場合、スケジューリングアルゴリズムとリスクタスクの違反となります。そこには、Aは、ループであるバックmutexを与えた場合、直ちに、再びBは、それはAはまだそれほどミューテックスを保持しているでしょうミューテックスを取るしようとするたびにそれを取る、Bがループでもある場合、それはブロックされます再びミューテックスで。このシナリオは簡単に修正できますが、自由に利用可能な本でこれを説明する章を読むことをお勧めします:http://www.freertos.org/Documentation/RTOS_book.html

+0

はい、そうです。 SDカードが一杯になっていて再試行の試行がシナリオを説明したケースでした。私は再試行で1ミリ秒の遅れでそれを修正します。ミューテックスリリース後のtaskYieldも問題を解決しますが、私の場合は遅れがもっときれいです。 OSではこの動作は正常ですか?ミューテックスの呼び出しが行われたとき、OSはどのタスクがもっと時間を待っていたかをチェックします。 – jabella

関連する問題