assembly - 这个功能需要多长时间?

标签 assembly delay atmega atmel

我试图弄清楚这个组装函数在 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/

相关文章:

embedded - atmega32的优点

assembly - 如何反转一个字节

c - 如何获取我的代码的结束地址

c - 自己编写的简单 memset 不适用于 ARMv7 上的 -03 eabi gcc

c++ - Arduino延迟不精确

c - union 内的数据结构(C 编程)

assembly - FSTENV?几乎找不到有关此说明的任何信息

visual-studio-2008 - 反汇编并使用 .obj 文件

c# - 如何在 C# 中创建可重新触发的延迟?

java - JTextField 在最后 2 秒内未触发更改事件后发送数据