реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Нужно оптимизировать код, Есть идеи как?
kolobok0
сообщение Jan 25 2011, 22:00
Сообщение #31


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(_Pasha @ Jan 26 2011, 00:07) *
...Вот годика 4 назад...


давайте оставим коней в вакууме - пускай отдыхают. если опираться то на факты (посему скорость написания, какчество и прочую чухню - оставим в покое). берём код который народ постит после компиляторов(в азм инструкциях) и от этого пляшем. вы утверждаете что оптимизатор справляется во всех случаях на 5? это хфантастика... как пример - код товарища выше. или Вы чиссо по животным в вакууме специализируетесь?

удачи вам
(круглый)
ЗЫ
всё конечно же зависит от задачи. в своё время приходилось писать и аля шарп технологию под 4051 кристал. но то так было задумано sm.gif
Go to the top of the page
 
+Quote Post
xemul
сообщение Jan 26 2011, 14:06
Сообщение #32



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Сергей Борщ @ Jan 25 2011, 15:16) *
P.P.S. ! и ~ у него не попутаны.

Замена ! на ~ без каких-либо ещё изменений даст лучший код на выходе.
Замена посерёдке & на && добавит логичности сорцу и код тоже не ухудшит.
А ненужный битово-логический замес, устроенный skyled'ом, не даёт ничего, кроме головняка оптимизатору.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 26 2011, 18:39
Сообщение #33


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (xemul @ Jan 26 2011, 16:06) *
Замена ! на ~ без каких-либо ещё изменений даст лучший код на выходе.
Да, естественно. Он сведется к циклу pwm[i] = 255. Ибо X & (1<<i) дает либо 0, либо 1<<i, !(X & (1<<i)) имеет результат 1 или 0, а вот ~(X & (1<<i)) даст либо int из всех единиц, либо из всех единиц кроме i-го разряда, что в обоих случаях true.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 27 2011, 04:15
Сообщение #34


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(kolobok0 @ Jan 26 2011, 01:00) *
или Вы чиссо по животным в вакууме специализируетесь?

cranky.gif Ну почитайте мои посты, в конце концов. Йа не лублу вакуум.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 1 2011, 12:51
Сообщение #35


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(_Pasha @ Jan 27 2011, 06:15) *
cranky.gif Ну почитайте мои посты, в конце концов. Йа не лублу вакуум.

Ни один компилятор не даст такой эффективный код, какой может сделать __опытный__ асм программист.
Это аксиома. Неопытному же писать на асм противопоказано - т.к. напишет хуже чем компилятор сделает.
Обработчик прерывания всей той чухни из первого поста на асм занял бы не больше 100 тактов с условием применения регистровых переменных.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 1 2011, 16:37
Сообщение #36


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(defunct @ Feb 1 2011, 15:51) *
Ни один компилятор не даст такой эффективный код, какой может сделать __опытный__ асм программист.

Проблема в интенсивном использовании компилятором(winavr) инструкций lds/sts - это раз.
192 такта при -О3(см. в начале темы) - целиком за счет разворачивания цикла. Это два. Там около 490 байт заняло оно, забыл тогда сказать.
Там на регистровые переменные тоже не особо разбежишься - надо использовать ldd/std
А по Вашему предложению - автор если собрался его реализовать, все-таки интересно, во сколько циклов оно встанет.
sm.gif Извините за словесный понос.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 2 2011, 02:24
Сообщение #37


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(_Pasha @ Feb 1 2011, 18:37) *
А по Вашему предложению - автор если собрался его реализовать, все-таки интересно, во сколько циклов оно встанет.

Ресурсоемкость кода сократиться в 18 раз только за счет того что прерываний стало в 18 раз меньше, плюс ресурсоемкость самих обработчиков сократится еще в 10 раз за счет того что обрабатываются не все 14, а только 1 канал. Итого на 2 порядка меньше от посчитанных Вами 190 тактов )
На асм писать не предлагаю - здесь нет в этом нужды.

Цитата
Там на регистровые переменные тоже не особо разбежишься - надо использовать ldd/std

ldd/std определенно пользовать не надо.
Массив 14-ти каналов разместить в регистрах, благо в AVR их аж 16 лишних. sm.gif
обработчик прерывания банально пишем 5 команд и копипастим 14 раз:

mov - 1 такт
lpm - 3
cp - 1
brlo вместе с cbi/sbi - 2 такта.
Итого на асм 1 + (1 + 3 + 1 + 2) * 14 = 99 тактов решением в лоб. ;>
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016