Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

STM8(S/L), первые впечатления

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

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

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

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

Кстати эффект имеет место и для кристаллов с отсутствующим умножителем. Так Т2313 делит через умножение за 197 тактов. Честно делит так же как и мега - 600 тактов. Экономия имеется в любом случае, причем существенная.
kison вне форума  
Непрочитано 28.10.2010, 23:10  
OneTech
Вид на жительство
 
Регистрация: 09.10.2009
Сообщений: 353
Сказал спасибо: 20
Сказали Спасибо 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.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

Сообщение от OneTech Посмотреть сообщение
Я применяю такое быстрое деление через умножение (просто я хотел увидеть Ваш вариант в виде алгоритма). Нужно число быстро разделить на 10 к примеру:
А теперь то же, но числа побольше. Например 32 бита 6900000/69
Интересует количество тактов.
kison вне форума  
Непрочитано 28.10.2010, 23:48  
OneTech
Вид на жительство
 
Регистрация: 09.10.2009
Сообщений: 353
Сказал спасибо: 20
Сказали Спасибо 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.RUN
 
Аватар для alexgap
 
Регистрация: 08.07.2006
Сообщений: 883
Сказал спасибо: 119
Сказали Спасибо 1,108 раз(а) в 175 сообщении(ях)
alexgap на пути к лучшему
По умолчанию Re: STM8(S/L), первые впечатления

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

В мире всего два типа людей: те у кого был ZX Spectrum, и те у кого его не было.
alexgap вне форума  
Непрочитано 29.10.2010, 00:00  
OneTech
Вид на жительство
 
Регистрация: 09.10.2009
Сообщений: 353
Сказал спасибо: 20
Сказали Спасибо 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, время: 04:58.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.