1. Тема дня
Разница между vTaskDelay(), vTaskDelayUntil(), esp_timer, GPTimer, RMT, MCPWM/LEDC на ESP32 и TIM/Input Capture/Output Compare/DMA на STM32. Главная мысль: vTaskDelay() не является точным физическим таймером.
2. Зачем это нужно в проектах
Точное время нужно для phase timestamp, sync/PPS/20 Гц, ИК-подсветки, HIL, watchdog heartbeat, измерения задержки input -> event -> transport.
3. Теория
Четыре уровня времени:
1. FreeRTOS delay: vTaskDelay/vTaskDelayUntil, ms-level periodic tasks.
2. Software timer: esp_timer, timestamp/timeouts.
3. Hardware timer: GPTimer/TIM, точные interrupts/counters.
4. Specialized peripheral: RMT/MCPWM/LEDC/TIM PWM/Input Capture/Output Compare/DMA.vTaskDelay() означает “не выполнять задачу минимум N ticks”. Задача проснётся, когда scheduler даст CPU. Для опроса входов раз в 1-5 мс это нормально. Для точного импульса 200 мкс - нет. Для периодических задач лучше:
TickType_t last = xTaskGetTickCount();
while (1) {
do_input_poll();
vTaskDelayUntil(&last, pdMS_TO_TICKS(2));
}Timestamp на ESP32:
int64_t now_us = esp_timer_get_time();Аппаратная логика:
- Input Capture фиксирует timer counter аппаратно по фронту.
- Output Compare создаёт событие, когда counter == CCR.
- PWM + DMA позволяет менять CCR/duty без CPU на каждый фронт.
- RMT подходит для точных последовательностей импульсов.
4. Типичные ошибки
- Строить точный импульс на vTaskDelay().
- Делать I2C/MQTT/логи в timer callback/ISR.
- Ставить timestamp после тяжёлой обработки.
- Использовать один таймер для PWM, profiling, capture и scheduler без политики.
- Ловить грязный AC через input capture без Schmitt/comparator.
- Не учитывать overflow timer counter.
5. Практическое задание
Создай TIMING_POLICY.md:
# Timing policy
| Need | ESP32 tool | STM32 tool |
|---|---|---|
| Periodic task | vTaskDelayUntil | osDelayUntil |
| Timestamp | esp_timer_get_time | TIM counter |
| Precise interrupt | GPTimer | TIM update IRQ |
| PWM | LEDC/MCPWM/RMT | TIM PWM |
| Input timestamp | GPIO ISR/RMT/GPTimer | TIM input capture |
| Output event | GPTimer/MCPWM/RMT | TIM output compare |Добавь в phase_event_t: raw_sample_us, detected_us, confirmed_us, queued_us, sent_us.
6. Что почитать или попробовать дальше
ESP-IDF esp_timer, GPTimer, LEDC/MCPWM/RMT; STM32 HAL TIM; ST AN4013; практика с input capture/output compare.
Задание
Выберите механизм для: периодического housekeeping раз в 100 мс; физического импульса 200 мкс; измерения момента внешнего фронта. Объясните, чего не гарантирует vTaskDelayUntil().
Критерии самопроверки: Назовите механизм для каждой роли, отделите capture от ISR timestamp и укажите ограничение scheduler.
Показать ответ автора
Housekeeping: vTaskDelayUntil или подходящий software timer. Импульс: аппаратный timer/специализированная периферия. Фронт: аппаратный Input Capture там, где он поддержан, либо оценённая GPIO ISR. vTaskDelayUntil поддерживает период по ticks, но не устраняет scheduler/interrupt latency и не превращает задачу в физический таймер.