我试图在没有阻塞主循环的情况下触发每x个量的函数,我看到了一些示例代码来执行此操作,请参阅下面的代码:
// Interval is how long we wait
// add const if this should never change
int interval=1000;
// Tracks the time since last event fired
unsigned long previousMillis=0;
void loop() {
// Get snapshot of time
unsigned long currentMillis = millis();
Serial.print("TIMING: ");
Serial.print(currentMillis);
Serial.print(" - ");
Serial.print(previousMillis);
Serial.print(" (");
Serial.print((unsigned long)(currentMillis - previousMillis));
Serial.print(") >= ");
Serial.println(interval);
if ((unsigned long)(currentMillis - previousMillis) >= interval) {
previousMillis = currentMillis;
}
}
现在发生以下情况:
TIMING: 3076 - 2067 (1009) >= 1000
TIMING: 4080 - 3076 (1004) >= 1000
TIMING: 5084 - 4080 (1004) >= 1000
TIMING: 6087 - 5084 (1003) >= 1000
TIMING: 7091 - 6087 (1004) >= 1000
为什么currentMillis每次循环都会变得更高?看起来它正在共享一个指针或类似的东西,因为它每次都会添加间隔值。我很困惑!
答案 0 :(得分:3)
我认为您提供给我们的代码是关于您在 Arduino 上传的内容的不完整图片,因为在我的设备上我获得了以下序列
TIMING: 0 - 0 (0) >= 1000
TIMING: 0 - 0 (0) >= 1000
TIMING: 1 - 0 (1) >= 1000
TIMING: 32 - 0 (32) >= 1000
TIMING: 93 - 0 (93) >= 1000
TIMING: 153 - 0 (153) >= 1000
TIMING: 218 - 0 (218) >= 1000
TIMING: 283 - 0 (283) >= 1000
TIMING: 348 - 0 (348) >= 1000
TIMING: 412 - 0 (412) >= 1000
TIMING: 477 - 0 (477) >= 1000
TIMING: 541 - 0 (541) >= 1000
TIMING: 606 - 0 (606) >= 1000
TIMING: 670 - 0 (670) >= 1000
TIMING: 735 - 0 (735) >= 1000
TIMING: 799 - 0 (799) >= 1000
TIMING: 865 - 0 (865) >= 1000
TIMING: 929 - 0 (929) >= 1000
TIMING: 994 - 0 (994) >= 1000
TIMING: 1058 - 0 (1058) >= 1000
TIMING: 1127 - 1058 (69) >= 1000
TIMING: 1198 - 1058 (140) >= 1000
TIMING: 1271 - 1058 (213) >= 1000
TIMING: 1344 - 1058 (286) >= 1000
根据您提供的代码,这听起来是正确的。
您确定您的原始源代码中是否有 sleep()调用?
(也许您没有在设备上上传更新的代码?)
答案 1 :(得分:2)
为了扩展@ patrick-trentin的答案,很可能你的代码不是你在Arduino上运行的唯一东西。您在草图中看到的代码永远不是arduino运行的唯一代码。它为您处理串行数据传入,如果您使用其他一些模块(如SPI或网络),它还有其他一些在ISP中运行的代码,这些代码是使用定时器定期运行的。
但是arduino CPU无法并行运行代码。为了模仿并行行为,它实际上是停止你的主循环,运行一个子程序(ISP),它将读取通过串行传入的字节(例如),缓冲它然后使用一个很好的方法使它可用于你串行对象。
因此,在基于这些中断的子程序中执行的操作越多,您循环主循环的频率就越低,让它在millis()比较中通过的次数越少。