【发布时间】:2020-09-09 08:24:50
【问题描述】:
我试图弄清楚这个汇编函数在 Atmel ATmega162 上需要多长时间。原始代码 cmets 和命名表明它应该产生 10 µs 的延迟,但我对此表示怀疑。不幸的是,我对汇编代码缺乏经验,所以我不确定我的假设是否正确。
代码如下:
Timer_Loop_10us:
push Counter
ldi Counter,5
timer_wait10us:
nop
dec Counter
tst Counter
brne timer_wait10us
pop Counter
ret
根据 ATmega 规范,ldi、nop、dec 和 tst 需要 1 个时钟周期。 push 和 pop 需要 2 个周期,ret 需要 4 个周期,brne 需要 1 或 2 个周期。我想如果 Counter = 0 需要 1 个周期,如果 Counter != 0 需要 2 个周期,因为需要跳转回标签,但我不确定。
所以如果我是正确的,整个函数需要 33 个时钟周期。 ATmega162 的 CPU 速度为 16 MHz,这意味着此功能只会产生 2 µs 的延迟,而不是 10 µs。
我是对的还是我错过了什么?
【问题讨论】:
-
大多数 CPU(不是全部)都可以使用较慢的时钟。您确定代码是针对 16 MHz 时钟而不是针对 4 MHz 时钟编写的吗?
-
老实说,我不确定,但即便如此,它也会是 8 µs,而不是 10...
-
“调用”指令需要多少个周期?调用函数时,“调用”指令(或者无论如何它在 AVR 上命名)所需的周期也是延迟的一部分......
-
你是对的,那是缺失的部分。非常邀请您将其放入我可以投票并标记为正确的答案中。
标签: assembly delay atmega atmel