Мультизадачность на ядре ESP32-D0WD-V3

VAF

✩✩✩✩✩✩✩
15 Июл 2023
49
1
Москва
Не удалось найти примеров реальной многозадачности для платы с ядром ESP32-D0WD-V3, у котого два ядра. Найденные примеры либо сводят задачу к использованию таймеров или millis, что моделирует ситуацию с изменением неких параметров в заданные моменты времени или по достижению неких условий, либо
реальное использование двух ядер находится в примерах, использующих другие ядра, например Cortex-M0+. Может быть кто-нибудь может мне помочь? Плат с ядром ESP32-D0WD-V3 у меня несколько, приобретать новые накладно!
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,407
976
58
Марий-Эл
Нужно навялить операционку какую нибудь.
Они вроде могут поддерживать.
Пример посмотреть на сайте производителя чипов.
 

VAF

✩✩✩✩✩✩✩
15 Июл 2023
49
1
Москва
Как найти этот сайт? Платы куплены в Китае на аилэкспресс и производителя я не знаю. Попробую esprive.

Через сайт espressive.com получил даташит на мой модуль, в котором его не советуют использовать. Вот так!!!!
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@VAF, а вы внимательно читали? Может, не советуют применять в новых разработках, а не вообще?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Нужно навялить операционку какую нибудь.
На ESP уже есть FreeRTOS, и от нее не избавиться. :geek:

Автору советую почитать на тему ESP FreeRTOS и т.п. Если копипастить сюда, то выйдет длинное полотно текста без картинок.

Ну или в соседнюю тему заглянуть, там на сколько помнится тоже мультипоток на разных ядрах используется: ESP, IoT - Анализатор аудиоспектра на ESP32 | AlexGyver Community
 

VAF

✩✩✩✩✩✩✩
15 Июл 2023
49
1
Москва
Насколько я понял FreeRTOS это организация последовательности исполняемых кусков. Ваше предложение посмотрю.
 

bort707

★★★★★★✩
21 Сен 2020
3,056
910
@VAF,
так у вас иначе и не получится. Не надейтесь получить два ядра в свое единоличное пользование. На одном ядре выполняется система, а на другом WiFi - BT стэк и убрать их оттуда у вас не выйдет.
Так что в любом случае ваши приложения будут выполнятся в режиме разделения времени с другими задачами. Ситуация от числа ядер не особо зависит.

Вы бы задачу поподробнее описали. Зачем вам обязательно " реальная многозадачность" понадобилась? А то такие вопросы несколько "с душком". Обычно мультизадачностью интересуются юзеры, которые не смогли совместить несколько процессов с помощью таймеров и миллис.
 

VAF

✩✩✩✩✩✩✩
15 Июл 2023
49
1
Москва
Что касается "соседней" темы, то это, похоже, то, что мне нужно. Компиляция прошла почти полностью. Пришлось изменить только начала работы с вафй и вебом. Теперь надо убрать мне не нужное и вставить нужное. Но это завтра.
Удивительно, что в преамбуле задачи стоит сегодняшное число!
 

bort707

★★★★★★✩
21 Сен 2020
3,056
910
@VAF,почитал вашу тему про двигатели и увидел, что угадал. Причина интереса к ядрам - то что вы даже светодиод не смогли заставить работать с миллис.
Интересно, что вы будете делать , если понадобится выполнять три задачи - искать контроллер с тремя ядрами?:)

Это тупиковый путь. Лучше попытайтесь понять миллис.
 

bort707

★★★★★★✩
21 Сен 2020
3,056
910
@VAF у меня есть пример без таска - BlinkWithoutDelay в ардуино. Работа сним внутри таска ничем не отличается от работы в обычной ардуине.
 

VAF

✩✩✩✩✩✩✩
15 Июл 2023
49
1
Москва
Без расщпления по ядрам не интересно. Пример с двумя светодиодами и предлагался для иллюстрации работы с двумя ядрами.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@VAF, ну, если прям вот надо конкретные куски кода распихивать по конкретным ядрам - тут ассемблер в помощь. На Си такое без костылей не сделать.
 
Изменено:

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@VAF, так я и не говорил, что прям весь код нужно на ассемблере писать. Я имел ввиду, что распределить куски по ядрам одними средствами Си не выйдет. В библиотеках явно есть ассемблерные вставки, которые это делают. Разбирайтесь, если интересно.
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
@PiratFox, понятное дело что не из самого Си, у ESP используется свой SDK, который также подтягивается если ее использовать как "ардуину".

Чтобы на голом Си писать под есп это нужно длинную бороду иметь.
 
  • Ахах! +1
Реакции: PiratFox

bort707

★★★★★★✩
21 Сен 2020
3,056
910
Без расщпления по ядрам не интересно.
для этого пример изменять не нужно. Берете стандартный блинк и запмхиваете его в нужное ядро.
Но это не интересно. Запустить два светлдиода на двух ядрах и дурак сможет. Интересное начнется тогда, когда вам понадобиться запустить два светодиода на одном и том же ядре.
Вот чему вам надо учиться.
 

VAF

✩✩✩✩✩✩✩
15 Июл 2023
49
1
Москва
Много советов - отвечать трудно, так как моя проблема возникла из-за недостатка у меня опыта. Я не справился с опросом состояния светодиода. Оказалось, что естественный способ (digitalRead) очень капризен. В различных форумах это широко обсуждается и предлагается самый надежный способ - это сохранять назначенное значение в специальной переменной. После того, как я это использовал, все работает в двух ядрах.
Чтобы на одном ядре запутить два светодиода, масса предложений в интернете, все они работают.

В результате совместной борьбы с arduino для двух светодиодов получилось достаточно красиво, просто и понятно. Прицеплено.
 

Вложения

Bruzzer

★★★✩✩✩✩
23 Май 2020
473
133
красиво, просто и понятно.
Не разбираюсь в мультизадачности поэтому с точки зрения дилетанта
  • такого размера скетч можно было бы вставить под спойлер.
  • нет комментариев на не очевидные места:
Зачем delay(500); после создания задачи
Почему размер стека под моргание светодиодом 10000
Зачем морганию светодиода высший приоритет
Почему в функции задачи используется millis а не delay
Комментарии /* Указываем пин для данного ядра / / Указываем пин для этой задачи */ - Это что ???
 

VAF

✩✩✩✩✩✩✩
15 Июл 2023
49
1
Москва
Параметры сохранены из образца с task, они случайны. milis демонстрирует отсутствия потерь времени. Часть комментариев осталась от образца, кому-нибудь могут помочь. Под спойлер вставить не умею. Пытался, не получилось, бросил и пытаться.
 

poty

★★★★★★✩
19 Фев 2020
3,230
940
@VAF, этот "пример" вообще ничего не демонстрирует и работал бы точно так же при запуске его на одном ядре. Насколько я помню, в оригинале один из процессов блокировался, тогда работа второго показывала, что он продолжал выполняться на другом ядре без влияния блокировки на первом.
Я бы также посмотрел, как в этом случае организован класс Serial. Он управляет одним аппаратным ресурсом, поэтому выполняемый код должен располагаться на одном ядре. То есть блокировка этого ядра, по-идее, должна блокировать обе процедуры, так как они используют Serial.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
Зачем морганию светодиода высший приоритет
На самом деле не высший, а даже ниже среднего. Но это все определяется структурой приоритетов программы.
Максимальный приоритет вроде как 5 (задается в конфиге), и его крайне не рекомендуется использовать, поэтому по умолчанию высший приоритет 4.