2013-12-19 22 views
6

私のジグビーwsndemoコードからの抜粋は、構造を理解するのに苦労しています。私は多くの構造関連の記事をオンラインで調べましたが、これらの構造変数がどのように定義され、使用できるかを理解できませんでした。助けてください。埋め込みCプログラミング

 static struct 
    { 
     uint8_t appSubTaskPosted : 1; 
     uint8_t appCmdHandlerTaskPosted : 1; 
     uint8_t appMsgSenderTaskPosted : 1; 
    } appTaskFlags = 
     { 
     .appSubTaskPosted = false, 
     .appCmdHandlerTaskPosted = false, 
     .appMsgSenderTaskPosted = false 
     }; 
+0

'false'はマクロ展開でなければなりません。' C'は 'bool'型を持たないからです。 ':1'は' uint8_t'の内部にあることを意味し、1ビットだけが使用されます(この場合、0または1に似て真か偽か)。残りは構造体の初期化に過ぎません。 –

+3

@hhachem Cにはbool型があります。 14年前にこの言語で導入されました。 – Lundin

+0

@Lundin知っておきたい。私はいつもマクロを使用していました.Cのブール値で作業するとき –

答えて

5

これらはビットフィールドです(この場合は1ビットです)。それらは値0または1、真または偽しか持てません。それらは個別にboolより少ないメモリを取る。

ビットフィールドを1より大きく定義することもできます。例えば、2のビットフィールドは0,1,2,3の値を持つことができます。ビットフィールドの美しさは、より大きなデータ型の個々のビットを使用していた場合には必要です。あなたはビットフィールドを持つ構造体を定義している場合は、このようなビットフィールドは、実際に、そのようなあなたは正確にあなたの質問に指定されていないint型32

+1

ビットフィールドで共有されるデータ型は、それらを宣言するために使用されます。これが標準または一般的な実装方法によって指定されているかどうかは思い出せません。 – Potatoswatter

5

として、より大きなデータ型を共有するため

、右隣同士にそれらを定義それはあなたが理解していないものですが、 "古典的な" Cの文献や構造の一般的な検索では見つけられないかもしれない、あなたの例では少なくとも4つのことが起こっています。これらは次のとおりである:

  • ビットフィールドメンバー
  • 指定初期化子
  • 明示的な幅のデータ・タイプ
  • ブールリテラル定数

ビットフィールドは、常に、ISO/ANSI Cにされているが、一般的に使用されていません。それらはメモリ効率のよいデータ構造をもたらすことができますが、ほとんどのアーキテクチャではアクセスするコード量が大きくなり、アクセスはアトミックではない可能性があります。これは、データが割り込みコンテキストまたはスレッドコンテキスト間で共有される場合に問題になります。また、ビットフィールドのパッキングは実装定義されているため、正確なビット位置が重要なアプリケーション(ハードウェアレジスタをオーバーレイする場合など)では、ポータブルでないコードが発生する可能性があります。

Designated initializersは、ISO C99に導入されました。 C99特有の文献はあまりありません。ほとんどのC文献は互換性のためにC90サブセットに先行しています。あなたは情報がそのようなものであることを知りたいならば、特にC99を検索すべきです。

明示的な幅のデータ型(この場合uint8_t)、また、C99で導入されたが、単に標準ヘッダstdint.hにタイプを内蔵するので、あまりにC90コンパイラに実装することができるのtypedef別名として実装されます。

同様にブールリテラルtruefalseは、C99にboolデータ型とともに導入されました。 C99においてbool_Booltypedefエイリアスであり、とfalseの定義と共にstdbool.hで定義されています。選択した場合はbooltruefalseを定義できますが、組み込みの_Boolデータ型がないため、他の整数型に別名を付けることになります。

+0

私は、あなたが探していたことをあなたが指摘した言葉に言及すべきだったと思います。私は平和の時です。兄さんありがとう。 – DarshanJoshi