А почему не сторожевой пёс? У меня подход такой - вся работа
крутится в прерываниях, сторожевая собака на стрёме. А в цикле
main() - только контроль состояния. Проверяю достоверность
параметров (в допусках ли), проверяю логическое состояние и его
соответствие предопределённой последовательности. Если всё в
порядке - пинаю собаку. По желанию, отсюда же, можно делать
сохранение состояния во внешнюю память или в EEPROM. Получается, что если зависнет - сбросится. Если повредится память - сбросится. Если что-то пойдёт не по плану - сбросится. Алгоритм включения после сброса - не менее сложная часть, чем контроль за исполнением.
Так пойдёт?