为异步Web服务器设置esp32时,void loop()中是否可以有代码?

When setting up a esp32 for an asynchronous web server, can there be code within the void loop()?

我有 运行 几个示例,当使用 esp32 作为异步 Web 服务器时,这些示例实际上没有在 void loop() 部分中编写任何代码。只是好奇在我开始设计一些东西之前我是否可以 运行 其他代码。

是的。

ESP32 的 Arduino 核心 运行 超过 ESP-IDF (Espressif IoT Development Framework). ESP-IDF uses a port of FreeRTOS。 FreeRTOS 提供轻量级任务。

异步网络服务器使用 AsyncTCP, which uses its own task for event callbacks. You can see the code here

loop()只是一个任务。您仍然可以在其中 运行 您自己的代码(如果您想要那么多异步,还可以创建自己的任务)。可以看到调用loop() here.

的代码

这些任务是非抢占式的 - 一次只有一个可以 运行,在任务自愿放弃对处理器的控制(使用 yield()delay() 在 Arduino 核心中)。

对于来自异步 Web 服务器的回调,您应该完成您需要做的工作,然后尽快 return - 不要在其回调中屈服或调用 delay(),否则您可能阻止 TCP 和 Web 服务器事件处理程序处理其他事件(如打开的连接或接收到的数据)。绝对不要忙着循环等待时间过去。如果您需要做任何大量工作来处理网络请求,您最好设置一个 loop() 检查的共享变量,然后在 loop().

中完成工作