質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
RTOS

RTOS(リアルタイムOS)は、リアルタイムシステムのためのOSです。実時間システムや実時間OSとも呼ばれ、時間的な制限のある処理を行うための機能・特性を備えています。組み込みシステムの制御に多く用いられています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

排他制御

排他制御とは、特定のファイル・データへのアクセスや更新を制御することです。特にファイルやデータベースへ書き込みを行う際、データの整合性を保つため別のプログラムによる書き込みを一時的に制御することを指します。

セマフォ

セマフォは、並行プログラミングにおいて同期のサポートを行うための機構。また、それによりプロセス間で交換される信号を指します。複数のプロセスでファイルなどを共有している際の同時アクセスによる破壊や不整合を防ぐことが可能です。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

1回答

1710閲覧

アプリ・ドライバ間のセマフォでの排他制御による処理遅延回避方法

A-Hayashi

総合スコア14

RTOS

RTOS(リアルタイムOS)は、リアルタイムシステムのためのOSです。実時間システムや実時間OSとも呼ばれ、時間的な制限のある処理を行うための機能・特性を備えています。組み込みシステムの制御に多く用いられています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

排他制御

排他制御とは、特定のファイル・データへのアクセスや更新を制御することです。特にファイルやデータベースへ書き込みを行う際、データの整合性を保つため別のプログラムによる書き込みを一時的に制御することを指します。

セマフォ

セマフォは、並行プログラミングにおいて同期のサポートを行うための機構。また、それによりプロセス間で交換される信号を指します。複数のプロセスでファイルなどを共有している際の同時アクセスによる破壊や不整合を防ぐことが可能です。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2021/09/16 12:26

編集2021/09/16 14:38

プリエンプティブマルチタスクなRTOS・C言語を使用して、
センサの値を通信で他のマイコンボードに送信する機能を作っています。

用語

・センサタスク・・・センサ値を取得しセンサモデルにセット、センサドライバが実行される。
・センサモデル・・・センサ値を保持する(排他制御有り)
・通信タスク・・・センサ値を通信で送信、通信アプリが実行される。

センサタスク(タスク優先度高)で1ms周期でセンサ値をAD変換し、
センサモデルにセンサ値をセットします。
一方で、通信タスク(タスク優先度低)では10ms周期でセンサモデルからセンサ値を取得し、
通信で他のボードへセンサ値を送信します。

センサモデルのデータは、
データのセット、取得時にバイナリセマフォで排他制御を行っています。

センサタスクと通信タスクのタスク優先度の間には、
他にも処理が重いタスクが複数あります。

問題:

通信タスクでセンサモデルからセンサ値を取得する際にセマフォを取得すると、
センサタスクがセンサモデルにセンサ値をセットする際に、セマフォで待たされ、
センサ値のAD変換の1ms周期が満たせなくなります。

この問題は、どのように回避すればいいのでしょうか?

センサデータのサイズがかなり大きいため、
ダブルバッファ等を使わず、RAMの使用量を最小限に抑えたいです。

よろしくお願いします。

回答がつかないので、stackOverflowでも質問しています。
回答がもらえたら、こちらで報告します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/09/16 16:40

通信タスクがデータを読んでる間、(排他されてるもんだから)センサタスクがデータを更新できない、ってことですか? バッファを置けばそこにコピーする短い時間だけ排他すればいいのでしょうが、うーん...
thkana

2021/09/16 23:09

> RAMの使用量を最小限に抑えたい いまさら言うことではないとも思いますが、RAMを余らせても仕方ないので「最小限」にすることは意味がないです。組み込みの場合は言ってしまえば足りなくならければOKですから(まぁ、多少は将来の拡張を見込んで確保...とかもありますけれど)。 具体的に、システムのRAMがどれだけで、現状での使用量/空き容量がどれだけ、データサイズがどれだけなのでしょう。 すでに検討済ではあるようですが、バッファを噛ませるのが普通に思いつく対策なので、それがダメだという経緯は示しておいていただきたく思います。 あとは...通信タスクを起こすのは誰なのでしょう。単にタイマーで起こされるようなタスクなら、センサが10回データを取ったらそれをトリガにして通信タスクを起動すればよい、なんていう構造も考えられなくはないと思いますが。
dodox86

