Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава б. Основы программирования МКАVR 161 в пределах 1 00-300 микросекунд. А если вдруг даже такая задержка будет мешать, то всегда можно подключить к делу таймер и отсчитывать задержки с его помощью аппаратно, вообще не тормозя контроллер. Программа при этом получается слож­ нее, потому мы здесь ее не приводим, т. к. на практике такой метод требуется не­ часто (пример такой программы приведен в главе 12). ПРИМЕЧАНИЕ Напоминаю, что все эти программы на счет по нажатию (count_push.asm и count_ push_int. asm) , а также по отпусканию (count_release.asm и count_release_int.asm) вы можете найти в архиве по адресу, указанному во введении. Наверняка читатель еще далеко не во всем разобрался, и в применении некоторых команд многое ему непонятно. В последующих главах мы рассмотрим многие во­ просы подробнее, а сейчас пойдем дальше и посмотрим, что происходит с про­ граммами после того, как вы их написали и откомпилировали. Сравнение ассемблерной программы с программами Ardu i no и другими языками высокого уровня Как писал классик программирования Дональд Кнут, «каждый, кто всерьез интере­ суется компьютерами, должен рано или поздно изучить по крайней мере один ма­ шинный язык» . Ассемблер - это первично, а все остальное вторично. Но ассемб­ лер обладает одним большим недостатком : программы на его основе получаются громоздкими и неудобочитаемыми. Это вызвано тем, что здесь любую операцию приходится разлагать на составляющие . Особенно это характерно для RISС­ архитектур (к которым относится и АVR) - например, в системе команд АVR нет даже операции деления, да и операция умножения работает не во всех моделях. Никакой речи о том, чтобы следовать знаменитому лозунгу Дейкстры «программи­ рование без goto», тут идти не может, т. к. ассемблерная программа, если можно так выразиться, состоит из сплошных goto - «лапши» условных и безусловных переходов, по выражению Дейкстры (он намекал на многочисленные линии ветв­ ления, которые возникают в блок-схемах таких программ). Таким образом, для ра­ боты на ассемблере требуется учить реализацию всех типовых приемов програм­ мирования - различных циклов с условными и безусловными переходами, мате­ матических операций, самостоятельно организовывать деление на локальные и глобальные переменные и т. п. Это и служит основным аргументом в пользу языков высокого уровня, где подобные реализации в большинстве случаев уже сделаны за вас . «Обычные» программисты, как огня, боятся замкнутых циклов, условие выхода из которых может не выполниться хотя бы теоретически. Бесконечное ожидание при­ хода символа с клавиатуры или из СОМ-порта, в котором не предусмотрено ника­ ких альтернативных средств выхода из цикла, повесит не только саму программу, но и всю систему, если речь идет об однозадачной DOS или «кооперативной много-

RkJQdWJsaXNoZXIy MTExODQxMg==