Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 8. Арифметические операции и операции в двоично-десятичном формате 203 один регистр для старшего разряда ( tempЗ, к примеру) и одну строку кода перед командой ret: adc tempЗ , rl Естественно, можно просто обозначить r l через tempЗ, тогда и добавлять ничего не придется . ПОДРОБНОСТИ Так как процедура линейная, без ветвлений , то очень просто подсчитать, сколько она займет времени : 4 команды mul по 2 такта и 7 остальных по одному такту, итого 1 5 тактов + возврат {ret) . Для сравнения, упомянутая процедура MPYl бU из «аппноты» 200 занимает 1 53 такта , и при этом дает только двухбайтный результат. Хороший пример того, почему всегда предпочтительно пользоваться аппаратными командами. Д еление многоразрядных чисел Самый простой алгоритм деления - определить, сколько раз можно вычесть дели тель из делимого, однако в фирменных «аппнотах» он выглядит несколько слож нее. Деление - значительно более громоздкая процедура, чем умножение, требует больше регистров и времени ( мРУl бU из «аппнотьш, как мы говорили, занимает 1 53 такта, а аналогичная операция деления двух 1 6-разрядных чисел - от 23 5 до 25 1 ). Аппаратных команд в АVR для этого не предусмотрено, потому приходит ся привлекать смекалку. Операции деления двух чисел (и 8-разрядных, и 1 6-разрядных) приведены в той же «аппноте» 200, и на этот раз без сложностей, но они не всегда удобны на практике: часто нам приходится делить результат какой-то ранее проведенной операции умножения или сложения, а он нередко выходит за пределы двух байтов. Поэтому пришлось разрабатывать свои операции . Например, часто встречается необходи мость вычислить среднее значение для уточнения результата по сумме отдельных измерений. Если даже само измерение укладывается в 1 6 разрядов, то сумма не скольких таких результатов уже может занимать три или четыре байта. В то же время делитель - число измерений - может быть относительно небольшим и укладываться в один байт. Здесь я привожу процедуру деления 32-разрядных чисел на однобайтовое число, которая представляет собой модификацию оригинальной процедуры из Appl ication notes 200 (листинг 8 .4). Названия переменных отражают назначение процедуры - деление состояния некоего 4-байтового счетчика на чис ло циклов счета (определения регистров-переменных не приводятся, комментарии сохранены из оригинального текста «аппноты», они соответствуют блок-схеме алгоритма, размещенной в рdf-файле) . · * * * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * , ; div32x8 - 3 2 / 8 деление беззнаковых чисел ; Делимое и результат в count_HH ( старI1П1Й ) , countTH , ; countТМ, countTL (младПП1 Й ) ; делитель в cykl
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==