• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Обсуждение ESP32 периодически зависает

pvvx

Активный участник сообщества
Похоже вы нас обманываете:
Код:
#include "esp_system.h"

const int wdtTimeout = 30000;  //time in ms to trigger the watchdog
hw_timer_t *timer = NULL;

void IRAM_ATTR resetModule() {
  ets_printf("millis = %u\n", millis());
  ets_printf("reboot\n");
  esp_restart_noos();
}

void setup(void) {
  Serial.begin(115200);
  Serial.print("SDK version:  ");
  Serial.println(ESP.getSdkVersion());
  timer = timerBegin(0, 80, true);                  //timer 0, div 80
  timerAttachInterrupt(timer, &resetModule, true);  //attach callback
  timerAlarmWrite(timer, wdtTimeout * 1000, false); //set time in us
  timerAlarmEnable(timer);                          //enable interrupt
  timerStart(timer);
}

void loop(void) {}
Код:
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (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:956
load:0x40078000,len:0
load:0x40078000,len:13076
entry 0x40078a58
SDK version:  v3.1-dev-239-g1c3dd23f-dirty
millis = 30029
reboot
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (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:956
load:0x40078000,len:0
load:0x40078000,len:13076
entry 0x40078a58
SDK version:  v3.1-dev-239-g1c3dd23f-dirty
millis = 30029
reboot
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (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:956
load:0x40078000,len:0
load:0x40078000,len:13076
entry 0x40078a58
SDK version:  v3.1-dev-239-g1c3dd23f-dirty
...
 
Зачем мне обманывать? Вот файл примера собаки и скриншот mqtt spy где видно, что есп в подвале перезагружалась 50 раз, а на столе 1.
 

Вложения

Скетч я собирал из разных примеров, говорю же что не понимаю зачем нужны некоторые строки. Mqtt spy как то не понятно работает, количество месаджей от первой есп уменьшилось, но видно что последнее 20 минут назад было, вторая так и не перезагружалась.
 

Вложения

pvvx

Активный участник сообщества
Скетч я собирал из разных примеров, говорю же что не понимаю зачем нужны некоторые строки. Mqtt spy как то не понятно работает, количество месаджей от первой есп уменьшилось, но видно что последнее 20 минут назад было, вторая так и не перезагружалась.
Где вы там видите кол-во перезагрузок (рестартов) модуля?
 
Ну это может быть и реконнект, но пока не вставил ватчдог - модуль зависал периодически, пока в ручную не перезагрузишь.
 

Алексей.

Active member
Описание у WDT на IDF есть и там описано что надо сделать, чтобы он возник. Ваша ситуация не при этих делах. Она не останавливает переключатель задач в RTOS на время более WDT и других ситуаций не происходит, типа while(1); в аппаратном прерывании.
Переключение не останавливает, я добавил while(1) в таске на ядре 0
получил
Task watchdog got triggered. The following tasks did not reset the watchdog in time:
- IDLE (CPU 0)
Tasks currently running:
CPU 0: fake_task
CPU 1: IDLE

Те такки, которые на этом же ядре запущены, продолжают работать но тормоза жуткие :)
Оставил while(1) на ядре 0, остальные запускал на ядре 1 и без тормозов.
 

pvvx

Активный участник сообщества
Переключение не останавливает, я добавил while(1) в таске на ядре 0
получил
Task watchdog got triggered. The following tasks did not reset the watchdog in time:
- IDLE (CPU 0)
Tasks currently running:
CPU 0: fake_task
CPU 1: IDLE
Это в каком режиме WDT? (В нем в Idle стоит сброс WDT?)
Те такки, которые на этом же ядре запущены, продолжают работать но тормоза жуткие :)
Оставил while(1) на ядре 0, остальные запускал на ядре 1 и без тормозов.
А что там мешает работать задачам с большим приоритетам(?).
Если запустить другую задачу приоритетом выше типа { delay(1000); wdt_reset() } то тоже перезагрузится?
 
Последнее редактирование:

Алексей.

Active member
pvvx,
[*] Interrupt watchdog
(300) Interrupt watchdog timeout (ms)
[*] Also watch CPU1 tick interrupt
[*] Initialize Task Watchdog Timer on startup
[ ] Invoke panic handler on Task Watchdog timeout
(5) Task Watchdog timeout period (seconds)
[*] Watch CPU0 Idle Task
[*] Watch CPU1 Idle Task
 

pvvx

Активный участник сообщества
Т.е. две задачи:
{ while(volatile flg) ; } приоритет N
{ delay(1000); wdt_reset() } приоритет N + C
Вызовут WDT с перезагрузкой? :confused:
---
По идее не должно такого быть и угадывать на каком ядре идет длительная задача так-же...
Вот если запретить выполнение других тасков (остановить RTOS или запретить все прерывания) и засесть в этой задаче на время срабатывания WDT, то оно обязано случиться.
PS: я тут просто намечаю, куда лучше запихать сброс WDT в rtlDuino, чтобы как-то оптимальнее было... Простой сброс WDT в Idle мне не нравится - постоянно на него нарывается, когда система нагружена на 100%...
 
Последнее редактирование:
Сверху Снизу