สอบถามการเกิด watchdog ครับ

สอบถามหน่อยครับ การใช้ mutitasking ของ esp 32 ครับ เรื่องมีอยู่ว่า ผมได้ลองรันโค้ดชุดนี้แล้วลองเปลี่ยน core การรันดู โดยใน core 0 ให้ทำงาน ใชถ้ามีการกดสวิตช์ แต่ปรากฎว่า ถ้าไม่กดสวิตช์จะเกิดปัญญา watch dog คือ ถ้าเงือนไขเป็นเท็จนิจะเกิดปัญหานี้ทันที แต่ถ้าให้กดสวิตช์ค้างไว้ตลอด จะไม่เกิดปัญหา watch dog เกิดขึ้น ผมจึงอยากถามว่ามีหลักเกณฑ์ยังไงในการเลือกใช้ฟังก้ชั่นแบบ mutitasking เพื่อไม่ให้เกิดปัญหา watch dog ครับ

#include <WiFi.h>
#include "time.h"
const byte core0 = 0;
const byte core1 = 1;
const byte pushButton =25;
const byte led =26;
const char* ssid       = "NYELOOGBALL";
const char* password   = "egat593618";
const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600 * 7;
const int   daylightOffset_sec = 3600;
void coreTask0( void * pvParameters )
{
  pinMode(led, OUTPUT);
  for (;;)
  {
    digitalWrite(led, !digitalRead(led));
    Serial.println("CoreTask0 running on core " + String(xPortGetCoreID()));
    delay(1000);
  }
  vTaskDelete(NULL);
}
void coreTask1( void * pvParameters )
{
  pinMode(pushButton, INPUT);
  for (;;)
  {
    if (digitalRead(pushButton) == HIGH)
    {
      Serial.println("Push Button");
      Serial.println("CoreTask1 running on core " + String(xPortGetCoreID()));
      delay(1000);
    }
  }
  vTaskDelete(NULL);
}
void printLocalTime()
{
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}
void setup()
{
  Serial.begin(112500);
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" CONNECTED");
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
  xTaskCreatePinnedToCore(coreTask0, "coreTask0", 10000, NULL, 1, NULL, core1);
  xTaskCreatePinnedToCore(coreTask1, "coreTask1", 10000, NULL, 1, NULL, core0);
}
void loop()
{
  printLocalTime();
  Serial.println("Loop running on core " + String(xPortGetCoreID()));
  delay(1000);
}

watch dog

ขอตั้งกระทู้ Multitasking for ESP32 ครับ

Remy_Martin (Permpol Thanapunnamas) May 15, 2020, 3:53pm #2

หมายึงตรงนี้หรอครับ

mooamam May 16, 2020, 7:17am #3

ผมได้แบ่ง core ทำงานออกเป็น 2 core โดยที่ core 1 กับ core 0 โดย core 1 จะทำในส่วนของ ฟังก์ชัน void setup, void loop,และ void coreTask 1 ส่วน core 0 จะทำในส่วนของ ฟังก์ชั่น void coreTask0
ถ้าแบบนี้จะปกติดี แต่พอผมลองเปลี่ยนให้ ฟังก์ชั่น void coreTask 1 มาทำงานใน core 0 ซึ่งฟังก์ชั่น void coreTask 1 จะทำเกี่ยวกับการเช็ค การกด push button

mooamam May 16, 2020, 8:18am #7

ขอบคุณมากครับ

Remy_Martin (Permpol Thanapunnamas) May 16, 2020, 4:06pm #4

ลองเพิ่มดีเลย์ดูครับ

image

mooamam May 16, 2020, 8:10am #5

หายแล้วครับ เป็นเพราะอะไรเหรอครับ

Remy_Martin (Permpol Thanapunnamas) May 16, 2020, 8:16am #6

เหมือนว่า เวลา มันเป็น false ลูปมันทำงานเร็วเกินไปครับ ซึ่ง ถ้าเป็นใน arduino มันอาจจะไม่มีปัญหา แต่ตระกูล NodeMCU มันเป็นตัวจับแล้วปล่อย wifi อยู่แล้วมันจะเน้นเรื่องการจับ wifi เป็นหลักมันถึงใส่ watchdog มาเพื่อเคลียร์ โปรแกรมในกรณีที่ มีบ้างลูป( coreTask 1 )ไปรบกวน loop การจับ WiFi หรือทำใหม่ loop นี้ไม่เสถียร ครับ

ขอบคุณมากครับ