13.03.2013, 23:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от Hives
|
ну да, это сейчас очень актуально
|
Апломбом потянуло. Типа "мы здеся килабайтов не щитаем, мы глыбше плаваем!"
Могу и ошибиться, обидеть не хотел. Просто почудилось...
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
14.03.2013, 13:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от Boba_spb
|
Давайте чуть посчитаем на пальцах. У нас есть 20 битное число N и нам надо отобразить B= (N+500)/1000 - +500 - округление.
Число N - можно представить как А*1024 + R = 1000*A +24*A +R; Где A - старшие 10 бит числа N A=N››10, а R - младшие 10 бит числа N R=N&1023.
Итак B = A + (A*24+R+500)/1000;
Начальное приближение B=A;
A*24= A‹‹3 +A‹‹4 ;
Тогда пусть С= А ‹‹ 3+А ‹‹ 4 +600;
Но как мы знаем, С- можно представить как M*1024+R1.
Тогда B=B+M - второе приближение;
И наконец, если M*24+R1›1000, то B=B+1;
Как видите, никаких умножений и делений - банальные сдвиги и суммирование.
Причем все ложиться в в двухбайтовую арифметику.
|
Boba_spb, я конечно снимаю шляпу, но я еще не владею столь свободно операциями сдвига, но думаю, при определенной практике это достижимо. Научите!
Объясните, почему мы берем такое С, откуда взялось М и R1.
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
14.03.2013, 13:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от gary2007
|
Boba_spb, я конечно снимаю шляпу, но я еще не владею столь свободно операциями сдвига, но думаю, при определенной практике это достижимо. Научите!
Объясните, почему мы берем такое С, откуда взялось М и R1.
|
Ну просто так мне захотелось назвать 16битную переменную именем "С";
Все ж привыкли что 16 битное число можно представить как младший байт + старший бат*256. Но можно это же число представить как 6 старших бит - это М, *1024 + R1. Т.е R1 - это младшие 10бит
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
14.03.2013, 14:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: IAR Embedded Workbench
Получается R1=R (младшие 10 бит)
Тогда код со слов выглядит так
PHP код:
|
unsigned int a,b,c,r,m; a = n ›› 10; r = n & 1023; b = a; c = (a ‹‹ 3) + (a ‹‹ 4) +600; m = c & 1023; if((m*24 + r) › 1000) b++;
|
Но это работает неправильно, или я чего-то не уловил...
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
14.03.2013, 14:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: IAR Embedded Workbench
Может так будет понятнее
Ваше 20битное число = 1048575
Мы его представляем как 1023*1024 +1023 = 1048575; A=1023 R=1023
тогда B=1023 и мы получаем новое число С=1023*24+500+1023=26075;
Но 26075= 25*1024+475; M=25 R1=475
тогда B=B+25= 1048;
Далее 25*24+475=1075 и это больше 1000.
Значит B=B+1= 1049 - что и требовалось найти
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
14.03.2013, 15:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: IAR Embedded Workbench
PHP код:
|
unsigned short a,b,c,r,m;
a = (short) (n ›› 10);
r = (short) (n & 1023);
b = a;
c = (a ‹‹ 3) + (a ‹‹ 4) +500+r;
m = c››10;
r=c&1023;
b=b+m;
if(( (m‹‹3) + (m‹‹4) + r) ›= 1000) b++;
|
Вот так должно работать;
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
14.03.2013, 15:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: IAR Embedded Workbench
Вот так оно в работе;
|
|
|
|
14.03.2013, 16:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
|
Re: IAR Embedded Workbench
Да, у меня тоже уже заработало, час на него глазею, меряю такты. Надо еще шорты повставлять.
Эффективность по моему выше уже некуда.
Спасибо за разжевывание!
__________________
Мелочи не решают главного. Они решают всё!
|
|
|
|
14.03.2013, 16:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: IAR Embedded Workbench
Ну чуть что,если тактов много - то на ASMе ваять надо, там совсем все коротко будет. Хотя можно и тут урезать чуток.
|
|
|
|
14.03.2013, 16:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от gary2007
|
Надо еще шорты повставлять.
|
Это зачем? Если пишете на IAR AVR, то short и int - одного размера.
Уж лучше убрать излишества, вроде этого:
PHP код:
|
a = (short) (n ›› 10);
...;
b = a;
|
Сообщение от gary2007
|
Эффективность по моему выше уже некуда.
|
А как в строку преобразуете?
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 14.03.2013 в 17:00.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Подниму тему WinAVR vs IAR
|
oleg110592 |
Микроконтроллеры, АЦП, память и т.д |
5 |
24.10.2015 14:06 |
Часовой пояс GMT +4, время: 02:25.
|
|