假设地址为0x1ffff670的存储器映射设备。器件寄存器只有8位。我需要获取该寄存器中的值并递增1并回写。
以下是我这样做的方法,
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
}
这种做法是否正确?非常感谢。
答案 0 :(得分:2)
你的方法几乎是正确的。唯一缺失的部分 - 正如在问题的评论中指出的那样 - 是在指针类型中添加volatile
,如下所示:
volatile unsigned char * control_register_ptr = ...
我也会把它unsigned char
,因为这通常更合适,但基本上没有那么大的不同(唯一有意义的差异就是将值向下移动。)
volatile
关键字向编译器发出信号,表明该地址的值可能会从程序外部改变(即编译器看不到并知道的代码。)这将使编译器更多例如,在优化负载和存储时保守。