我正在尝试熟悉AVR微控制器。我对内存映射寄存器的实际功能有些困惑。
我正在使用avr-libc和C语言进行编程。查看avr-libc源代码,有许多内部寄存器,可通过写入/读取SRAM位置进行访问。当我写入寄存器的存储位置时,SRAM中的该字节实际上是否会被覆盖,然后异步复制到寄存器中?
谢谢!
答案 0 :(得分:0)
每个特殊功能寄存器(SFR)实际上都不可能具有SRAM中的一个字节。许多寄存器具有未实现的位,或具有只读位,或者是通过写入1清除的位,或者在从它们进行读取或写入时执行的操作完全特殊。芯片设计人员将需要定制电路来实现所有这些行为。在其前面放置一个实际的RAM字节只会增加复杂性和成本。
仅因为您可以使用同一组AVR指令从RAM和SFR读取和写入,但这并不意味着这两种类型的存储器存储数据的方式相似。它们更有可能只是连接到同一总线的两种不同类型的设备。
但是,由于AVR芯片的硅设计不是开源的,我们永远无法真正分辨。如果您问一些可以测试的东西,例如“某某某寄存器的写入生效需要多少个周期”,您会得到更准确的答案。
答案 1 :(得分:0)
简短的回答:这取决于。
长答案:当您在C语言中写入内存映射寄存器时,编译器会发出与其他任何内存访问(加载/存储/移动/等)相同的指令。处理器将像往常一样执行对地址的存储器访问,在写操作的情况下,它将把寄存器的地址写到内部总线,启用写选通,然后在数据线上输出所需的数据公交车。
这是复杂的地方。输出数据可以路由到MCU中的任何其他电路:确实可以存储在SRAM结构或FIFO中,但是可以通过锁存器和触发器将其简单地锁存或“注册”,或者甚至可以简单地将其路由没有存储的地方。在大多数情况下,写操作可能是同步注册的(可能是SRAM也可能不是SRAM),但这不能保证,因此最好在您感兴趣的特定寄存器上检查特定芯片的数据手册或参考手册。 / p>
答案 2 :(得分:-1)
当我写到寄存器的存储位置时,SRAM中的那个字节实际上是否被覆盖,然后异步复制到寄存器中?
SRAM中的字节实际上被覆盖;寄存器只是立即反映出更改。反之亦然。
您可以将那些寄存器视为SRAM位置的别名。或者,您可以将这些SRAM位置视为具有两个门的房间-一个来自走廊(SRAM总线),另一个来自另一个走廊(寄存器名称)。< / p>
根据指定的寻址模式,CPU使用不同的指令访问同一位置,但最后访问同一位置。由于CPU一次执行一条指令,因此不存在“异步”机制。无论哪种方式,位置都会被修改,并且下一条CPU指令会看到新值。
查看此问题的另一种方法是,在部分重叠的两个不同数据空间中进行思考。
为什么会这样?例如,因为能够在一个循环中引用多个寄存器可能很方便。寄存器很多,如果要全部保存,则可以通过循环寻址SRAM来实现,而不必使用许多指令依次指示每个寄存器。
您也可以在Google上搜索它,例如,我发现了这个:https://electronics.stackexchange.com/questions/165321/avr-why-io-registers-have-io-addresses-and-sram-adresses