Все программные таймеры остановились после правки одного колбэка
В проекте десяток программных таймеров FreeRTOS: мигание, таймауты протокола, опрос кнопок. В колбэк таймера отправки телеметрии добавили:
void telemetry_cb(TimerHandle_t t) {
xSemaphoreTake(modem_mtx, portMAX_DELAY);
modem_send(buf, len); /* до 2 с */
xSemaphoreGive(modem_mtx);
}
Теперь периодически замирают сразу все таймеры, в том числе не связанные с модемом. Почему?
- Все колбэки идут в одной задаче службы таймеров
- Мьютекс нельзя брать внутри любой функции ОС
- Колбэк таймера исполняется в прерывании SysTick
- Таймеры сбрасываются при захвате любого мьютекса
