【问题标题】:How long does this function take?这个功能需要多长时间?
【发布时间】: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


【解决方案1】:

感谢 Martin Rosenau 的 cmets,我想我已经理解了这个问题。

确实,我设备上的时钟频率不是 16 MHz,而是 3.6864 MHz。并且调用函数也需要考虑在内。与返回函数一样,它需要执行 4 个周期。所以我们在 3.6864 MHz 的速度下不是 33 个,而是 37 个时钟周期,这非常精确地产生了 10 µs 的操作时间。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 2019-10-26
    • 2020-08-26
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多