Вкладываю задачи в прерывания. Назначаю прерываниям приоритеты. И
вызываю потом из биг лупа, их вызывает аппаратура или запускаются
друг-из-друга. Если есть несколько конкурирующих задач, то их
выполнение идёт согласно приоритетам их прерываний, с учётом групп
вытеснения. Когда все задачи в прерываниях выполнены, управление возвращается в биг луп.
P.S. Кстати, кроме биг лупа, в некоторых прерываниях есть смал лупы, обрабатывающие реальное время. Биг лупу остаётся приборка и интерфейс пользователя, каким бы он ни был.