-1

MPLAB X IDE と Hi-Tech C Compiler を PIC コントローラで使用しています。したがって、少し「バイト指向」であることが重要です。だから私は次のことを試します:

volatile struct{
   unsigned bit white:1;
   unsigned bit red:1;
   unsigned bit blue:1;
   unsigned bit green:1;
   unsigned bit violett:1;//Magenta
   unsigned bit yellow:1;
}ColorPick;

それが正しく宣言されているかどうかはわかりませんが、その上にビットシフトをドロップするとどうなりますか。My Result では、1 ビットのみがアクティブ (1) で、その他はすべてロー (0) である必要があります。

「白はビット 0b00000001 または 0b10000000 ですか?そして、6回シフトすると黄色になります。その後、再び白になります。ColorPick << 1; の同じ関数呼び出しでそれを行うことができますか?

私はそのように宣言しなかったビット7と8に1がシフトされると思います。

どうすればこれを修正できますか?

4

1 に答える 1

1

Hi-Tech C ユーザー マニュアルの 346 ページから:

A.9.4 int 内のビットフィールドの割り当て順序 (6.5.2.1)

構造体で定義された最初のビットフィールドには、ストレージユニットの最下位ビット位置が割り当てられます。後続のビットフィールドには上位ビットが割り当てられます。

bitドキュメントに基づいて、それはコンパイラのキーワードではないと思います。

ビットフィールドはコンパイラに依存するというのが私の経験です。ビット アラインメントを決定する方法は、次のようなことを行う小さなコマンド ライン プログラムを作成することです。

union test_u {
   struct test_s {
      unsigned long bwhite : 1;
      unsigned long bred : 1;
      unsigned long bblue : 1;
      unsigned long bgreen : 1;
      unsigned long bviolet : 1;
      unsigned long byellow : 1;
      unsigned long bpink : 1;
   } bits;
   unsigned long unlong;
} bitest;

bitest.unlong = 0;
bitest.bred = 1;
printf("0x%8.8X\n", bitest.unlong);

次に、必要に応じて値を置き換えて、コンパイラがそれらを貼り付ける場所を確認します。他のコンピュータ/コンパイラと通信する必要がある場合は、マスクとシフトを自分で使用する方がよいでしょう。

于 2013-03-11T16:16:24.290 に答える