успеет микроконтроллер выполнить все на него повешанное или слажает в
каком-нибудь критичном месте.
Куда сложней оценивать время в кооперативной операционной системе
реального времени. Тут задачка получается нетривиальной — у нас куча
процессов скачут через диспетчер. В ходе программирования задачи
навешиваешь одну за другой, как бусинки на нить — каждый процесс
обработки чего либо составляет подобную цепочку, а всего их может быть
просто тьма. Ядро же у контроллера всего одно, а значит выполнять можно
всего одну задачу за раз и если у нас в диспетчере скопится много критичных
ко времени процессов (вообще их лучше развешивать на прерывания, но
бывает и прерываний на всех не напасешься), то возможно либо
переполнение очереди диспетчера, либо превышение времени ожидания, что
тоже не праздник.
Самое западло в том, что умозрительно отлаживать такие вещи довольно
сложно. Единственный вариант — рисовать временные диаграммы запуска
каждой задачи и смотреть где у нас узкие места. Еще можно попробовать в
AVR Studio поставить Break Point на переполнение диспетчера, но студия
не сэмулирует всю ту прорву периферии, а в пошаговой отладке этого не
увидеть — да и момент надо подобрать так, чтобы все навалилось.
В один момент мне пришла в голову одна идея — а почему бы не заставить
рисовать временные диаграммы работы задач сам контроллер? Это же
просто! Берем и в диспетчере, перед вызовом задачи выставляем бит порта в
1. А когда диспетчер задач опустошается полностью, то есть выполняется
переход на Idle — сбрасываем бит в 0. В результате, у нас на выходе будет
подобие ШИМ. Если постоянно крутится Idle — будут нули перманентно.
Если же проц в поте лица гонит через себя непрерывно код, то будут
высокий уровнь сплошняком. А если все прерывисто — что то
ШИМообразное. Причем чем больше загрузка процессора тем выше
заполнение. Можно поставить интегрирующую RC цепочку и получим