Arduino运行一行代码

时间:2017-03-10 14:18:04

标签: c++ arduino

Arduino运行一行代码需要多长时间?或者从模拟引脚读取模拟值?

我尝试使用此代码来读取模拟读取时间:

void setup() {
  Serial.begin(9600);
  t1 = micros();
  val = analogRead(pin);
  t2 = micros();
  Serial.print(t2-t1);
}

它打印208微秒,但我在表格中读到的是读取模拟输入需要100微秒。我的代码有问题吗?

此代码用于读取单行代码的执行时间:

void setup() {
  Serial.begin(9600);
  t1 = micros();
  int x = 1 + 2;
  t2 = micros();
  Serial.print(t2-t1);
}

显示0微秒。这里发生了什么?我做错了什么?

2 个答案:

答案 0 :(得分:4)

一行Arduino代码没有固定的执行时间。

delay(1000);需要大约一秒钟才能运行,而Serial.print("Hello, World!");可能需要几百微秒才能运行。

这取决于线路的作用。单行Arduino代码可能会转换为1行或多行汇编代码。

Arduino代码中的简单for循环:

for (i=0; i<100; i++) {
    p[i] = i;
}

可能会在汇编代码中成为这个:

LDI     R19,0x00
MOVW    R30,R24
ST      Z+,R19
SUBI    R19,0xFF
CPI     R19,0x64
BRCS    PC-0x03

这也无法解决您的问题,因为汇编代码行不一定具有相同的执行时间。

你唯一能做的就是计算你感兴趣的部分。

回答您列出的具体示例:

示例1

void setup() {
  Serial.begin(9600);
  t1 = micros();
  val = analogRead(pin);
  t2 = micros();
  Serial.print(t2-t1);
}

val = analogRead(pin)的速度取决于几个因素。将值存储到寄存器(val =)将需要1个指令周期。从analogRead(pin)缓冲区读取模拟值(PIN)将需要一些指令。

示例2

void setup() {
  Serial.begin(9600);
  t1 = micros();
  int x = 1 + 2;
  t2 = micros();
  Serial.print(t2-t1);
}

int x = 1 + 2;执行0微秒的原因是编译器优化了您编写的代码。由于变量x从未在其范围内使用,因此编译器只删除此行。这意味着这条线不在Arduino上,因此不会执行。所以你实际做的是:

void setup() {
  Serial.begin(9600);
  t1 = micros();
  t2 = micros();
  Serial.print(t2-t1);
}

即使它没有删除该行,添加的常量,即1 + 2也将优化为3,加法操作永远不会发生在Arduino上。

答案 1 :(得分:0)

每行代码(在高级语言中称为语句)不会花费相同的时间来执行。

用极其简化的语言:

编译器将每个“语句”转换为机器代码“指令”的数量。指令数取决于声明。

例如:

x = a + b;
y = p + q + r + s;

在上面的例子中,第一个语句需要的指令少于第二个语句。

在RISC处理器(例如Arduino中使用的处理器)上,每条指令通常只需一个指令周期。因此,可以安全地假设每条指令花费相同的时间来执行。

附加说明:

val = analogRead(pin);

是对函数的调用,而函数又包含多个语句,这些语句被转换为多个指令。

int x = 1 + 2;

是一个简单的语句,将由编译器转换为许多指令。

我希望我已经涵盖了相关的基础知识。