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

 
 
> Нужно оптимизировать код, Есть идеи как?
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
Ответов
pokos
сообщение Jan 24 2011, 15:05
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 270
Регистрация: 29-06-06
Пользователь №: 18 445



У меня на 3 канала было вот так сделано:
Код
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=256-39+4;
//PWM-----------------------
pwr_cnt++;
if (red_a>pwr_cnt)
    { PORTD.7=1;}
else
    {PORTD.7=0;};
    
if (green_a>pwr_cnt)
    {PORTD.6=1;}
else
    {PORTD.6=0;};
    
if (blue_a>pwr_cnt)
    {PORTD.5=1;}
else
    {PORTD.5=0;};
}

Оттранслировалось в:
_timer0_ovf_isr:
    RCALL __SAVEISR
;      49 // Reinitialize Timer 0 value
;      50 TCNT0=256-39+4;
    LDI  R30,LOW(221)
    OUT  0x32,R30
;      51 //PWM-----------------------
;      52 pwr_cnt++;
    LDS  R30,_pwr_cnt
    SUBI R30,-LOW(1)
    STS  _pwr_cnt,R30
;      53 if (red_a>pwr_cnt) {PORTD.7=1;}
    LDS  R26,_red_a
    CP   R30,R26
    BRSH _0x2B
    SBI  0x12,7
;      54 else {PORTD.7=0;};
    RJMP _0x2C
_0x2B:
    CBI  0x12,7
_0x2C:
;      55 if (green_a>pwr_cnt) {PORTD.6=1;}
    LDS  R30,_pwr_cnt
    LDS  R26,_green_a
    CP   R30,R26
    BRSH _0x2D
    SBI  0x12,6
;      56 else {PORTD.6=0;};
    RJMP _0x2E
_0x2D:
    CBI  0x12,6
_0x2E:
;      57 if (blue_a>pwr_cnt) {PORTD.5=1;}
    LDS  R30,_pwr_cnt
    LDS  R26,_blue_a
    CP   R30,R26
    BRSH _0x2F
    SBI  0x12,5
;      58 else {PORTD.5=0;};
    RJMP _0x30
_0x2F:
    CBI  0x12,5
_0x30:
;      59 }
    RCALL __LOADISR
    RETI


Сообщение отредактировал pokos - Jan 24 2011, 15:21
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 25 2011, 10:46
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(pokos @ Jan 24 2011, 19:05) *
У меня на 3 канала было вот так сделано:
Код
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=256-39+4;
//PWM-----------------------
pwr_cnt++;
if (red_a>pwr_cnt)
    { PORTD.7=1;}
else
    {PORTD.7=0;};
    
if (green_a>pwr_cnt)
    {PORTD.6=1;}
else
    {PORTD.6=0;};
    
if (blue_a>pwr_cnt)
    {PORTD.5=1;}
else
    {PORTD.5=0;};
}

Попробуйте так
Код
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
char _tmp;
// Reinitialize Timer 0 value
TCNT0=256-39+4;
//PWM-----------------------
_tmp = ++pwr_cnt;
if (red_a > _tmp)
    { PORTD.7=1;}
else
    {PORTD.7=0;};
    
if (green_a > _tmp)
    {PORTD.6=1;}
else
    {PORTD.6=0;};
    
if (blue_a > _tmp)
    {PORTD.5=1;}
else
    {PORTD.5=0;};
}
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
|- - kolobok0   Цитата(pokos @ Jan 24 2011, 18:05) Код......   Jan 25 2011, 10:15
||- - pokos   Цитата(kolobok0 @ Jan 25 2011, 13:15) А т...   Jan 25 2011, 11:39
- - 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
- - _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 Текстовая версия Сейчас: 22nd July 2025 - 23:21
Рейтинг@Mail.ru


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