【问题标题】:What happens when I write to a memory-mapped register?当我写入内存映射寄存器时会发生什么?
【发布时间】:2018-12-21 01:48:54
【问题描述】:

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

我正在使用 avr-libc 并在 C 中编程。查看 avr-libc 源代码,有许多内部寄存器可以通过写入/读取 SRAM 位置来访问。当我写入寄存器的内存位置时,SRAM 中的那个字节真的会被覆盖,然后异步复制到寄存器中吗?

谢谢!

【问题讨论】:

  • 有些邮寄地址是公寓,有些是建筑物,有些是邮政信箱。如果您注意到许多街道上的门牌号码将被跳过,偶数边将按 4s 而不是 2s 步进。地址空间的一小部分是 sram,一部分是闪存,一部分是外围控制寄存器。和一些百分比那里什么都没有。与 x86 发生的事情有历史原因不同,正常的内存空间设计不会让这些事情发生冲突。
  • 对于外围设备,当您写入控制寄存器时,您正在与像这样的 MCU 上的控制寄存器通信,那里也没有 SRAM 位置。现在,一些外围设备的控制寄存器可能碰巧用该逻辑使用的一个非常小的 sram 来实现。否则它们是用触发器实现的,或者根本没有存储空间。取决于外设和控制寄存器。
  • 不幸的是,对于第一次尝试理解这一点的系统来说,avr 与 x86 一样糟糕,因为存在不同的地址空间和寻址模式或具有重叠地址的访问模式。但只要把它想象成 123 大街和 123 大街。而不是 456 main street 是 sram 而 789 main street 是 uart control register。
  • 不要将硬件寄存器视为内存,将读取或写入此类寄存器视为对硬件的函数调用。

标签: microcontroller avr


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    但是,我们永远无法确定,因为 AVR 芯片的硅设计不是开源的。如果您询问可以测试的内容,例如“写入某某寄存器需要多少个周期才能生效”,您会得到更准确的答案。

    【讨论】:

    • OP 写了“许多内部寄存器...”,而不是“每个特殊功能寄存器”。并且 AVR 不会将 ram 的一个字节“放在”寄存器的“前面”。一切都与寻址有关,您应该知道为什么会这样。
    【解决方案3】:

    当我写入寄存器的内存位置时,SRAM 中的那个字节真的会被覆盖,然后异步复制到寄存器中吗?

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

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

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

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

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

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

    【讨论】:

    • 大多数外设根本不在 SRAM 中 - 只是相同的地址空间。一个罕见的例外是用于 USB 外围设备的双端口缓冲 RAM。
    • @YannVernier 我谈论的是 R0..R31,请参阅这张图片:i.stack.imgur.com/HDGKi.png,来自我在答案中发布的链接。当然是地址空间的问题,但是你怎么称呼有地址的,可读可写,没有副作用,掉电不保值的东西呢?它不是 RAM 还是 SRAM? :-) 将 R0..R31 视为这些 RAM 位置的别名很容易(有时也很正确,也很方便)。
    • 我们称它们为寄存器文件。 SRAM 是一个只包含内存的物理块,通常在 2D 阵列中,通常是单端口(每个周期读取或写入)。 R0..R31 是 CPU 的通用寄存器文件,您通常可以在多个位置读取并同时写入;例如MUL在一个周期内读取2个寄存器并写入2个寄存器,这对于SRAM来说是不可能的。同时,对于给定的数据量,SRAM 占用更少的硅片面积和功耗。
    • @YannVernier 我很高兴看到您对此主题的回答。也许有一些编程示例:总有一些东西可以向谁更了解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多