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

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

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

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

C

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

セマフォ

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

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

解決済

C言語でコピーが発生しない(スタックを消費しない)Getter, Setterの書き方

A-Hayashi
A-Hayashi

総合スコア14

RTOS

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

C

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

セマフォ

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

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。

2回答

0リアクション

2クリップ

750閲覧

投稿2021/10/11 14:29

RTOSとC言語を使用して組込みソフトの製品を開発しています。

getter, setterを使って下記のように、
TaskA, TaskB間でデータの受け渡しをしたいのですが、

getter, setterを使用する際、
コピー処理が発生してCPUを無駄に使うのと
スタックを無駄に消費してしまいます。

サイズの非常に大きなデータを
getter, setterでやり取りをするため、
RAMが溢れ、スタックサイズを削減する必要性に迫られています。

getter, setterを使って、
dataへのポインタを返すことで、
コピー処理の削減、スタック使用の削減
をすることはできないでしょうか?

その場合、ポインタ経由で
dataを書き換えられてしまうため、
セマフォで排他制御ができなくなるので、
どうしていいか悩んでいます。

アドバイスいただけないでしょうか?

C

int data[1000]; void getter(int *pData) { セマフォ取得 memcpy(pData, data, sizeof(data)); セマフォ開放 } void setter(int *pData) { セマフォ取得 memcpy(data, pDate, sizeof(data)) セマフォ開放 } int TaskA(void) { while(1){ int tmp[1000]; getter(tmp); tmp[45] = 10; //一部のデータを更新 setter(tmp): //データを反映 } } int TaskB(void) { while(1){ int tmp2[1000]; getter(tmp2); //tmp2を使う制御 } }

~~

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

hoshi-takanori

2021/10/11 19:39

getter/setter の代わりに、「セマフォ取得してポインタを返す関数」と「セマフォ解放する関数」を用意するとか? (セマフォ解放する関数を呼び忘れるとやばいですが…。)
A-Hayashi

2021/10/11 22:12

セマフォ解放する関数を呼び忘れないために、何かいい方法があればいいのですが。 マクロ関数で、何か工夫できるか考えてみます
dodox86

2021/10/11 23:02 編集

> セマフォ解放する関数を呼び忘れないために、 たぶん、先のご質問からの延長のお話かと思いますが、 アプリ・ドライバ間のセマフォでの排他制御による処理遅延回避方法 https://teratail.com/questions/359898 排他の対象資源を指すポインタだから排他制御できない、と捉えるのではなく、そのアクセスする操作"期間"を排他する、と考えれば良いのではないでしょうか。他のOSなどでもありますが、Windowsではクリティカルセクション(Critical Section)や言語によってはロックの期間を設けることができます。 安全を期してのこととはいえ、コーディング上"忘れてしまう"心配とかとかそういう気楽な状況でも無いと思うのですが、、、
dodox86

2021/10/12 00:00

思ったのですが、RTOSということでタスクがスイッチするとしたら、今のgetter/setter方式ではTaskAがgetterで取得してあとでsetterで上書きするとしたら、他のタスクで同じ頃にget/setしたら古い値で上書きされてしまう心配はないですか? 1. TaskA get 2. TaskB get 3. TaskA getしたもので値を更新 4. TaskB getしたもので値を更新 5. TaskA set 共有領域にTaskAが更新したものを書き戻す 6. TaskB set 共有領域にTaskBが更新したものを書き戻す 結果として5.の内容が破棄される。 それとも上記は、質問用に省略して説明しただけのものでしたでしょうか。
A-Hayashi

2021/10/12 00:09

すみません、これもかけてませんでしたが 書き込むタスクは1つで、読み出すタスクは1つ以上の場合を想定しています。
dodox86

2021/10/12 00:13

書き込むタスクが1つだとしても、書き込むタスクが読み出してから書き込むまでに僅かでも時間差があります。その間に別のタスクが読み出した場合、やはり値の一貫性に問題が生じるような気がしますが、そんなことはないですか。
A-Hayashi

2021/10/12 00:23

1. TaskA get 2. TaskB get 3. TaskA getしたもので値を更新 4. TaskB get 5. TaskA set 共有領域にTaskAが更新したものを書き戻す 6. TaskB get 4においてTaskBで古いデータを使用してしまう期間は発生しますが、 5においてデータを書き込んでいる最中は、セマフォで排他しているため 更新途中のdataがTaskBから読まれてしまうことはないと思います。
A-Hayashi

2021/10/12 00:24

一般的には、2から5まで排他するべきなんでしょうか
A-Hayashi

2021/10/12 00:35

1. TaskA setterでdataへのポインタを返す・セマフォを取得 2. TaskA dataを更新 3. TaskA セマフォを解放 4. TaskB get スタック消費を抑えつつ、dodox86様の懸念事項を解決するならこうでしょうか。 setterをコールする側でセマフォを解放させるとすると、 ①セマフォの解放し忘れによるデッドロック ②複数のセマフォを同時に取得する場合、取得・解放の順がまずくてデッドロック くらい懸念点があるでしょうか。 y_waiwai様がおっしゃるように、①は簡単に気づけますが ②に気付くのが難しくなりますね。 セマフォを続けて取得できなくするようにマクロで工夫する等、考えてみます。
dodox86

2021/10/12 01:20

> 一般的には、2から5まで排他するべきなんでしょうか データによるのでは。読み出す値が他の値に依存していなくて、読み出した時点で処理をして構わないものであれば、他のタスクでの更新を待つ必要は無いはずです。他のタスクで読み出されたが最後、その値に依存して更新処理が続くのであれば、その後の処理に影響が出ると思えます。何らかのテーブル全体をただ排他するのではなく、排他が必要なものとそうでないものをちゃんと分別すれば良いのではないでしょうか。
dodox86

2021/10/12 01:30 編集

ソフト(OS)、ハード、更に特別に用意されたCPU命令の連携でセマフォなどの排他制御を実現している場合、それ自体CPUパワー、というかコストが必要かもしれませんので、排他制御はできるだけ無くす方が良いはずです。ほぼCPU命令だけで実現するロックの類もCPUによっては存在したと思いますが。
A-Hayashi

2021/10/12 09:02

dodox86様 排他の考えは理解しました。 排他制御を極力なくしたいのですが、なかなかなくせずにいます。 ダブルバッファにして、排他制御の期間を少しでも短くできないか等 検討中です。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

RTOS

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

C

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

セマフォ

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

組み込み開発

組み込み開発とは、スマートフォンや家電、自動車などに組み込まれているコンピューターシステムの開発のことです。特定の用途に特化しており、限られた機能のための開発を指します。組み込み開発で作られた機器を組み込み機器と呼び、近年ではPCのオペレーションシステム(OS)にも採用されています。