访问内存映射寄存器
Posted
技术标签:
【中文标题】访问内存映射寄存器【英文标题】:Accessing memory mapped register 【发布时间】:2017-10-27 04:47:08 【问题描述】:假设在地址 0x1ffff670 有一个内存映射设备。设备寄存器只有 8 位。我需要获取该寄存器中的值并加一并写回。
以下是我的做法,
在记忆中,我认为这就是场景的样子。
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
这种方法正确吗?非常感谢。
【问题讨论】:
这看起来不错,但您可能希望将指针设为volatile
。
【参考方案1】:
您的方法几乎是正确的。唯一缺少的部分 - 正如问题中的 cmets 所指出的 - 将 volatile
添加到指针类型中,如下所示:
volatile unsigned char * control_register_ptr = ...
我也会设置为unsigned char
,因为这通常更合适,但这基本上没有太大区别(唯一有意义的区别是向下移动值时。)
volatile
关键字向编译器表明,该地址的值可能会从程序外部更改(即通过编译器看不到和不知道的代码)。这将使编译器在例如,优化加载和存储。
【讨论】:
以上是关于访问内存映射寄存器的主要内容,如果未能解决你的问题,请参考以下文章