English 中文(简体)
任务监督小组的启动——任务没有及时重开监督员。
原标题:Task watchdog got triggered - The tasks did not reset the watchdog in time

我正试图写上一个小小小的同步网络。 让我简要描述一下情况:

我的ESP32也是一条航道。 因此,如果我与我的移动电话连接到WiFi公司,ESP32正在传播,把Pip地址和一条带有浏览器的特殊道路连接起来,就会放下一个网站。 这里展示了一个顿。 直到这一点为止,它运作良好。 现在,如果我点击那顿的话,将给一家特别机器寄送一架HTTPS网络(方法:GET)。 这一机器人回答并返回一名JSON。 这可以持续两秒。 在从JSON探测器中提取价值后,应展示这一价值。

为此,我利用以下图书馆:

我知道(用另一个图表)这三项工作没有任何问题。

Unfortunately, when I click the button, the following output appears onto my serial monitor:

Starting connection to server...
[HTTPS] begin... Path: https://192.168.4.101/api/unlock/generate_pin
[HTTPS] GET...
E (137906) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (137906) task_wdt: - async_tcp (CPU 0/1)
E (137906) task_wdt: Tasks currently running:
E (137906) task_wdt: CPU 0: IDLE0
E (137906) task_wdt: CPU 1: loopTask
E (137906) task_wdt: Aborting.
abort() was called at PC 0x400e08af on core 0

Backtrace: 0x4008cc18:0x3ffbe170 0x4008ce49:0x3ffbe190 0x400e08af:0x3ffbe1b0 0x40084f21:0x3ffbe1d0 0x4016581b:0x3ffbc120 0x400e1c66:0x3ffbc140 0x4008ab21:0x3ffbc160 0x4008932d:0x3ffbc180

Rebooting...
ets Jun 8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
Serial initial done

没有人会想到正在发生什么以及如何解决这一问题? 因此,GET的请求是正确的,收到答案吗?

我正在使用Heltec WiFi Kit 32

如能预先回答,将非常满意。

最佳做法

P.S.:请允许我最后补充我的法典:

#include <heltec.h>
#include "WiFi.h"
#include "ESPAsyncWebServer.h"

#include <WiFiClientSecure.h>
#include <HTTPClient.h>
 
const char* ssid = "MyWiFiSSID";
const char* password =  "MyWiFiPW";
 
AsyncWebServer server(80);

void setup() {

  Heltec.begin(true, false, true, true, 470E6);

  WiFi.softAP(ssid, password);
  
  IPAddress IP = WiFi.softAPIP();
  Serial.print("AccessPoint IP address: ");
  Serial.println(IP);
  
  server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){
    
    request->send(200, "text/html", "<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1" charset="UTF-8"><link rel="icon" href="data:,"><style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}.button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}</style></head><body><h1>Welcome to the Landing Page of the Web Server</h1><p><a href="/get_unlock_pin"><button class="button">Click Me</button></a></p></body></html>");
  });

  server.on("/get_unlock_pin", HTTP_GET, [](AsyncWebServerRequest *request){

    String firstpartofrawhtmlcode = "<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1" charset="UTF-8"><link rel="icon" href="data:,"><style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}.button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}</style></head><body><h2>Received Pin: </h2><h2 style="color: #FF0000">";
    String receivedPin = getPin("192.168.4.101");
    String secondpartofrawhtmlcode = "</h2></body></html>";
    String fullrawhtmlcode;
    firstpartofrawhtmlcode = firstpartofrawhtmlcode.concat(receivedPin);
    fullrawhtmlcode = firstpartofrawhtmlcode.concat(secondpartofrawhtmlcode);
    request->send(200, "text/html", fullrawhtmlcode);
  });
 
  server.begin();
}

void loop() {

}

