/* * irq_remove — снять ВСЮ кадровую цепочку и отпустить IM2-таблицу * (последний пользователь возвращает I/IM 1 — штатный режим DSS). * Идемпотентно; вызывается и из atexit-уборки, поэтому обязано снимать * всё разом (exit не знает про отдельные слоты). Для точечного снятия * одного обработчика — irq_chain_remove. */ #include "_irq.h" void irq_remove(void) { if (_irq_chain_n == 0) return; IRQ_DISABLE(); for (uint8_t i = 0; i < IRQ_CHAIN_MAX; i++) _irq_chain[i] = 0; _irq_chain_n = 0; IRQ_ENABLE(); /* Цепь держала РОВНО одну ссылку на таблицу (взята при первом * слоте) — отпускаем её один раз. */ _irq_table_unref(); }