|
Нужно оптимизировать код, Есть идеи как? |
|
|
|
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 24 2011, 15:05
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
Сообщений в этой теме
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 _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 _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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|