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

1 98 Часть 11. Программирование микроконтроллеров АVR на ассемблере что любая арифметическая операция дает погрешности округления, которые могут накапливаться. Углубляться в этот достаточно сложный вопрос мы не станем ­ нам достаточно того факта, что, оперируя с трехбайтовыми числами, как р�зульта­ том обычных операций деления и умножения, мы не выходим за пределы погреш­ ности в шестом знаке, что значительно превышает разрешение рядовых 1 О-раз­ рядных АЦП с числом градаций 1 024, означающим ошибку уже в третьем - мак­ симум (в реальности так не бывает ! ) - в четвертом десятичном знаке . Потому, хотя в типовых приложениях для микропроцессоров оперируют 8-, 1 6- и 32-разрядными двоичными числами (так удобнее укладывать числа в регистры и ячейки памяти), мы в большинстве случаев ограничимся трехбайтовыми (24-раз­ рядными) числами - нет смысла занимать дефицитный регистр (причем в арифме­ тических операциях - и не один), если он все равно всегда будет равен нулю. Однако возможность получения полных 32-х разрядов также не следует упускать из виду - во многих случаях это может понадобиться (например, как результат промежуточных операций), и большинство описанных далее процедур мы будем рассчитывать как на 24 разряда, так и на 32 . ПОДРОБНОСТИ По прочтении этой книги читатель, возможно, заметит, что мы крайне редко и только по серьезной необходимости будем пользоваться действиями с числами со знаком . Для корректной работы с отрицательными числами в AVR есть специальные команды умножения (сложение и вычитание, вообще говоря , таких специальных команд не тре­ буют) , но в практические приемы работы с отрицательными числами мы здесь углуб­ ляться не станем. Дело в том , что с отрицательными числами (как и с вещественны­ ми) иметь дело напрямую в 8-разрядных МК неудобно, - их, например, приходится специальным образом преобразовывать при обмене с внешними устройствами, имеющими свою разрядность и тем самым свое представление об отрицательных числах. О том , как проще в 8-разрядном AVR обращаться с числами с плавающей точ­ кой , пойдет речь далее, в разд. «Операции с вещественными числами» этой главы, а в конце главы мы также скажем несколько слов о том , как работа с отрицательными и вещественными числами может выполняться в принципе. Интересную отдельную проблему представляет вопрос о возможности производства вычислений с целыми числами большей разрядности , чем это допускают ограничения архитектуры МК. В 8-разрядном контроллере даже числа длиной 8 байтов уже «воро­ чать» затруднительно. Прочитав следующие разделы этой главы, вы сможете себе представить, во что выльется простая операция умножения чисел размером, скажем, в 256 байтов каждое. А такие числа (2048 битов) встречаются сегодня , например, в криптографии , в различных связных системах и т. д. Конечно, этот вопрос выходит далеко за рамки нашего повествования (и, положа руку на сердце, за рамки 8-разряд­ ных систем тоже) , но если вы заинтересуетесь, то как это делается в принципе, може­ те прочесть в блоге математика Максима Дерябина (http://mderyabln. ru/ru) . Модуляр­ ная арифметика (арифметика в остаточных классах, СОК, RNS) , которую он там разъ­ ясняет, подробно рассмотрена также во втором томе классического труда Дональда Кнута «Искусство программирования» [ 14] . Все показанные далее реализации типовых операций мы приводим в виде либо просто фрагмента кода, либо в виде законченной подпрограммы - за исключением нескольких небольших процедур, которые целесообразно оформить в виде макро­ сов. Остальные имеют слишком большой объем, чтобы их представлять в виде

RkJQdWJsaXNoZXIy MTExODQxMg==