|
Нужно оптимизировать код, Есть идеи как? |
|
|
|
Jan 20 2011, 14:56
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
Есть такой кусок кода: Код if((pwm>pgm_read_byte(&brightness[pwm_ch[0]]))|(pwm==0)){pd &= ~(1<<0);}//1 else {pd |= (1<<0);} if((pwm>pgm_read_byte(&brightness[pwm_ch[1]]))|(pwm==0)){pd &= ~(1<<1);}//2 else {pd |= (1<<1);} if((pwm>pgm_read_byte(&brightness[pwm_ch[2]]))|(pwm==0)){pa &= ~(1<<1);}//3 else {pa |= (1<<1);} if((pwm>pgm_read_byte(&brightness[pwm_ch[3]]))|(pwm==0)){pa &= ~(1<<0);}//4 else {pa |= (1<<0);} if((pwm>pgm_read_byte(&brightness[pwm_ch[4]]))|(pwm==0)){pd &= ~(1<<2);}//5 else {pd |= (1<<2);} if((pwm>pgm_read_byte(&brightness[pwm_ch[5]]))|(pwm==0)){pd &= ~(1<<3);}//6 else {pd |= (1<<3);} if((pwm>pgm_read_byte(&brightness[pwm_ch[6]]))|(pwm==0)){pd &= ~(1<<4);}//7 else {pd |= (1<<4);} if((pwm>pgm_read_byte(&brightness[pwm_ch[7]]))|(pwm==0)){pd &= ~(1<<5);}//8 else {pd |= (1<<5);} if((pwm>pgm_read_byte(&brightness[pwm_ch[8]]))|(pwm==0)){pb &= ~(1<<4);}//9 else {pb |= (1<<4);} if((pwm>pgm_read_byte(&brightness[pwm_ch[9]]))|(pwm==0)){pb &= ~(1<<3);}//10 else {pb |= (1<<3);} if((pwm>pgm_read_byte(&brightness[pwm_ch[10]]))|(pwm==0)){pb &= ~(1<<2);}//11 else {pb |= (1<<2);} if((pwm>pgm_read_byte(&brightness[pwm_ch[11]]))|(pwm==0)){pb &= ~(1<<1);}//12 else {pb |= (1<<1);} if((pwm>pgm_read_byte(&brightness[pwm_ch[12]]))|(pwm==0)){pb &= ~(1<<0);}//13 else {pb |= (1<<0);} if((pwm>pgm_read_byte(&brightness[pwm_ch[13]]))|(pwm==0)){pd &= ~(1<<6);}//14 else {pd |= (1<<6);} Он обрабатывается за 345 тактов. Мне нужно менее 300. Это возможно? А можно это как-то оформить ассемблерной вставкой? Спасибо.
|
|
|
|
|
 |
Ответов
|
Jan 25 2011, 21:07
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(kolobok0 @ Jan 25 2011, 13:15)  хотите оптимально - пишите на азм-е. оптимизатор может "оптимизнуть" готовые функции из библиотеки - на 5+, а вот логику - тут уж сильно зависит от опыта того кто писал оптимизатор и за сколько вы его купили. Поздно! Вот годика 4 назад, когда еще было много проблем с сями, тогда бы это звучало серьезно. Сейчас - увы. Цитата(Сергей Борщ @ Jan 25 2011, 15:16)  Мама!  Цитата(skyled @ Jan 25 2011, 13:11)  Тут выяснилось, что еще вот эта конструкция кушает невообразимое число тактов. Ара щто ти здэляль со мной? Йа плакаль, перед женщин стидно..
|
|
|
|
|
Jan 25 2011, 22:00
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(_Pasha @ Jan 26 2011, 00:07)  ...Вот годика 4 назад... давайте оставим коней в вакууме - пускай отдыхают. если опираться то на факты (посему скорость написания, какчество и прочую чухню - оставим в покое). берём код который народ постит после компиляторов(в азм инструкциях) и от этого пляшем. вы утверждаете что оптимизатор справляется во всех случаях на 5? это хфантастика... как пример - код товарища выше. или Вы чиссо по животным в вакууме специализируетесь? удачи вам (круглый) ЗЫ всё конечно же зависит от задачи. в своё время приходилось писать и аля шарп технологию под 4051 кристал. но то так было задумано
|
|
|
|
|
Feb 1 2011, 16:37
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(defunct @ Feb 1 2011, 15:51)  Ни один компилятор не даст такой эффективный код, какой может сделать __опытный__ асм программист. Проблема в интенсивном использовании компилятором(winavr) инструкций lds/sts - это раз. 192 такта при -О3(см. в начале темы) - целиком за счет разворачивания цикла. Это два. Там около 490 байт заняло оно, забыл тогда сказать. Там на регистровые переменные тоже не особо разбежишься - надо использовать ldd/std А по Вашему предложению - автор если собрался его реализовать, все-таки интересно, во сколько циклов оно встанет.  Извините за словесный понос.
|
|
|
|
|
Feb 2 2011, 02:24
|