String getPin(String ip){
    Serial.println("
Starting connection to server...");  
    WiFiClientSecure *wificlient = new WiFiClientSecure;

    HTTPClient https;
    https.setAuthorization("MyUserName", "MyPassword");

    String path = "https://" + ip + "/api/unlock/generate_pin";
      
    Serial.print("[HTTPS] begin... Path: " + path + "
");
    if (https.begin(*wificlient, path)) { 
        Serial.print("[HTTPS] GET...
");
        int httpCode = https.GET();
        if (httpCode > 0) {
          Serial.printf("[HTTPS] GET... code: %d
", httpCode);
  
          if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
            String payload = https.getString();
            Serial.println(payload);
            //Extract Pin from JSON
            String tmp = payload.substring(payload.indexOf( : ), payload.indexOf( } ));
            String tmp2 = tmp.substring(tmp.indexOf( " )+1,tmp.lastIndexOf( " )); 
            if(tmp2.substring(0,1) == "-"){
               return "-";
            }else{
               return tmp2;
            }              
          }
        } else {
               Serial.printf("[HTTPS] GET... failed, error: %s
", https.errorToString(httpCode).c_str());
        }  
        https.end();
    } else {
        Serial.printf("[HTTPS] Unable to connect
");
    }
}
问题回答

问题是如何拟定的,我假定你不知道什么是监督,也不知道它为什么会引发。 因此:

Arduino for the ESP is based on the ESP-IDF, which is used around FreeRTOS. 免费抗逆转录病毒治疗方案每个核心单位都承担一项ESLE的任务。 该机构还就这些任务设置了监督时间。 这意味着,如果这些任务的执行时间 star淡,那么,经过一段时间之后,监督员就会启动,并转述chi。 国际房联的任务在背景中做了一些重要的“家庭”工作,因此你必须给他们时间。 这些优先事项也尽可能少。 因此,如果任何任务都得到更优先的重视(例如,你的反馈),那么这些任务将首先执行,而国际发展法学会的任务将不得不等待。 因此,所有更优先的任务必须足够短,以避免引起监督。 如果这样做不可行,你必须缩短间隔,例如打电话给TaskDelay(......)或履行一些国际独立组织职能,这种职能太长。 在这两种情况下,目前的任务都将是睡觉,自由通勤处将承担另一项任务,如果没有其他更优先的任务等待,最终将允许身份识别和情报机构执行任务。 所有这一切都意味着,通常你书写的法典都不应使万国邮联在任何时期的100%时间超过监督时间。 此外,你可以在Arduino这样做。 这在ESP-IDF中只是可以想象的,也就是说,你必须在这一框架内进行编码,或自行对Arduino进行再造。 此外,将它从任何途径移走是坏的想法。

你们在打听“TaskDelay(......)”时,必须使用最低1分。 由于激烈的算术以及各种表述作为参数通过,它最终可能达到0,根本就不延误。

如果你真的需要执行不暂停的任务,你就不得不自行制定任务,并把它作为首要任务。 优先事项,例如:

xskCreate(一些功能,“HumanreadableNameofTask”, 4096, NUL, tskIDLE_PRIORITY, NUL);

您的职责范围如下:

<代码> 避免某些功能(避免* arg){......}

你也可以在Arduino这样做。 因此,要么把背书的代码保持在最低限度,要么把重提转为单独任务,而是把任何相关信息简单地传达给这项任务(例如使用挥发性变数和烟雾,即并行处理中通常的同步方法)。 这超出了本答复的范围。

注一不确定在Arduino的电话延迟(......)是否与TaskDelay一样有效,但可能确实如此(有一些微妙之处)。 此外,还有一种正式的方法,即“完成”另一项较低的任务,我不肯定细节。

重要:在追捕中采用拖延(例如“TaskDelay(......)”的做法,特别是时间上的退约,是一个坏的想法,因为它们阻碍(在同样的任务中)执行其他呼吁。 因此,最佳选择是将信息传递给一项单独的任务,而这项工作则以零为重(优先事项0)。 一项以零为优先的任务引发监督,其原因是,IDLE的任务也具有这一优先性,而FreeRTOS---robins所有这些任务也处于同样优先的优先地位,因此使得他们能够把执行的时间间隔在“平行”中。 但是,如果你有两项任务,有不同的前身,那么,在完成这两项任务之前,越多,就越能执行另一项任务,直到完成或要求执行时间。

最新情况:

Keeping the Arduino loop() empty, will definately trigger the wdt, because it isn t really "empty", because the loop() function is internally wrapped in an infinite loop, so the CPU consumption would actually shoot to 100% without doing anything useful. That is what is triggering the watchdog. The GET process seems to be happening asynchronously, so it is not blocking the loop() from executing.

在有人对该问题表示愤慨之后,我找到了一种非常简单的解决办法。

仅增加:#include“soc/rtc_wdt.h”入图书馆。

然后:

rtc_wdt_protect_off();    // Turns off the automatic wdt service
rtc_wdt_enable();         // Turn it on manually
rtc_wdt_set_time(RTC_WDT_STAGE0, 20000);  // Define how long you desire to let dog wait.

然后,你们需要做以下工作:rtc_wdt_feed();,以便在某些地方为狗提供食物,你认为,这确实比狗等候的时间更快。

I found this in menuconfig: CONFIG_ESP_INT_WDT_TIMEOUT_MS, along with several other relevant items as some have already mentioned, but this one caught my attention because of its description:

观察者在奇里秒停下来。 使这一比例高于自由RTOS标准

免费听器标准(FREERTOS_HZ):

The tick rate at which FreeRTOS does pre-emptive context switching.

脑膜炎的沉积为100赫兹,但你无法用不到1 000赫兹的 anything。

That being the case, the 300msec default value for CONFIG_ESP_INT_WDT_TIMEOUT_MS isn t making much sense. I changed it to 1300msec and also changed CONFIG_ESP_TASK_WDT_TIMEOUT_S to 10 seconds.

这些变化使我的情况变得更好,但是如果一个任务区太长,局势仍然ll。





相关问题
Server Error in /domain/website Application

I am getting following error while i deployed the website.. Server Error in /domain/website Application. Runtime Error Description: An application error occurred on the server. The current custom ...

Can t get anonymous access to website

I have already asked this question on ServerFault however I got very minimal replies....one to be exact. I need this issue resolved ASAP hence why I am asking on here aswell. I have a server running ...

Webserver failover

I will be running a dynamic web site and if the server ever is to stop responding, I d like to failover to a static website that displays a "We are down for maintenance" page. I have been reading and ...

What does it mean "to write a web service"?

I just asked a question about whether it was possible to write a web-page-checking code and run it from free web server, and one supporter answered and said that it was possible only if I run "a web ...

热门标签