gpt4 book ai didi

c++ - 单行代码的Arduino运行时间

转载 作者:行者123 更新时间:2023-11-27 22:46:05 27 4
gpt4 key购买 nike

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 微秒。这里发生了什么?我做错了什么?

最佳答案

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

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

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

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 个指令周期。从 PIN 缓冲区读取模拟值 (analogRead(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,加法操作永远不会发生在阿杜诺。

关于c++ - 单行代码的Arduino运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42720526/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com