我正在撰寫一個代碼,在 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 多執行緒中,還是在 Stack Overflow 中。
非常感謝你!
uj5u.com熱心網友回復:
通常,在不同執行緒上運行的網路和其他 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()退出。這與多執行緒無關,這只是庫的糟糕設計。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477524.html
下一篇:如何在Java中正確使用條件?
