ESP32 DualCore проблема с millis

Некоторое время назад что-то произошло с библиотеками Arduino. Программы, которые ранее компилировались, стали сообщать об ошибках на стадии компилирования. На одной из плат был загружен скетч, из тех которые сейчас не компилировались. Включение этой платы, естественно, привело к правильной работе скетча.
В результате попыток восстановить работу скетчей столкнулся с проблемой использования millis в задаче, явно использующей два ядра платы.

if(millis()- last_time > time_period) //-n_mean*time_interval_mean) 
   {    last_time=millis(); 
    Receiv=true;
    digitalWrite(led1, HIGH);
    delay(1000);
    digitalWrite(led1, LOW);
    Serial.println(1);
}

Это тело одной из задач, приводит после запуска к сообщению в Сериал

   Connected to ASUS_RPT
IP address: 192.168.2.168
File name = /2024-6-18
ZONE T="18 10 1"

Task1 running on core 0
Task2 running on core 1
1  // Это верное начало программы
E (17406) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time:
E (17406) task_wdt:  - IDLE0 (CPU 0)
E (17406) task_wdt: Tasks currently running:
E (17406) task_wdt: CPU 0: Task1
E (17406) task_wdt: CPU 1: loopTask
E (17406) task_wdt: Aborting.

Если //if(millis… и убрать delay то все идет правильно. С заданным шагом выдается единица. Во втором ядре задача такая же, но без вывода.

В последней строчке опечатка. “вставить delay”

Задача должна отдавать управление ядру. В противном случае она считается зависшей.
Отдавать можно через vTaskDelay, либо всякие процедуры, которые умеют ждать семафора и т.д.
delay() - это обёртка вокруг vTaskDelay. Так что delay(1) крайне рекомендуется применять в любом цикле.

Вышла новая версия пакета ЕСП32 для Ардуино. Номер версии 3.000 и она не полностью совместима с версиями 2.хх
На гитхабе есть мануал по переходу с версии 2.х на версию 3

где в этом коде что-то, что использует два ядра?

В теме указано, что приведено содержание одной задачи, вторая (указано) такая же, но без вывода.
Могу привести весь код, но не хотелось перегружать переписку.

А как вернуться с 3.0 на то, что было раньше?

To sadman44:
Раньше все работало без явной передачи управления. Плата же 2-х ядерная. Заданы установочные параметры задач: имена, приоритеты, стеки, блокировки. И тексты исполняемых частей. И все работало несколько месяцев. При освоении были трудности и с именами и с блокировками, но все заработало в комплексе с SD, esp_now, email и измерениями onewire и т.п.

Удивительное рядом.

Нашел решение у нас на сайте ESP32 - using 2nd core - #3 by mrburnette - Programming Questions - Arduino Forum
Своеобразная структура задачи, но работает и с вставленными мной if(mills
В результате работают три задачи: 2 по ядрам и одно в loop Вывод в Сериал выглядит так

Task 1 complete running on Core 0 Time = 1007 mS
Task 2 complete running on Core 1 Time = 2007 mS
Task 1 complete running on Core 0 Time = 1009 mS
Task 1 complete running on Core 0 Time = 1009 mS
Task 2 complete running on Core 1 Time = 2000 mS
Task 1 complete running on Core 0 Time = 1009 mS
Task 1 complete running on Core 0 Time = 1009 mS
Task 2 complete running on Core 1 Time = 2000 mS
Task 1 complete running on Core 0 Time = 1009 mS
Task 0 complete running on Core 1 Time = 7000 mS
Task 1 complete running on Core 0 Time = 1009 mS

ESP32 - using 2nd core - Programming Questions - Arduino Forum Это правильная ссылка на источник. В нем не используются if(millis а только иллюстрируется работа трех задач.

Уже и эта устарела ))

Через менеджер плат - выбрать нужную версию

Как будто loop() не в ядре крутится ))

ЗЫ: я, конечно, может чего и не понимаю, но зачем в задачах под FreeRTOS использовать миллис?

Использование if(millis возникло у меня исторически, при разделении счетной части и веба при использовании esp_now. Иначе не получалось. Теперь вопрос, что позволило программе DualCore работать верно. include <Streaming.h> ? Будет ли работать исходный пример?

Миллис нужен в однопоточных системах, чтобы delay() не останавливал работу МК. При использовании FreeRTOS каждая задача сама по себе является потоком, и delay() будет замораживать только свой поток, не мешая работать остальным. Поэтому миллис тут не нужен от слова совсем

даже помогая

Использование if(millis позволяет точно следить за временем исполнения, которое при использовании delay зависит как от delay так и от времени выполнения операции, которое может быть разным.

В вашем условии проверяется, что прошло времени больше, чем time_period. И где тут точность? Может быть как и time_period так и time_period * 5

И само использование millis на ESP32 не может выдавать ошибки.

Так как все сосредоточено по задачам, то сравнение < и <= могут отличаться только на 1 мсек.