2017-10-27 12 views
0

アドレス0x1ffff670にメモリマップされたデバイスがあるとします。デバイスレジスタは8ビットしかありません。私はそのレジスタに値を取得し、1だけインクリメントして書き戻す必要があります。続きメモリマップドレジスタへのアクセス

は、私は、このシナリオがどのように見えるかと思いメモリで

、それを行うための私のアプローチです。 enter image description here

void increment_reg(){ 

int c;//to save the address read from memory 
char *control_register_ptr= (char*) 0x1ffff670;//memory mapped address. using char because it is 8 bits 

c=(int) *control_register_ptr;// reading the register and save that to c as an integer 
c++;//increment by one  
*control_register_ptr=c;//write the new bit pattern to the control register 
} 

は、このアプローチは正しいですか?どうもありがとう。

+2

大丈夫ですが、ポインタを「揮発性」にしたい場合があります。 – Cornstalks

答えて

1

あなたのアプローチはほぼ正しいです。唯一欠けている部分 - 質問にコメントで指摘したように - そうのようなポインタ型にvolatileを追加します

volatile unsigned char * control_register_ptr = ... 

それは通常、より良いフィット感ですので、私はまた、それunsigned charになるだろうが、それはです基本的にそれほど違いはありません(値をシフトする際に意味のある違いがあります)。

キーワードvolatileはコンパイラに対して、そのアドレスの値がプログラム外から変更される可能性があることを示しますコンパイラーはそれについては認識していません)。これは、例えば、ロードやストアを最適化するためにコンパイラーをより控えめにします。

関連する問題