2017-11-08 7 views
1

レジスタを持つ事業者:列挙およびビット単位の我々は、すべての操作のレジスタのこの種のに使用されている

SomeRegister |= (1 << What_ever_bit_I_wanna_change) // we do this for changing a specific bit to one without changing the others. 

SomeRegister &= ~(1 << What_ever_bit_I_wanna_change) // we do this for changing a specific bit to zero without changing the others. 

私は同じパラダイムを使用することを予定しておりますが、列挙して、このような何か:

typedef enum { 
Acc_2g (Something to change only the desired bits in the related register that I don't know how to do), 
Acc_4g (Something to change only the desired bits in the related register that I don't know how to do) 
}Res; 

列挙型の内部でビット演算子を使用する方法はありますか?

+0

値を列挙記号に割り当てることができます。それがあなたが求めているものなら、 'enum {x =(1 << 3)、y =(1 << 4)、...}です。 –

+0

列挙値を任意の整数に初期化できることは知っていますか?例えばのように。 'Acc_2g = 4'?たとえば、初期化にはコンパイル時の定数式を使用できます。 'Acc_2g = 1 << 2'。 [良い初心者の本](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)はあなたにそれを伝えておいたはずです。 –

答えて

2

列挙型は単なる整数定数のセットであり、実行時にデータに対してアクションを引き起こすことはできません。たとえば、次のように定義することができます。

typedef enum 
{ 
    Acc_2g = 1 << 2, 
    Acc_4g = 1 << 4 
} Res ; 

これは、質問で要求されたビットを「変更」しません。同じイディオムを使用する必要があります。

SomeRegister |= Acc_2g ; 
SomeRegister &= ~(Acc_4g) ; 

おそらく必要なのは、ビットフィールドを持つ構造体です。ただし、ハードウェアレジスタの特定のビットにアクセスする意図がある場合は、ビットオーダーとパディングに関してビットフィールドをパックする方法についてコンパイラのドキュメントを参照する必要があります。そのようなことは実装/ターゲットに依存しますが、レジスタがターゲット固有である場合には、必ずしも回避する必要はない。

例えば、いくつかの仮定の8ビットレジスタの:

typedef union 
{ 
    uint8_t byte; 

    struct 
    { 
     uint8_t bit012 : 3; 
     uint8_t bit34 : 2; 
     uint8_t bit5 : 1; 
     uint8_t bit6 : 1; 
     uint8_t bit7 : 1; 
    } bits ; 

} registerType; 

そしてこのタイプのレジスタへのポインタを作成するために使用することができる。

registerType *pReg = (registerType*)0x00008000; 

レジスタビットとしてアクセスすることができます-fields:

pReg->bits.bit5 = 1; 
pReg->bits.bit012 = 7; 

または

pReg->byte = 0x55; 

たとえば、1つの周辺機器のすべてのレジスタの構造を定義することで、さらに進むことができます。

+1

そしてC11では、匿名の内部構造体(定義からビットを落とす)を使うことができます。次に、 'pReg-> bit5 = 0;'を使うことができます。また、この規格では、 'bit012'がそれを保持する記憶装置の最上位または最下位にあるかどうかを指定していないことにも注意してください。 –

+0

@chux:私がやったと思うのは:*「ビットオーダーとパディングに関してビットフィールドをパックする方法について、コンパイラーのドキュメントを参照してください」*。 – Clifford

関連する問題