Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
68 Часть /. Общие принципы устройства и функционирования Аtте/ АVR то их и правда лучше принять с минимальными задержками, сложить в память дан ных полученные значения и .потом спокойно обработать, но это не очень частая за• дача, которую спокойно можно выделить в частный случай. Иное дело, когда есть непрерывный поток таких событий - если действительно надо непрерывно обра батывать события с частотами порядка сотен килогерц-мегагерц, то просто следует признать, что 8-битные АVR тут непригодны, и выбрать платформу пошустрее. Во-вторых, программы, состоящие из законченных подпрограмм, логика выполне ния которых не размазана по всему коду, легче составляются и отлаживаются. В непрерывных прыжках от одного потока команд к другому легко запутаться, и это является одной из главных причин возникновения трудно отслеживаемых ошибок времени выполнения у новичков. Да, программу, состоящую в основном из обработчиков прерываний, отлаживать с помощью программных эмуляторов (Atmel Studio или, например, Proteus) более трудоемко, чем линейный код в глав ном цикле, что сидит у многих привычных к этим инструментам программистов в подкорке и бессознательно заставляет их по возможности избегать прерываний. Помещение в прерывание логически законченного кода позволяет значительно об легчить эту процедуру: обработчик просто отлаживается как отдельная программа, которая затем подключается к основному коду как готовый модуль. Конечно, такая идеализированная картина достижима далеко не всегда, но стремиться к ней вполне возможно. Разумеется, мы не будем считать такой подход за догму и стремиться непременно все выполнить по прерываниям. Все зависит от удобства и конкретной ситуации - есть вполне штатные функции, которые положено выполнять именно по прерыва ниям, а мы, тем не менее, от этого откажемся, и ничего, как увидите, не потеряем. Но в целом наша концепция будет стремиться к переносу функциональности в пре рывания с минимализацией действий в основном цикле - как вы увидите далее, он частенько будет оставаться пустым . ЗАМЕТКИ НА ПОЛЯХ Нередко можно услышать мнения, противоречащие этой концепции, - чаще всего утвер ждается , что в обработчике прерывания программа должна совершить минимум необ ходимых действий и как можно быстрее выйти обратно в основной цикл . Эта точка зрения распространилась не без влияния автора [2] и абсолютно справедлива для тех, кто работает с многозадачными операционными системами для контролеров, - вы бы, конечно, тоже не захотели , чтобы запись на какую-нибудь флешку повесила вам все остальные процессы в Windows . К сожалению, читатели из целевой аудито рии не смогли отнестись к ней критически и осознать границы ее применимости - ав тор [2] , благодаря большому опыту работы на самых разных системах, всегда в пер вую очередь принимает во внимание условие переносимости кода, а семейства кон троллеров все разные, и в некоторых системах действительно полагаться полностью на прерывания было бы крупной ошибкой . Но в частных случаях одного только 8-бит ного AVR , без применения каких-то ОС и притом с ограниченным числом используе мых моделей , эти соображения практически теряют свое значение. В реальности , если говорить о конкретно АVR-контроллерах, преимущественный пе ревод кода в обработчики прерываний в большинстве случаев будет только благом. Как выразился в обсуждении этого вопроса сам автор [2] , «ПО сути дела, это бесплат ная многозадачность» . Следует только подходить к этому вопросу разумно, и ради одной только идеи не перебарщивать ни в ту ни в другую сторону.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==