Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 28.10.2010, 21:13  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от OneTech Посмотреть сообщение
Можно и посчитать, но никто так не делает. Как и для умножения так и для деления у тинек нужно организовывать подпрограммы которые сдвигом-сложением делают умножение, а сдвигом-вычитанием деление.
Ну так для тинек и не заменяют. А вот для меги можно существенно ускорить.
Реклама:
kison вне форума  
Непрочитано 28.10.2010, 21:22  
OneTech
Вид на жительство
 
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
OneTech на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

К сожаление разговор без реальных примеров это всего лишь теория.
__________________
Делая дело нужно в него верить на все 100%, иначе неизбежно будут возникать ошибки подпитывающие подсознательное сомнение.
OneTech вне форума  
Непрочитано 28.10.2010, 22:09  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от OneTech Посмотреть сообщение
Как и для умножения так и для деления у тинек нужно организовывать подпрограммы которые сдвигом-сложением делают умножение, а сдвигом-вычитанием деление
Они сильно жрут время. Еще ведь надо делать десятичную коррекцию - аппаратной нет. По такому принципу подпрограмма выполняется порядка 10000 циклов, хотя размер кода всего 150-200 байт
niXto вне форума  
Непрочитано 28.10.2010, 22:21  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от OneTech Посмотреть сообщение
К сожаление разговор без реальных примеров это всего лишь теория.
Ну хорошо. Хотите конкретики?
Дано число 32 бита, беззнаковое. Нужно поделить его на 67.
Первый вариант делить в лоб, другой через умножение. Я тупо написал несколько строк на Си под Мегу8 и посмотрел результат.
Код:
volatile uint32_t a = 6700000UL; // чтоб результат красивый иметь
volatile uint32_t result;

int main(void)
{
  result = 0; // для отсчета
  result = a / 67;
  result = a * 128207979UL;
  result = 0; // для отсчета
while(1){};
}
Честное деление - 610 тактов, через умножение - 67 тактов. Сюда входит и загрузка/выгрузка из памяти, она приличная для 32 бит и занимает 16 тактов. Чистый расчет соответственно 51 такт против 594.
И вообще требовать примеров не приведя ни одного своего - некрасиво.
Дал бы и под STM8, но комп погиб еще вчера На этом ничего нет и вообще это рабочий ноутбук с диском в 10Гб. Ставить сюда ничего лишнего не хочу.

Последний раз редактировалось kison; 28.10.2010 в 22:27.
kison вне форума  
Непрочитано 28.10.2010, 22:54  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Кстати эффект имеет место и для кристаллов с отсутствующим умножителем. Так Т2313 делит через умножение за 197 тактов. Честно делит так же как и мега - 600 тактов. Экономия имеется в любом случае, причем существенная.
kison вне форума  
Непрочитано 28.10.2010, 23:10  
OneTech
Вид на жительство
 
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
OneTech на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Пример? - да не вопрос. Классика деления это примерно то что мы учили в школи, деление в столбик, примерно так и делает контроллер. Например нужно поделить число 117 на 13. И так имеем делимое, делитель и остаток. остаток в процессе деления может быть равным нулю, если число полностью делится. Далее, загружается цикл на число разрядов делимого. для 117 возьмём 8, ибо речь в данной ветке о 8-ми разрядниках. Со стороны старшего бита делимого подставляется заблаговременно очишенный остаток. После каждого сдвига сравниваются делитель и остаток, если делитель ›= остатку, то от остатка отнимается делитель и в делимом устанавливается в "1" младший бит, иначе ничего не делается, снова просто сдвигаем, пока не выйдут 8 циклов, поехали:
117 в dec-е 0b01110101
Слева от делимого подставляем чистый остаток

