在 AVR 微控制器中将寄存器作为存储器的一部分有什么好处?

What is the benefit of having the registers as a part of memory in AVR microcontrollers?

内存越大解码延迟越大;那为什么寄存器文件是内存的一部分呢?

是否仅表示寄存器是存储在微处理器内部的“映射”SRAM 寄存器?

如果不是,使用寄存器的好处是什么,因为它们不会比访问 RAM 更快?此外,它们到底有什么用?我的意思是这些只是记忆的一部分,所以我不明白拥有它们的意义了。拥有它们与引用内存一样昂贵。

图片取自Avr Microcontroller And Embedded Systems The: Using Assembly and C by Muhammad Ali Mazidi, Sarmad Naimi, and Sepehr Naimi

AVR有一些间接寻址的指令,例如LD (LDD) – Load Indirect From Data Space to Register using Z:

Loads one byte indirect with or without displacement from the data space to a register. [...] The data location is pointed to by the Z (16-bit) Pointer Register in the Register File.

所以现在您可以通过将其 data-space 地址加载到 Z 来从寄存器移动,从而允许间接或索引 register-to-register 移动。当然,人们可以想到一些用法,在这种情况下,这种间接访问可以节省奇数指令。

what would be the benefit of using registers as they won't be any faster than accessing RAM?

访问通用寄存器比访问 Ram 更快

首先让我们定义在微控制器中测得的速度有多快....快意味着执行指令需要多少个周期...查看 avr 架构

查看通用寄存器 GPRsALU 的输入,GPRs 由指令寄存器控制(2 字节宽度)它保存代码存储器中的下一条指令。

让我们检查简单的指令 ADD Rd , Rr; 其中 Rd,Rr 是 GPRs 中的任意两个寄存器所以 0<=r,d<=31 所以每个 r 和d 可以重新表示为 5 位,现在打开 "AVR Instruction Set Manual" 页码 32 查看 op-code 因为这个简单的 add 指令是 000011rdddddrrrr 因为这个 op-code 是两个字节(代码内存宽度)这将在 一个周期 中获取、解码和执行(在 pipline ofcourse 的概念下)jajajajjj 只有一个周期看起来很酷对我来说

I mean these are just a part of the memory so I don't see the point of having them anymore. Having them would be just as costly as referencing memory

您建议将all ram作为ALU的输入;这是一个非常糟糕的主意:内存地址占用 2 个字节。

如果你像 Add 指令一样每条指令有 2 个操作数,你将需要 4 个字节来仅保存操作数 .. 还有 1 个字节用于运算符本身的 op-code 总共 5浪费内存的字节!

此外,这种架构一次只能获取 2 个字节(指令寄存器宽度),因此您需要花费更多的周期从代码内存中获取代码,这是浪费周期>>更慢的系统

寄存器编号只有 4 位或 5 位宽,具体取决于指令,允许每条指令 2 个,并在 16 位指令字中留出空间。

结论 GPR 的存在对于节省代码内存和程序执行时间至关重要

Larger memories have higher decoding delay; why is the register file a part of the memory then?

当cpu处理GPR时它只访问前32个位置而不是所有数据space

最终评论

不要被不同ram技术的时间图打扰自己,因为你无法控制它,那么谁有控制权?架构设计师,他们限制了您可以在该架构中使用的最大 crystal 频率,一切都会好起来的。您只关心应用程序消耗的周期