2017-12-01 28 views
0

私は少しビット操作をしていて、ちょっと実験しようとしています。32ビットレジスタの特定のビットを書き込んで読み取る方法

のは、私は以下のように構築された32ビット・レジスタを持っているとしましょう:

Bit 31:12 RESERVED 
Bit 11 CONFIG1 
Bit 10 CONFIG2 
Bit 9:0 DATA 

すでにレジスタにデータを書き込むための関数が存在する:

#define WR_REG_32(address, value) (*((volatile u32 *)(address)) = (value)) 

私が書きたいですビット10(CONFIG2)で値0x0。値は、例えばのような形式である必要があります。

0x00005000 

だから、どのように他のビットを触れることなくビット10に値を0x0を書き込むために使用するために何進値を知っていますか?

また、ビット0-9からの値だけを32ビットレジスタから読み取る最も簡単な方法は何ですか?

+1

この目的のために、shift、andなどのビット演算が行われます。レジスタに32ビットがある場合は、32ビットを読み込みます。それだけで、上記の操作を使用して必要なビットを得ることができます。 – zubergu

+0

関連リストのトップから:[1ビットをどのように設定、クリア、トグルするのですか?](https://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle -a-single-bit?rq = 1)... – ilkkachu

+1

また、https://stackoverflow.com/questions/10493411/what-is-bit-masking – ilkkachu

答えて

1

ビット10を強制的にゼロにすることを除いて、同じビットを書き込むためにレジスタを最初に読み出す必要があります。

10ビット、ゼロにビットを強制的に、あなたは除いビット-10全ビット対1の電流値との間(ゼロ)ビット単位ANDを使用する必要が

newValue = currentValue & ~(1<<10) 

~演算子反転ビット。 &はビット単位のANDです。現在の値を読み出すために、

value = RD_REG_32(address) ; To read the current value 
WR_REG_32(address, value & ~(1<<10)) 

RD_REG_32のマクロを使用して。ビット0〜9を読み取ること

は、以下のエリックさんのコメントも0

(read value from register) 
value &= 0x3FF;  // keeps only the first 10 bits, from 0 to 9 

読むに他人を設定します。あなたのアーキテクチャは、32ビットの値を扱う方法に影響するかもしれません。

+2

'int'は16ビットかもしれません。その場合'〜 (1 << 10)は '〜1024'、次に' 64512'(2の補数を仮定)と評価され、 'value&〜(1 << 10)'は 'value'の上位16ビットをクリアします。一般に、ビット単位の演算を使用する場合、 'value&〜((u32)1 << 10)'のように、符号なしの型の望ましい幅を使用するとよいでしょう。 –

関連する問題