кекс
     
Группа: Свой
Сообщений: 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 лишних.  обработчик прерывания банально пишем 5 команд и копипастим 14 раз: mov - 1 такт lpm - 3 cp - 1 brlo вместе с cbi/sbi - 2 такта. Итого на асм 1 + (1 + 3 + 1 + 2) * 14 = 99 тактов решением в лоб. ;>
|
|
|
|
Сообщений в этой теме
skyled Нужно оптимизировать код Jan 20 2011, 14:56 rezident Проверку pgm==0 из каждого условия уберите, сделав... Jan 20 2011, 15:07 codier Жуть
А побитное или ("|") в условиях в... Jan 20 2011, 15:14 skyled Спасибо за совет! Код действительно полегчал. ... Jan 20 2011, 15:21 codier А нельзя pgm_read_byte(&brightness[pwm_ch[1]])... Jan 20 2011, 15:26 skyled Цитата(codier @ Jan 20 2011, 18:26) А нел... Jan 20 2011, 15:47  follow_me избавьтесь от операций сдвига это забирает один ... Jan 20 2011, 18:03   777777 Цитата(follow_me @ Jan 20 2011, 21:03) из... Jan 20 2011, 18:08 follow_me pwm>pgm_read_byte(&brightness[pwm_ch[7]])
... Jan 20 2011, 18:40 smk Цитата(follow_me @ Jan 20 2011, 20:40) pw... Jan 20 2011, 19:09  follow_me Цитата(smk @ Jan 20 2011, 21:09) совершен... Jan 20 2011, 20:32   777777 Еще можно для оптимизации вытащить brightness из ф... Jan 21 2011, 07:18    demiurg_spb Цитата(777777 @ Jan 21 2011, 10:18) Еще м... Jan 21 2011, 14:01 codier 2follow_me:
2777777:
Глянул искомый девайс:
Цитат... Jan 21 2011, 07:38 _Pasha Все чаще и чаще наблюдаются жутковатые перлы. По ... Jan 21 2011, 08:54 follow_me В циклах кстати для приращения итератора стоит исп... Jan 21 2011, 15:34 _Pasha Цитата(demiurg_spb @ Jan 21 2011, 18:01) ... Jan 21 2011, 18:50 defunct Концептуально можно ускорить код - если вместо про... Jan 23 2011, 22:41 skyled Навскидку разумное зерно есть. Надо бдумать. А не ... Jan 24 2011, 14:55 defunct Цитата(skyled @ Jan 24 2011, 16:55) А не ... Jan 24 2011, 16:22  pokos Цитата(defunct @ Jan 24 2011, 19:22) Долж... Jan 24 2011, 17:37 pokos У меня на 3 канала было вот так сделано:
Код// Tim... Jan 24 2011, 15:05 kolobok0 Цитата(pokos @ Jan 24 2011, 18:05) Код...... Jan 25 2011, 10:15  pokos Цитата(kolobok0 @ Jan 25 2011, 13:15) А т... Jan 25 2011, 11:39 _Bill Цитата(pokos @ Jan 24 2011, 19:05) У меня... Jan 25 2011, 10:46 skyled Тут выяснилось, что еще вот эта конструкция кушает... Jan 25 2011, 10:11 xemul Цитата(skyled @ Jan 25 2011, 13:11) Тут в... Jan 25 2011, 11:52 Сергей Борщ QUOTE (skyled @ Jan 25 2011, 12:11) Тут в... Jan 25 2011, 12:16  xemul Цитата(Сергей Борщ @ Jan 25 2011, 15:16) ... Jan 26 2011, 14:06   Сергей Борщ QUOTE (xemul @ Jan 26 2011, 16:06) Замена... Jan 26 2011, 18:39 pokos Чото не могу найти в закромах финальные исходники ... Jan 25 2011, 20:30
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|