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() 退出。这与多线程无关,那只是库的糟糕设计。