我试图弄清楚这个组装函数在 Atmel ATmega162 上需要多长时间。原始代码注释和命名表明它应该创建 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。
我是对的还是我错过了什么?
最佳答案
由于 Martin Rosenau 的评论,我想我已经理解了这个问题。
事实上,我的设备上的时钟频率不是 16 MHz,而是 3.6864 MHz。并且通话功能也需要考虑在内。与返回函数一样,它需要4个周期才能执行。因此,我们的时钟周期不是 33 个,而是 37 个,速度为 3.6864 MHz,这恰好产生了 10 µs 的操作时间。
感谢您的帮助!
关于assembly - 这个功能需要多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63807642/