Эдуард, выглядит так, будто ты умнее всех и нас учишь. А если
представить себе, что выполняется секция высокоприоритетного
прерывания интерфейса. И нужно вызвать другую, более приоритетную,
чем main() задачу, долгую, длинную функцию, но менее приоритетную
чем прерывания железа. Программному прерыванию даётся приоритет ниже приоритета аппаратных прерываний. И это программное прерывание может быть вызвано из любого кода, как из аппаратного прерывания, так и из пользовательского кода. И запретить disabe_irq (как это обычно делает продвинутый ардуинщик) - нельзя - обработка длинная, но должны обслуживаться аппаратные прерывания.
Железо принимает поток данных. И если принят очередной блок данных (команда), то в программном прерывании запускается обработчик данных (команды) и высокоприоритетное прерывание завершается, освобождая ЦП для других высокоприоритетных прерываний. А программное прерывание выполняется своим чередом промеж высокоприоритетных аппаратных. Профит - обработка команды приоритетнее usermode. И прерывания железа не блокируются. Без всяких RTOS.