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

Все программные таймеры остановились после правки одного колбэка

В проекте десяток программных таймеров FreeRTOS: мигание, таймауты протокола, опрос кнопок. В колбэк таймера отправки телеметрии добавили:

void telemetry_cb(TimerHandle_t t) {
    xSemaphoreTake(modem_mtx, portMAX_DELAY);
    modem_send(buf, len);   /* до 2 с */
    xSemaphoreGive(modem_mtx);
}

Теперь периодически замирают сразу все таймеры, в том числе не связанные с модемом. Почему?

  • Все колбэки идут в одной задаче службы таймеров
  • Мьютекс нельзя брать внутри любой функции ОС
  • Колбэк таймера исполняется в прерывании SysTick
  • Таймеры сбрасываются при захвате любого мьютекса

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

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

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

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