Вот, можете прочитать
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено AVR 26 февраля 2005 г. 23:21
В ответ на: Ну раз даже сон отшибло - расскажу, только много писать придется. Обождите тогда чуток. отправлено AVR 26 февраля 2005 г. 22:24

Вся фишка в том, что подобный подход избавляет от необходимости суетиться с ручным вычислением результата операции с константами и, как приятное следствие, избавляет от необходимости выискивать в хидерах числовые значения этих констант. Можно написать L=6.2832*R, а можно L=2*pi*R, и пусть значение этого "pi" калькулятор сам подставит. В примере Константина на порту В к каким-то ногам прицеплены кнопки, по их нажатиям генерятся запросы Pin Change Interrupts, которые надо сбрасывать, записывая в регистр EIFR единички на те места, которые соответствуют этим ногам. Можно, конечно, в уме вычислить значение этой маски. Для этого нужно залезть в хидер-файл, найти численные значения этих бит, сложить их в двоичную кучку, преобразовать в HEX и написать присвоение, а потом еще ковыряться из-за какой-нибудь досадной ошибки. Гораздо разумнее написать это в общем виде, перепоручив копание в хидере, подстановку конкретных значений и вычисление результирующих констант компилятору (точнее - препроцессору) - он не ошибется. При необходимости, допустим, переноса кнопок на другие ноги нужно будет всего лишь переназначить их подключения, и нужные константы будут генерироваться на лету с учетом этих переназначений.

А использование операций сдвига для этих целей - мера вынужденная. В архитектуре AVR нет ни абсолютной адресации бит, ни прямых операций над отдельными битами - биты там "адресуются" только в пределах регистра, в составе которого они находятся. Соответственно, при совершении операции над битом приходится в том или ином виде указывать и регистр, в состав которого этот бит входит, а при совершении операции над битовым полем регистра - сочинять битовую маску. Все это можно сделать без раздумий над численными значениями бит, применяя вынужденно громоздкий в записи, но безошибочный и универсальный в результате прием, заключающийся в сдвиге константной единички на нужное место, что верно было опознано Константином как получение позиционного кода. Для набора маски, соответственно, применяется операция логического "или" над уже спозиционированными единичками.

И PORTB0, кстати, записывается в полном виде, а не в виде "пошлого и избитого нуля" по тем же причинам - чтобы не морочить себе голову перевычислением результата в случае той же необходимости перестановки кнопок. Да и значения этих констант имеют полное право не соответствовать ожидаемым - кто помешает Атмелу в каком-нибудь будущем МК назначить ногу PORTB0 пятой по счету, любезно сообщив это в даташите? Так что кому влом сдвигать - пусть рожает и пишет константы, а кому важен результат и не нравится искать собственные баги - пусть пишет в общем виде. Это в полной степени справедливо и для ассемблерщиков, причины те же.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru