Arduino & IoT Academy · 课时

为什么 delay() 会阻塞一切

了解暂停如何让开发板停止响应

第 2 / 4 课13 个步骤

为什么 delay() 会阻塞一切 是 CoddyKit 上的免费 Arduino & IoT Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Arduino & IoT Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Arduino & IoT Academy 课程共包含 4 节课。

简单的暂停

delay 函数会让草图暂停指定的毫秒数。这是减慢运行速度、让闪烁变得可见的最简单方法。

delay(1000);

1000 的含义

delay(1000) 会等待整整一秒,因为数值的单位是毫秒。因此,delay(500) 是半秒,delay(2000) 是两秒。

它会让开发板停滞

问题在于:delay 会冻结一切。在等待期间,您的开发板完全不会执行其他操作,就像一个屏住呼吸的人一样。😮

错过按钮按下操作

在执行delay期间,您的开发板无法察觉按钮按下操作。如果您在暂停期间点击按钮,这次操作会直接被忽略,用户会觉得设备出了问题。

看看问题所在

这里两次检查之间有一个一秒的delay,因此在这一整秒内发生的任何按键操作,都会在下一次读取前丢失。

digitalRead(buttonPin);
delay(1000);

一次只能执行一个任务

由于delay会阻塞程序,您无法同时让 LED 闪烁并监视传感器。整个草图会作为一个任务一起等待。

连续暂停会累积

连续调用两次delay时,等待时间会直接相加。如果到处都加入暂停,您的开发板大部分时间都会处于冻结且无响应的状态。

适合简单的草图

delay并不可怕。如果程序只需要让一个 LED 闪烁,没有其他操作,那么使用它既清晰又完全没问题。

真正的目标

真正的目标是编写非阻塞草图:在计时事件的同时继续响应操作。也就是说,不要用长时间暂停冻结循环。

换个角度思考时间

您可以不暂停,而是检查已经过去了多少时间,只在经过足够时间后执行操作。在此期间,循环会继续运行。

更好的工具即将登场

很快您就会接触到millis。这是一个能够测量经过时间而不会冻结程序的时钟,真实项目正是借此保持响应能力。

快速检查

在草图中使用 delay 的主要缺点是什么?

回顾

您已经看到,delay虽然简单,却会冻结开发板,导致错过输入并阻塞其他任务。接下来,您将学习如何在不停止循环的情况下为事件计时。✨

免费开始

用 AI 导师学习 C++ — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「为什么 delay() 会阻塞一切」课时是免费的吗?

是的 — 「为什么 delay() 会阻塞一切」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Arduino & IoT Academy 课程的其余内容,请升级到 CoddyKit PRO。 Arduino & IoT Academy 课程共包含 4 节课。

「为什么 delay() 会阻塞一切」这节课中我会学到什么?

了解暂停如何让开发板停止响应 你通过在浏览器中直接运行的动手代码来练习 Arduino & IoT Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Arduino & IoT Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Arduino & IoT Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「为什么 delay() 会阻塞一切」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Arduino & IoT Academy 课中编写并运行代码吗?

能。每节 Arduino & IoT Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Arduino 中的 int、float、bool
  2. 为什么 delay() 会阻塞一切
  3. 使用 millis 不调用 delay 实现闪烁
  4. 同时运行两项任务
← 返回 Arduino & IoT Academy