Ivanoff-iv писал(а):а чем код конечных автоматов тяжел?
он не столько тяжел, сколько сложен для понимания. да и получается путаным частенько после пары-тройки корретировок
Ivanoff-iv писал(а):задача сделать конструкцию, чтобы при наступании на её запоминалась позиция выполнения и подпрограмма завершалась, а при следующем запуске подпрограммы (возможно там ответная конструкция) вернуться на прежнее место выполнения кода
очень странная постановка задачи. тут на форуме не один раз сталкивался с тем, что то одному, то другому начинает хотеться то из прерывания возвращаться не туда, откуда вышел, то из функции возвращаться в другое место... то главный цикл продолжать сначала... что-то и в вашей задаче есть такое, странненькое.
viiv писал(а):Классическое переключение контекста на другую задачу
характерное для многозадачных ОС. к чему это в собственных поделках - пока не ясно. особенно, если мы говорим о малоресурсных МК типа AVR
Ivanoff-iv писал(а):допустим вылетает со старым значением, чтоб код не подвесить, тогда всё равно будет результат и его придётся обработать; а если виснет, то в это время на её уровне мы ничего не сможем делать.
давайте неспеша разберемся. если функция не виснет, то очевидно, что её результат следует обработать. и это очень правильно и логично. задача функции - сделать свои дела и сообщить наружу о результате, задача "главного" цикла - понять, что с этим результатом делать. и очень даже хорошо, когда именно так. в частности, есть и стандарты, ПРЕДПИСЫВАЮЩИЕ только так и делать, т.е. нельзя игнорировать результат функции.
а теперь вторая часть вашего рассуждения - про зависшую функцию. вы абсолютно правы, что в этом случае на уровне вызывающего такую функцию кода все подвисает. но это абсолютно не касается фоновых процессов, работающих по прерываниям, например, динамической индикации или чего-то еще. поэтому, если функция должна работать долго - пусть работает. а вот если она зависла из-за ошибки, то и в вашем случае с автоматом состояний все будет стоять колом... поэтому для случая ошибок в коде вообще все равно. и, кстати, даже ОСРВ тут ничем не поможет: даже если она сумеет прервать "зависшую" функцию, то спустя некоторое время все равно вернется в неё. и та часть кода, которая ждет результатов из этой подло зависшей функции, так никогда и не дождется его, и все ваши старания пойдут коту под хвост.