如何实现在线组装" for"在Arduino中循环以获得更快的延迟微功能

时间:2015-06-03 20:02:38

标签: assembly arduino avr

我试图制作Arduino的delayMicroseconds()函数的更精确版本,最终目标是一个方波发生器,其频率可以变化到100 KHz,精度为0.2千赫。

根据我在网上找到的资源,这是我最好的尝试:

  __asm__ ("mov eax, $x");
  __asm__("beginning:");
  __asm__("inc eax");
  __asm__("cmp eax, 0x0A");
  __asm__("jne beginning");
  __asm__("mov $x, eax");

我将上面的代码输入Arduino IDE并点击"验证;"出现以下错误消息:

Arduino: 1.6.4 (Windows 7), Board: "Arduino Uno"

C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s: Assembler messages:
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:46: Error: constant value required
 C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:46: Error: constant value required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:46: Error: unknown opcode `x'
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:54: Error: constant value required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:58: Error: unknown opcode `cmp'
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:62: Error: unknown opcode `jne'
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:66: Error: constant value required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:66: Error: `,' required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:66: Error: constant value required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:66: Error: garbage at end of line
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:66: Error: unknown opcode `x'
Error compiling.

This report would have more information with "Show verbose output during compilation" enabled in File > Preferences.

我该怎么办?

1 个答案:

答案 0 :(得分:0)

使用_delay_loop_1()和/或_delay_loop_2()来自 avr-libc。 第一个可以计数到256,每次迭代需要3个周期 最多768个周期。第二个计数高达65536并且需要4 每次迭代的周期,最多262144个周期。

如果查看头文件util/delay_basic.h, 您将看到这些实现为非常简单的内联汇编(2 每个说明。