multithreading - Core0 阻止来自 Core1 的代码在 ESP32 上运行(不应该同时运行两个代码吗?)

我正在编写一个代码,在 CORE1(默认内核)中,LED 应该每 300 毫秒闪烁一次。在 CORE0 上,应进行 wifi 管理。

当 Blynk.connected() 为 true 时,一切都按预期运行。 CORE1 和 CORE0 上的 LED 愉快地闪烁,等待断开连接以重新连接。但是,如果 !Blynk.connected(),核心 0 将尝试重新连接互联网,而当这种情况发生时,我的 LED 停止闪烁(应该继续闪烁,因为它在 CORE1 上运行。建立连接后,LED 返回每 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 Multithreading 中,也在 Stack Overflow 中。

非常感谢!

回答1

通常,在不同线程上运行的网络和其他 I/O 密集型代码不会对其他线程造成灾难性的干扰,即使在同一内核上运行也是如此。这是因为任何一个线程都可能花费时间阻塞,等待一些 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() 退出。这与 multithreading 无关,这只是库的糟糕设计。

相似文章

最新文章