|
|
1
6
可在以下位置访问AVR指令集手册: http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf
让我们看看你的代码
开头的ser、ldi和ldi指令执行3个周期,并将24位计数器设置为0x1869FF。 然后我们有一个循环。此循环的每次迭代都会将24位计数器减少1,一旦计数器达到零,循环就终止。所以循环将有0x1869FF迭代。
循环后的两条指令总共需要3个周期。
3+0x1869FF*5-1+3=8000000
编译器实现者的诀窍是选择循环要进行多少次迭代,循环之后要执行多少个RJMP,以及之后要执行多少个NOP。由于向循环中添加迭代在程序空间方面是免费的,所以您希望有尽可能多的循环迭代。由于一个rjmp占用的空间少于两个nop,所以您希望在循环之后有尽可能多的rjmp。然后你可能需要一个nop之后,使循环计数正确。 对于较短的延迟,编译器可能使用8位或16位计数器。可能只是延后了,可能是短时间的。对于非常长的延迟,它可能使用超过24位的计数器。 在某些情况下,可以通过在循环中添加几个nop来节省程序空间,因为这可能会使循环计数器变小,或者允许您在末尾删除多条指令。因此,一个真正聪明的实现应该考虑到这一点。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |