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微秒。这里发生了什么?我做错了什么?
答案 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
这也无法解决您的问题,因为汇编代码行不一定具有相同的执行时间。
你唯一能做的就是计算你感兴趣的部分。
回答您列出的具体示例:
void setup() {
Serial.begin(9600);
t1 = micros();
val = analogRead(pin);
t2 = micros();
Serial.print(t2-t1);
}
val = analogRead(pin)
的速度取决于几个因素。将值存储到寄存器(val =
)将需要1个指令周期。从analogRead(pin)
缓冲区读取模拟值(PIN
)将需要一些指令。
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;
是一个简单的语句,将由编译器转换为许多指令。
我希望我已经涵盖了相关的基础知识。