Core0 在 ESP32 上阻止从 Core1 到 运行 的代码(不应该同时 运行 两个代码?)
Core0 blocking code from Core1 to run on ESP32 (isn't supposed to run both code at same time?)
我正在编写代码,在 CORE1(默认内核)中,LED 应每 300 毫秒闪烁一次。在 CORE0 上,将进行 wifi 管理。
当 Blynk.connected() 为 true 时,一切都按预期运行。 LED 在 CORE1 和 CORE0 上愉快地闪烁,等待断开连接以重新连接。然而,如果 !Blynk.connected(),核心 0 将尝试重新连接互联网,当这种情况发生时,我的 LED 停止闪烁(应该继续闪烁,因为它在 CORE1 上是 运行。连接后建立后,LED returns 每 300 毫秒闪烁一次。
看起来 wm.autoConnect() 函数不仅会阻塞 CORE0,还会阻塞 CORE1。
伙计们,这是我给你们的代码:
// I won't hide these informations bellow because this is just a test. You can compile on your esp32
#define BLYNK_TEMPLATE_ID "TMPLc9VK-ym3"
#define BLYNK_DEVICE_NAME "Wifi Bluetooth ESP32 DHT Station"
#define BLYNK_AUTH_TOKEN "IzH-vvhVf0uLJaV54Ziero7kjUiFeq5g"
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
#include <BlynkSimpleEsp32.h>
#define TRIGGER_PIN 22
#define LED_PIN 23
TaskHandle_t Task1;
int timeout = 120;
unsigned long blink_timer;
unsigned long wifi_reconnect_timer;
char auth[] = BLYNK_AUTH_TOKEN;
WiFiManager wm;
void wifi_stuff( void * pvParameters ){
for(;;){
if(!Blynk.connected()){
if(millis()-wifi_reconnect_timer >= 2000){
wm.autoConnect();
vTaskDelay(10);
wifi_reconnect_timer = millis();
Serial.println("trying to reconnect to blynk");
}
}
vTaskDelay(10);
if ( digitalRead(TRIGGER_PIN) == LOW) {
WiFiManager wm;
wm.resetSettings();
wm.setConfigPortalTimeout(timeout);
wm.setEnableConfigPortal(false);
}
}
}
void setup() {
WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
Serial.begin(115200);
Serial.println("\n Starting");
pinMode(TRIGGER_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
wm.setEnableConfigPortal(false);
wm.autoConnect();
Blynk.config(auth);
Blynk.connect(1000); //blynk connect timeout
xTaskCreatePinnedToCore(
wifi_stuff, /* Task function. */
"Task1", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
0, /* priority of the task */
&Task1, /* Task handle to keep track of created task */
0);
}
void loop() {
Blynk.run();
vTaskDelay(50);
//bellow is for debug
if (millis() - blink_timer > 300){
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
blink_timer = millis();
Serial.println(Blynk.connected());
}
}
顺便说一句,我是初学者:既在 ESP32 多线程中,也在 Stack Overflow 中。
非常感谢!
通常网络和其他 I/O-intensive 代码 运行 在单独的线程上不会灾难性地干扰其他,即使 运行 在同一个核心上。这是因为任何一个线程都可能花费时间阻塞,等待某些 IO 操作完成,而其他线程可以自由执行并做一些有用的事情。从这个意义上说,您在核心之间仔细划分线程并没有太大影响。即使 运行 与 WiFi 驱动程序在同一个内核上,您也不会注意到 LED 闪烁有任何异常。当然,可能存在时间问题,这可能会导致非常敏感的实时进程出现问题 - 可能在某处延迟约 10 毫秒,但您不会用肉眼从闪烁的 LED 中看到这一点。
您的具体问题似乎是 Blynk.run()
在没有互联网连接时阻塞:https://community.particle.io/t/blynk-blocking-code-if-no-connection-to-wifi-or-cloud/36039。这反过来会导致 LED 被阻塞,直到连接恢复并且 Blynk.run()
退出。这与多线程无关,那只是库的糟糕设计。
我正在编写代码,在 CORE1(默认内核)中,LED 应每 300 毫秒闪烁一次。在 CORE0 上,将进行 wifi 管理。
当 Blynk.connected() 为 true 时,一切都按预期运行。 LED 在 CORE1 和 CORE0 上愉快地闪烁,等待断开连接以重新连接。然而,如果 !Blynk.connected(),核心 0 将尝试重新连接互联网,当这种情况发生时,我的 LED 停止闪烁(应该继续闪烁,因为它在 CORE1 上是 运行。连接后建立后,LED returns 每 300 毫秒闪烁一次。 看起来 wm.autoConnect() 函数不仅会阻塞 CORE0,还会阻塞 CORE1。
伙计们,这是我给你们的代码:
// I won't hide these informations bellow because this is just a test. You can compile on your esp32
#define BLYNK_TEMPLATE_ID "TMPLc9VK-ym3"
#define BLYNK_DEVICE_NAME "Wifi Bluetooth ESP32 DHT Station"
#define BLYNK_AUTH_TOKEN "IzH-vvhVf0uLJaV54Ziero7kjUiFeq5g"
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
#include <BlynkSimpleEsp32.h>
#define TRIGGER_PIN 22
#define LED_PIN 23
TaskHandle_t Task1;
int timeout = 120;
unsigned long blink_timer;
unsigned long wifi_reconnect_timer;
char auth[] = BLYNK_AUTH_TOKEN;
WiFiManager wm;
void wifi_stuff( void * pvParameters ){
for(;;){
if(!Blynk.connected()){
if(millis()-wifi_reconnect_timer >= 2000){
wm.autoConnect();
vTaskDelay(10);
wifi_reconnect_timer = millis();
Serial.println("trying to reconnect to blynk");
}
}
vTaskDelay(10);
if ( digitalRead(TRIGGER_PIN) == LOW) {
WiFiManager wm;
wm.resetSettings();
wm.setConfigPortalTimeout(timeout);
wm.setEnableConfigPortal(false);
}
}
}
void setup() {
WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
Serial.begin(115200);
Serial.println("\n Starting");
pinMode(TRIGGER_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
wm.setEnableConfigPortal(false);
wm.autoConnect();
Blynk.config(auth);
Blynk.connect(1000); //blynk connect timeout
xTaskCreatePinnedToCore(
wifi_stuff, /* Task function. */
"Task1", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
0, /* priority of the task */
&Task1, /* Task handle to keep track of created task */
0);
}
void loop() {
Blynk.run();
vTaskDelay(50);
//bellow is for debug
if (millis() - blink_timer > 300){
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
blink_timer = millis();
Serial.println(Blynk.connected());
}
}
顺便说一句,我是初学者:既在 ESP32 多线程中,也在 Stack Overflow 中。
非常感谢!
通常网络和其他 I/O-intensive 代码 运行 在单独的线程上不会灾难性地干扰其他,即使 运行 在同一个核心上。这是因为任何一个线程都可能花费时间阻塞,等待某些 IO 操作完成,而其他线程可以自由执行并做一些有用的事情。从这个意义上说,您在核心之间仔细划分线程并没有太大影响。即使 运行 与 WiFi 驱动程序在同一个内核上,您也不会注意到 LED 闪烁有任何异常。当然,可能存在时间问题,这可能会导致非常敏感的实时进程出现问题 - 可能在某处延迟约 10 毫秒,但您不会用肉眼从闪烁的 LED 中看到这一点。
您的具体问题似乎是 Blynk.run()
在没有互联网连接时阻塞:https://community.particle.io/t/blynk-blocking-code-if-no-connection-to-wifi-or-cloud/36039。这反过来会导致 LED 被阻塞,直到连接恢复并且 Blynk.run()
退出。这与多线程无关,那只是库的糟糕设计。