/* * irq_chain_remove — снять ОДИН обработчик кадрового прерывания из * цепочки (по указателю). Освобождение последнего слота отпускает * IM2-таблицу (_irq_table_unref → возврат IM 1, если больше никто не * держит). Идемпотентно: неизвестный/NULL handler игнорируется. */ #include "_irq.h" void irq_chain_remove(isr_t handler) { if (!handler) return; for (uint8_t i = 0; i < IRQ_CHAIN_MAX; i++) { if (_irq_chain[i] == handler) { IRQ_DISABLE(); _irq_chain[i] = 0; _irq_chain_n--; IRQ_ENABLE(); if (_irq_chain_n == 0) _irq_table_unref(); return; } } }