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

 
 
> Нужно оптимизировать код, Есть идеи как?
skyled
сообщение Jan 20 2011, 14:56
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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. Это возможно? А можно это как-то оформить ассемблерной вставкой? Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
skyled
сообщение Jan 25 2011, 10:11
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Тут выяснилось, что еще вот эта конструкция кушает невообразимое число тактов.
Код
for(unsigned char i=0;i<14;i++)
        {
            if((a & (1<<i))&(b & (1<<i))) {pwm_ch[i]=255;}//1и1
            if((a & (1<<i))&(!(b & (1<<i)))) {pwm_ch[i]=255;}//1и0
            if((!(a & (1<<i)))&(b & (1<<i))) {pwm_ch[i]=0;}//0и1
            if((!(a & (1<<i)))&(!(b & (1<<i)))) {pwm_ch[i]=0;}//0и0
        }

Даже если уменьшить разрядность ШИМ втрое... уже и не знаю как и быть.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2011, 12:16
Сообщение #3


Гуру
******

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



QUOTE (skyled @ Jan 25 2011, 12:11) *
Тут выяснилось, что еще вот эта конструкция кушает невообразимое число тактов.
Мама!
1) Вы на каждой итерации делаете сдвиг единицы на i разрядов. Для процессора без аппаратного сдвигателя это очень накладная операция.
2) Вы используете двоичное "И" (&) вместо логического (&&).
3) заметьте, что у вас результат не зависит от значения b
CODE
uint8_t *ptr = &pwm_ch[13];
for(uint16_t mask = (1<<13); mask; mask >>= 1)
{
    if(a & mask)
        *ptr-- = 255;
    else
        *ptr-- = 0;
}


P.S. Ой, xemul уже то же самое написал. Возможно, у него код даже лучше.
P.P.S. ! и ~ у него не попутаны.


--------------------
На любой вопрос даю любой ответ
"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
xemul
сообщение Jan 26 2011, 14:06
Сообщение #4



*****

Группа: Свой
Сообщений: 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

Сообщений в этой теме
- 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
|- - xemul   Цитата(skyled @ Jan 25 2011, 13:11) Тут в...   Jan 25 2011, 11:52
|- - Сергей Борщ   QUOTE (xemul @ Jan 26 2011, 16:06) Замена...   Jan 26 2011, 18:39
- - pokos   Чото не могу найти в закромах финальные исходники ...   Jan 25 2011, 20:30
- - _Pasha   Цитата(kolobok0 @ Jan 25 2011, 13:15) хот...   Jan 25 2011, 21:07
- - kolobok0   Цитата(_Pasha @ Jan 26 2011, 00:07) ...Во...   Jan 25 2011, 22:00
- - _Pasha   Цитата(kolobok0 @ Jan 26 2011, 01:00) или...   Jan 27 2011, 04:15
- - defunct   Цитата(_Pasha @ Jan 27 2011, 06:15) Ну п...   Feb 1 2011, 12:51
- - _Pasha   Цитата(defunct @ Feb 1 2011, 15:51) Ни од...   Feb 1 2011, 16:37
- - defunct   Цитата(_Pasha @ Feb 1 2011, 18:37) А по В...   Feb 2 2011, 02:24


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

 


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


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