在本文中,我们将看到如何为AVR创建延迟。另外,我们将讨论指令流水线。
AVR的延迟计算:
在汇编语言说明中,要创建时间延迟,必须考虑两个重要因素。
- 晶振频率–
连接到XTAL1和XTAL2的晶体振荡器的频率是计算时间延迟的一个因素。指令周期的时钟周期持续时间是该晶振频率的函数。 - AVR设计–
AVR微处理器能够在一个周期内执行一条指令。有三种方法可以做到这一点。- 使用哈佛体系结构将最大数量的代码和数据输入CPU。
- 使用RISC体系结构功能,例如固定大小的指令。
- 使用流水线来重叠指令的获取和执行。
流水线:
在早期的微处理器中,CPU可以在给定时间获取或执行。换句话说,CPU必须从内存中获取一条指令,然后执行该指令,然后再次获取下一条指令,执行该指令,依此类推。流水线化允许CPU同时读取并执行给定指令。
我们可以使用管道来加快指令的执行速度。在管道中,执行过程分为多个较小的步骤,这些步骤全部并行执行。在执行指令时,我们必须确保指令序列完好无损,并且没有不同的执行方式。
AVR的指令周期时间:
CPU执行一条指令需要花费一定的时间。该时间称为机器周期。 AVR中的所有指令均为2字节或4字节,因此大多数指令执行不超过2个机器周期(某些指令可能需要3到4个机器周期来执行)。在AVR系列中,机器周期的持续时间取决于连接到AVR系统的振荡器的频率。在AVR中,一个机器周期由一个振荡器周期组成,这意味着每个振荡器时钟都会经过一个机器周期。因此,为了计算AVR的机器周期,我们采用晶体频率的倒数。
示例1:
对于给定的晶体频率,计算指令周期。
a) 8 MHz b) 16 MHz
Solution : a) instruction cycle = 1/ 8 MHz = 0.125 us (microsecond)
b) instruction cycle = 1/ 16 MHz = 0.0625 us
不同指令所需的指令周期(以1 MHz为晶振频率):
Instruction | Instruction cycles | Time to execute |
---|---|---|
LDI | 1 | 1 us |
DEC | 1 | 1 us |
OUT | 1 | 1 us |
ADD | 1 | 1 us |
NOP | 1 | 1 us |
JMP | 3 | 3 us |
CALL | 4 | 4 us |
BRNE | 2/1 | 2 us if taken, 1 us if it fails |
示例2:
如果晶振频率为10 MHz,请在下面的代码段中找到我们的延迟。
Instruction Cycles
DELAY : LDI COUNT, 0XFF 0
Again : NOP 1
NOP 1
NOP 1
DEC COUNT 1
BRNE AGAIN 2/1
RET 4
Solution : Time Delay = [1 +(( 1+ 1+ 1+ 1 + 2 ) x 255) + 4 ] x 0.1 us = 153.5 us