0b00000000:0b01110101
сдвиг влево №1:
0b00000000:0b11101010
делитель больше или равен остатку? - нет, ничего не делаем, двигаем сдвиг влево №2:
0b00000001:0b11010100
больше или равен? - нет
сдвиг влево №3:
0b00000011:0b10101000
больше или равен? - нет
сдвиг влево №4:
0b00000111:0b01010000
больше или равен? - нет
сдвиг влево №5:
0b00001110:0b10100000
больше или равен? - да, отнимаем от 0b00001110 (14dec) 0b00001101 (13) в остатке остаётся 1, и 1 ставим в делимом:
0b00000001:0b10100001
сдвиг влево №6:
0b00000011:0b01000010
больше или равен? - нет
сдвиг влево №7:
0b00000110:0b10000100
больше или равен? - нет
сдвиг влево №8:
0b00001101:0b00001000
больше или равен? - да, отнимаем от 0b00001101 (13dec) 0b00001101 (13) в остатке остаётся 1, и 1 ставим в делимом:
0b00000000:0b00001001
В итоге в делимом результат, число 9, в остатке 0. Это классика деления, так работают и аппаратные делители, только с некоторыми ухищрениями что-бы ускорить этот процесс.

Я применяю такое быстрое деление через умножение (просто я хотел увидеть Ваш вариант в виде алгоритма). Нужно число быстро разделить на 10 к примеру:
Делимое 170, делитель 10. Если число 256 на калькуляторе разделить на 10, то получим число 25,6 ~= 26. Эта и есть та константа которая поможет делить.
Перемножаем 170 на 26 = 4420, рассмотрим это число в hex 0x1144. Выбросим младшую часть числа, имеем 0x11 переведём в dec - 17. Это мой метод быстрого деления чисел.

В асме это выглядит так:
ldi r16,170;загрузить делимое 1 такт
ldi r17,(256/10);загрузить константу 1 такт
mul r16,r17 ;перемножить 2 такта
В регистре r1 результат, число 17, Всего 4 такта, против исходного стандартного метода 74 такта. Не кисло, правда?
__________________
Делая дело нужно в него верить на все 100%, иначе неизбежно будут возникать ошибки подпитывающие подсознательное сомнение.

Последний раз редактировалось OneTech; 28.10.2010 в 23:16.
OneTech вне форума  
Непрочитано 28.10.2010, 23:18  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от OneTech Посмотреть сообщение
Я применяю такое быстрое деление через умножение (просто я хотел увидеть Ваш вариант в виде алгоритма). Нужно число быстро разделить на 10 к примеру:
А теперь то же, но числа побольше. Например 32 бита 6900000/69
Интересует количество тактов.
kison вне форума  
Непрочитано 28.10.2010, 23:48  
OneTech
Вид на жительство
 
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
OneTech на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

45 тактов, только появилась погрешность, результат деления не 100`000, а 100`021 это недостаток такого метода. Только я делил не 32 бита на 16, а 24 бита на 16, число 6`900`000 прекрасно влазит в 24 разряда.
__________________
Делая дело нужно в него верить на все 100%, иначе неизбежно будут возникать ошибки подпитывающие подсознательное сомнение.
OneTech вне форума  
Непрочитано 29.10.2010, 00:00  
alexgap
Гражданин KAZUS.RU
 
Аватар для alexgap
 
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
alexgap на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

OneTech, проверил ваш метод. К сожалению, он дает неверный результат даже для байта... Например, для 199 / 10 результат 20, что неверно, должно быть 19. А я было обрадовался новому методу оптимизации арифметических операций.
__________________
.

В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
alexgap вне форума  
Непрочитано 29.10.2010, 00:00  
OneTech
Вид на жительство
 
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
OneTech на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Я выше написал проблему, но и её можно минимизировать К тому же для частных случаев метода подходит
__________________
Делая дело нужно в него верить на все 100%, иначе неизбежно будут возникать ошибки подпитывающие подсознательное сомнение.

Последний раз редактировалось OneTech; 29.10.2010 в 00:21.
OneTech вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
KiCAD-объявления и впечатления al_dan KiCAD 32 03.10.2016 17:02
Народ, посмотрите quasm, Как ваши впечатления? suri Proteus, KiCAD и другие ECAD 5 14.10.2009 11:57


Часовой пояс GMT +4, время: 15:43.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot