【发布时间】:2019-02-24 22:51:32
【问题描述】:
我想产生一个时钟分辨率的延迟,所以我的想法是一个接一个地有 255 个 NOP,然后跳到最后一个减去所需的延迟。所以 0 会跳过最后一个 NOP,1 会跳过最后一个 NOP,255 会跳过第一个 NOP。
我以前使用过索引函数调用,但在索引 goto 上找不到任何像这样的东西。我也想过使用 switch 语句,但似乎还有其他指令。
任何建议都非常感谢。
【问题讨论】:
-
您查看过您的 switch 语句版本生成的代码吗?
-
否 - 但它似乎索引了大约三个时钟节拍而不是一个,所以大概还有一些其他指令正在输出。我去看看
-
对 Godbolt 的快速尝试似乎产生了您正在寻找的东西:godbolt.org/z/146A5A
-
终于得到了在 AVR-Studio 上工作的汇编输出,它产生了一个指向 NOP 的 rjmp 向量表。所以每个额外的 NOP 有效地占用 4 个字节而不是 1 个字节。我期望代码是直接索引跳转到 NOP,而不是通过间接跳转表。代码是 switch(100-Batt_Percent) { case 100:__asm__ volatile__("nop");案例 99:__asm volatile__("nop"); .... 案例 1:__asm __volatile__("nop");