此功能需要多长时间?

问题描述

我试图弄清楚这个组装功能在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个时钟周期。推入和弹出需要2个周期,回推需要4个周期,布恩需要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的运算时间。

感谢您的帮助!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...