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

 
 
> Помогите оптимизировать, Сишный код для авр
ScrambledStamp
сообщение Oct 8 2008, 16:21
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 31-05-08
Пользователь №: 37 943



Помогите оптимизировать код, надо его сделать побыстрее, очень не хочется уменьшать разрядность. .

unsigned char pwma[256], pwmb[256], pwmc[256];
unsigned char pwmstep;

// PWM main interrupt
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
// Place your code here
PORTA=pwma[pwmstep];
PORTB=pwmb[pwmstep];
PORTC=pwmc[pwmstep];
pwmstep++;
}

Компилятор (кодевижн) выдает такой листинг:

Код
;     189 // PWM main interrupt
;     190 interrupt [TIM2_COMP] void timer2_comp_isr(void)
;     191 {
_timer2_comp_isr:
    ST   -Y,R30
    ST   -Y,R31
    IN   R30,SREG
    ST   -Y,R30
;     192 // Place your code here
;     193 PORTA=pwma[pwmstep];
    MOV  R30,R9
    LDI  R31,0
    SUBI R30,LOW(-_pwma)
    SBCI R31,HIGH(-_pwma)
    LD   R30,Z
    OUT  0x1B,R30
;     194 PORTB=pwmb[pwmstep];
    MOV  R30,R9
    LDI  R31,0
    SUBI R30,LOW(-_pwmb)
    SBCI R31,HIGH(-_pwmb)
    LD   R30,Z
    OUT  0x18,R30
;     195 PORTC=pwmc[pwmstep];
    MOV  R30,R9
    LDI  R31,0
    SUBI R30,LOW(-_pwmc)
    SBCI R31,HIGH(-_pwmc)
    LD   R30,Z
    OUT  0x15,R30
;     196 pwmstep++;
    INC  R9
;     197 }
_0xF0:
    LD   R30,Y+
    OUT  SREG,R30
    LD   R31,Y+
    LD   R30,Y+
    RETI
;     198
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Tiro
сообщение Oct 8 2008, 21:54
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 781
Регистрация: 3-10-04
Из: Санкт-Петербург
Пользователь №: 768



Мне кажется, постановка задачи немного неполна: насчитаны ли массивы заранее? Или они считаются между прерываниями?

Если считаются по ходу времени, то лучше иметь 3 глобальные переменные.

Теперь по существу. K&R говорят, что быстрее всего изменяется последний индекс массива. То есть массив pwm[256][3] даст самый быстрый доступ к элементам. Об этом уже сказали неявно предыдущие ораторы. Из практических советов - следует избегать адресной арифметики в прерывании в зависимости от мощности оптимизатора. Возможно, потребуется ручками указать последовательность действий. Можно написать так (не проверял, только для иллюстрации идеи):

unsigned char pwm [256] [3];
volatile unsigned char pwmstep;

// PWM main interrupt
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
// Place your code here
register unsigned char step = pwmstep;
register unsigned char * sample = pwm [step];
PORTA=sample[0]; // *(sample ++)
PORTB=sample[1]; // *(sample ++)
PORTC=sample[2]; // *(sample ++)
step++;
pwmstep = step;
}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 05:43
Рейтинг@Mail.ru


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