Вступить в клуб →
сложнаявопросFreeRTOS: задачи, очереди и синхронизация

Из трёх быстрых импульсов счётчика обработан только один

Прерывание датчика расхода на каждый импульс вызывает xTaskNotifyGiveFromISR. Задача:

for (;;) {
    if (ulTaskNotifyTake(pdTRUE, portMAX_DELAY) > 0) {
        total_ml += ML_PER_PULSE;
        log_pulse();   /* ~3 мс */
    }
}

При большом расходе импульсы идут чаще, чем раз в 3 мс, и расход в отчёте занижен. Прерывания при этом все отрабатывают. Где теряются импульсы?

  • pdTRUE обнуляет счётчик, а учтён лишь один импульс
  • Уведомления из прерывания не накапливаются
  • Уведомление теряется, пока задача не заблокирована
  • portMAX_DELAY пропускает часть уведомлений

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела