Ревич, Ю.В. Программирование микроконтроллеров 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] . Все показанные далее реализации типовых операций мы приводим в виде либо просто фрагмента кода, либо в виде законченной подпрограммы - за исключением нескольких небольших процедур, которые целесообразно оформить в виде макро сов. Остальные имеют слишком большой объем, чтобы их представлять в виде
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==