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

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

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

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

Q&A

解決済

3回答

1993閲覧

C言語での組込みシステム開発について

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2019/06/20 11:55

質問

最近組込みシステム開発においてビットフィールドや共用体が用いられると習ったのですが、理由がいまいちわからなかったので、組込みシステム開発でビットフィールドや共用体が用いられる理由をわかりやすく解説していただけませんか?

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

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

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

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

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

guest

回答3

0

CPUや周辺ハードの制御をするのにレジスタを用います。
レジスタはビットごとに意味を持っていることが多いので、ビットフィールドを構造体且つ共用体で定義するのが一般的かと思います。
別の回答でメモリの節約の話がありますが、最近の環境は組み込みと言っても大容量メモリを搭載していることも少なくなく、ビットで試行錯誤してまで実装するほどではないと思います。
とは言っても組み込みに限らずC言語ではビットでフラグ管理することは良くある話ですので使えるに越したことはありません。

投稿2019/06/20 12:38

ttyp03

総合スコア17000

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

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

退会済みユーザー

退会済みユーザー

2019/06/20 14:05

ありがとうございます。
guest

0

既に解決済みとなっているようですが、、、

組込みの場合、外部I/Oの操作を行う事も多いです。その場合、個々のポートは 1bit 従って、ビットフィールドが無いと、その都度、何ビット目かの計算が必要になります。
また、CPUによっては、特定ビットのみのアクセスが可能なものがあります。バイト単位での書込みによる他のポートへの影響を防ぎます。

共用体については、構造体みたいな複数データのまとまりをある場所では、個々にアクセスし、別の場所ではまとめてアクセスするため。機器制御等の設定項目は多数ありますが、それらを単なるバイト列と見なす事で、扱いが容易となります。(通信で使う場合も、単なるバイト列の方が扱いやすい)
そう言えば、クラスの継承みたいに使う事もあった。先頭何バイトかを共通フラグにして、後半部分が異なるみたいに。そうする事で、一つの共通データとして扱えます。

まあ、メモリ領域の節約もありますが、そこまでギリギリに使う事は今は少ないじゃないかと思います。(今はそれより、バグが怖い)

そう言えば、プログラム本体は、Flashに置き、書き換え可能とし、実行時は、RAMに転送する事で、実行速度を稼ぐなんてのもありますね。

投稿2019/06/20 12:47

pepperleaf

総合スコア6385

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

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

0

ベストアンサー

まずメモリの節約です。組み込み用のCPU内臓のRAMは大きいものでも4KBぐらいしかありません。なので、7以下なら3ビット等、必要な数値を格納できる最小のビット数を使います。通常Cコンパイラのcharは8ビットですから0〜15の値であれば1バイトに2個格納できるわけです。そのようにいかにメモリを効率よく使うか・・・ということでビットフィールドを、また、別々の処理に渡すパラメータがcharやintに別れる場合、同じ領域を使えるようにするため共用体を使うことが有ります。・・・だいぶ昔の知識なので、今は違うかも知れませんが、私の認識ではそういう場合が多いように思います。

投稿2019/06/20 12:14

cateye

総合スコア6851

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

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

cateye

2019/06/20 12:17

プログラム自体は、ROMに焼きますから上記RAMとは違う領域です。
keicha_hrs

2019/06/20 13:19

> 組み込み用のCPU内臓のRAMは大きいものでも4KBぐらいしかありません 何年前の話してるの?
pepperleaf

2019/06/20 14:06

そういえば、RAM 4KBの世界だと、 アセンブラの世界って気がするけど、どうでしょう?
y_waiwai

2019/06/20 23:20

ArduinoではRAM2Kですぜ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問