访问内存映射寄存器

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 关键字向编译器表明,该地址的值可能会从程序外部更改(即通过编译器看不到和不知道的代码)。这将使编译器在例如,优化加载和存储。

【讨论】:

以上是关于访问内存映射寄存器的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件映射到内存?

Linux内存映射原理

操作系统之用户级线程

干货|STM32寄存器版的基础知识—内存映射

从内存映射寄存器中读取

嵌入式 linux基于arm中,其中的 内存映射 是啥意思?具体完成啥过程?一定采纳