FreeRTOS: две задачи
Каждая задача со своим циклом и своей задержкой. loop() при этом остаётся третьей задачей.
Что на схеме
Плата ESP32 DevKit v1, к ней подключены:
- Светодиод —
led1, цвет красный - Резистор —
r1, номинал 220 Ом - Светодиод —
led2, цвет зелёный - Резистор —
r2, номинал 220 Ом
Задействованы выводы платы: D2, GND, D4. Всего соединений на схеме: 6.
Библиотеки
Дополнительных библиотек не нужно: всё делается ядром Arduino для ESP32, которое уже стоит в сборочном окружении.
Как это устроено в коде
Основное, чем пользуется скетч:
pinMode()— назначает выводу режим: выход, вход или вход с подтяжкойdigitalWrite()— выставляет на выводе высокий или низкий уровеньdigitalRead()— читает уровень на выводеdelay()— пауза, на время которой ядро занято ожиданиемvTaskDelay()— пауза задачи, на время которой ядро отдаётся другимSerial.begin()— открывает монитор порта на заданной скоростиxTaskCreate()— отдельная задача FreeRTOS со своим стекомSerial.printf()— печатает в монитор порта с форматированием
В скетче 21 строка; свои функции: blinkTask(). Сам скетч открыт на соседней вкладке — его можно менять и запускать заново.
Что попробовать изменить
- Замените
delay()на счёт поmillis()— иloop()освободится для всего остального, что должно происходить одновременно. - Поменяйте приоритеты задач и посмотрите в монитор порта, в каком порядке они получают процессор.
- Добавьте свои
Serial.println()в интересных местах — монитор порта здесь и есть отладчик. - Перенесите деталь на другой вывод — на схеме и в коде — и убедитесь, что пример работает так же.
Смотрите также
- FreeRTOS: задачи по ядрам — У ESP32 два ядра. xTaskCreatePinnedToCore прибивает задачу к одному из них — и это видно по xPortGetCoreID().
- FreeRTOS: очередь между задачами — Правильный способ передать данные из задачи в задачу. Общая переменная без защиты рано или поздно подведёт.
- FreeRTOS: мьютекс — Две задачи пишут в один Serial. Без мьютекса строки перемешиваются посреди слова.
- FreeRTOS: сигнал из прерывания — Обработчик должен быть коротким. Он лишь отдаёт семафор, а работу делает задача.
- FreeRTOS: запас стека задачи — Переполнение стека задачи — частая и трудноуловимая авария. Запас лучше померить заранее.
схема проекта в виде текста — сюда же вставляется схема из Wokwi
Справка ↗
Схема
Сборка ещё не запускалась.
Печатайте в Serial числа — они станут графиком.
Serial.println(t); — один ряд,
Serial.printf("t:%.1f h:%.1f\n", t, h); — два с подписями.
Формат тот же, что понимает плоттер Arduino IDE.