访问内存映射寄存器

时间:2017-10-27 04:47:08

标签: c++ pointers casting memory-mapping

假设地址为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
}

这种做法是否正确?非常感谢。

1 个答案:

答案 0 :(得分:2)

你的方法几乎是正确的。唯一缺失的部分 - 正如在问题的评论中指出的那样 - 是在指针类型中添加volatile,如下所示:

volatile unsigned char * control_register_ptr = ...

我也会把它unsigned char,因为这通常更合适,但基本上没有那么大的不同(唯一有意义的差异就是将值向下移动。)

volatile关键字向编译器发出信号,表明该地址的值可能会从程序外部改变(即编译器看不到并知道的代码。)这将使编译器更多例如,在优化负载和存储时保守。