У меня есть демо проект с десятком потоков, которые итерируются одной псевдо-очередью. В нее кладут в преываниях и из нее считывается в main цикле. Из прерываний приходят "события", которые даются всем "итераторам потоков". Например нажали клавишу, произошло EXTI прерывание от модуля клавиатуры. В нем в очередь положилось сообщение что произошло EXTI, обработались флаги. А уже поток на это начал работу с I2C для вычетки сообщения из очереди контроллера клавиатуры. Короче задумка норм. Работает все четко. Но вот конечный автомат для больших тасков разростается неимоверно и размер кода становится невыносимым как и его поддержка. Я попробовал и могу теперь говорить - что это треш) Вернее, единственнно верный метод для чего-то мега-надежного. Но требьует адского колличества времени и продумывания автомата.