【问题标题】:How to read and write memory mapped registers using keyword volatile?如何使用关键字 volatile 读写内存映射寄存器?
【发布时间】:2014-01-24 22:40:46
【问题描述】:

我在一次采访中遇到了这个问题。我没有这样的经验。

所以如果我们有两个寄存器。一个地址为 0x11111111,另一个地址为 0x22222222。我们想读和写它。第一个是 32 位寄存器,而第二个是 64 位。我们如何在 C 中做到这一点?谁能给我举个例子?

谢谢,

【问题讨论】:

  • 他们持有什么类型?
  • @self。没有把握。也许你可以假设为二进制?这有关系吗?
  • 寄存器没有地址。 C 没有寄存器。
  • @KerrekSB 也许它没有注册。假设我们要读取和写入可以通过硬件修改的那块内存。我们在内核中进行
  • 一些微控制器具有可通过地址访问的寄存器。不是全部。如果您知道您正在使用其中之一,那么如何将其作为内存寻址应该是显而易见的。如果不是,“C 没有寄存器。”

标签: c memory mapping volatile


【解决方案1】:

您可以使用某种指针或其他,例如:

#include <stdint.h>

uint32_t volatile * p = (uint32_t volatile *) 0x11111111;
uint64_t volatile * q = (uint64_t volatile *) 0x22222222;

++*p;  // read-modify-write

(请注意,这个特定示例几乎肯定是伪造的,因为这两个地址似乎都没有针对各自的类型正确对齐。)

正如您所说,如果存储在这些地址的值可以从程序外部更改,则有必要将指针限定为volatile;使用volatile,您告诉编译器不能对值做出任何假设(例如,对于易失性值,可能无法进行常量传播或公共子表达式消除)。

【讨论】:

  • 您好,我注意到您没有使用面试官提到的关键字volatile。我想可能我们需要volatile。此外,您介意告诉我为什么“两个地址似乎都没有正确对齐”。我渴望学习。
  • @HaoShen:是的,volatile 对于内存映射访问很有意义。许多架构都需要对齐(例如,四字节内存访问需要位于可被四整除的地址),但某些架构(如 x86)允许字节对齐访问,但需要额外费用。
  • 顺便说一句,如果我将 unit32_t 更改为 int 并将 uint64_t 更改为 long long。这行得通吗?
  • @HaoShen:仅当这些类型在您的平台上具有所需的位数时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
相关资源
最近更新 更多