为异步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()
.
中完成工作
我有 运行 几个示例,当使用 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()
.