当我写入内存映射寄存器时会发生什么?

What happens when I write to a memory-mapped register?

我正在尝试熟悉 AVR 微控制器。我对内存映射寄存器的实际功能有点困惑。

我正在使用 avr-libc 并在 C 中编程。查看 avr-libc 源代码,有许多内部寄存器由 writing/reading SRAM 位置访问。当我写入寄存器的内存位置时,SRAM 中的那个字节实际上是否被覆盖,然后异步复制到寄存器中?

谢谢!

When I write to a register's memory location, does that byte in SRAM actually get overwritten, then asyncronously copied into the register?

SRAM中的字节实际上被覆盖了;登记册只是立即反映了变化。反之亦然。

您可以将那些寄存器视为 SRAM 位置的别名。或者,您可以将这些 SRAM 位置视为 房间 和两个 - 一个来自走廊(SRAM 总线),一个来自另一个走廊(寄存器名称)。

CPU使用不同的指令访问同一个位置,取决于指定的寻址方式,但最终访问的是同一个位置。由于 CPU 一次执行一条指令,因此没有 "asynchronous" 机制;无论哪种方式,位置都会被修改,下一条 CPU 指令会看到新值。

另一种看待这个问题的方法是考虑两个不同的数据空间,部分重叠。

为什么会这样?例如,因为能够在循环中引用多个寄存器会很方便。有很多寄存器,如果你想把它们都保存下来,你可以用一个循环寻址SRAM来实现,而不是用很多指令依次指示每个寄存器。

你也可以 google,例如我发现了这个:https://electronics.stackexchange.com/questions/165321/avr-why-io-registers-have-io-addresses-and-sram-adresses

不太可能每个特殊功能寄存器 (SFR) 实际上都有可以被视为 SRAM 中的字节的内容。许多寄存器具有未实现的位,或具有只读位,或通过写入 1 来清除的位,或者在读取或写入时执行一些完全特殊的操作。芯片设计师需要定制电路来实现所有这些行为。将实际的 RAM 字节放在前面只会增加复杂性和成本。

仅仅因为您可以使用同一组 AVR 指令从 RAM 和 SFR 读取和写入,并不意味着这两种类型的内存存储数据的方式有任何相似之处。它们更有可能只是连接到同一总线的两种不同类型的设备。

但是,我们永远无法真正判断,因为 AVR 芯片的硅设计不是开源的。如果您询问可以测试的内容,例如 "how many cycles does it take for a write to such-and-such register to have an effect".

,您将获得更准确的答案

简短的回答:视情况而定。

长答案:当您在 C 中写入内存映射寄存器时,编译器会发出与任何其他内存访问相同的指令 (load/store/move/etc)。处理器将像往常一样执行对地址的内存访问,在写入的情况下,它将寄存器的地址写入内部总线,启用写入选通,然后在数据线上输出所需的数据公共汽车。

这就是事情变得复杂的地方。输出数据可能会路由到 MCU 中的任何其他电路:它确实可以存储在 SRAM 结构或 FIFO 中,但它可能只是被锁存器和触发器锁存或“注册”,或者它甚至可以简单地路由某处而不被存储。在大多数情况下,写入可能是同步注册的(可能是 SRAM,也可能不是 SRAM),但这并不能保证,最好检查数据 sheet 或您使用的特定寄存器上特定芯片的参考手册有兴趣。