2021/09/16 23:50

> 単にタイマーで起こされるようなタスクなら、センサが10回データを取ったらそれをトリガにして通信タスクを起動すればよい、なんていう構造も考えられなくはない ああ、確かに。同じデータを送っても意味無いし、送信し切れないデータを集めても仕方無い。センサーデータの重要度も関係するかもしれませんね。1度たりとも欠落してはならないのとそうではないのとでは、えらい違いです。(クリップこそしてませんが実は注視している質問です)
A-Hayashi

2021/09/17 00:51

>通信タスクがデータを読んでる間、(排他されてるもんだから)センサタスクがデータを更新できない、ってことですか? その通りです。 通信タスクのタスク優先度は、センサタスクよりもタスク優先度が低いため、 通信タスクが多少待たされるのは許容できるのですが、センサタスクが待たされると センサ値の取得タイミング1msが守れなくなってしまいます。 >バッファを置けばそこにコピーする短い時間だけ排他すればいいのでしょうが、うーん... 通信タスクがコピーする時間を短縮できたとしても、 センサタスクと通信タスクの間の優先度に、処理が重いタスクが複数あるので、 コピー中に運悪く、これらが割り込んでくると、結局はセンサタスクが待たされてしまいます。
episteme

2021/09/17 00:58

> センサが10回データを取ったらそれをトリガにして通信タスクを起動すればよい これはアリでしょうね。あるいはセンサタスクがデータ書き込み完了したタイミングで(mutex+condition_variableかなんかで)他タスクの待ちを解くよな造りも考えられる。
A-Hayashi

2021/09/17 01:01

>いまさら言うことではないとも思いますが、RAMを余らせても仕方ないので「最小限」にすることは意味がないです。組み込みの場合は言ってしまえば足りなくならければOKですから(まぁ、多少は将来の拡張を見込んで確保...とかもありますけれど)。 すみません、質問にかけてなかったですが センサタスク・通信タスクと同じような、排他制御の問題を抱えている箇所が 他にも60箇所以上あるので、排他制御の問題に解決をするためにRAMを使うと、 それが数十倍になってなって返ってきます。 なので、RAM使用量を最小限にと書きました。 余らせても意味がないのはその通りです。将来の機能拡張のためです。 >具体的に、システムのRAMがどれだけで、現状での使用量/空き容量がどれだけ、データサイズがどれだけなのでしょう。 使用料/空き容量は、450kb/50kb程度です。 データサイズは、200byte程度です。 >すでに検討済ではあるようですが、バッファを噛ませるのが普通に思いつく対策なので、それがダメだという経緯は示しておいていただきたく思います。 センサモデルに相当するものが60個以上あり、 バッファをかませるためにRAMを使用すると、RAMが溢れるためです。 >あとは...通信タスクを起こすのは誰なのでしょう。単にタイマーで起こされるようなタスクなら、センサが10回データを取ったらそれをトリガにして通信タスクを起動すればよい、なんていう構造も考えられなくはないと思いますが。 その方法が合理的だとは思うのですが、 通信タイミングは、通信相手との間の通信規約で定められていて、 変えることができません。
TaroToyotomi

2021/09/22 15:42

>センサタスクと通信タスクの間の優先度に、処理が重いタスクが複数あるので、 RTOSのセマフォまたはミューテックスで、優先度継承プロトコルはサポートしていないのでしょうか? これを使うと通信タスクが資源をロックしている間にセンサタスクより優先度の低い他のタスクが割り込むことがなくなるので資源を占有している時間を短縮できます。
A-Hayashi

2021/10/11 14:09

優先度継承プロトコルをサポートしているので、試しに使ってみます。
guest

回答1

0

ベストアンサー

楽観的ロックという考え方が目的に近いと思います。
すなわち;

  • センサタスクがセンサモデルにデータをセットするときはロックを取りません。いつでも好きなタイミングで書き込みます。
  • 通信タスクがモデルからデータを読み出すとき、読み出す前と読み出した後に何か(更新時刻?チェックサム?要検討)を参照して、書き込みと読み出しがぶつかったか判定します。ぶつかったら読み出しからやり直します。

投稿2021/09/16 23:02

sigsegv

総合スコア895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問