在 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 架构
查看通用寄存器 GPRs 是 ALU 的输入,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 频率,一切都会好起来的。您只关心应用程序消耗的周期
内存越大解码延迟越大;那为什么寄存器文件是内存的一部分呢?
是否仅表示寄存器是存储在微处理器内部的“映射”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 架构
查看通用寄存器 GPRs 是 ALU 的输入,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 频率,一切都会好起来的。您只关心应用程序消耗的周期