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

 
 
> Помогите оптимизировать, Сишный код для авр
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
Ответов
sergeeff
сообщение Oct 8 2008, 18:14
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Можно попробовать так (компилятора нет под рукой для AVR):

Код
typedef struct
{
  unsigned char a;
  unsigned char b;
  unsigned char c;
} PWM;

PWM pwm[256];
unsigned  char pwmstep = 0;
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
  // Place your code here
  PWM *tmp = &pwm[pwmstep++];
  PORTA=tmp->a;
  PORTB=tmp->b;
  PORTC=tmp->c;
}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 9 2008, 00:09
Сообщение #3


Гуру
******

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



Цитата(sergeeff @ Oct 8 2008, 21:14) *
Можно попробовать так (компилятора нет под рукой для AVR):
Навскидку: размер получившегося массива 3 байта, компилятор будет вызывать умножение на 3. Можно попробовать вот так:
Код
typedef struct
{
    uint8_t a;
    uint8_t b;
    uint8_t c;
} pwm_point_t

union
{
    pwm_point_t point[256];
    uint8_t raw[];
} PWM;
uint8_t *pIndex = PWM.raw;

// PWM main interrupt
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
    // Place your code here
    PORTA = *pIndex++;
    PORTB = *pIndex++;
    PORTC = *pIndex++;
    if(pIndex == (uint8_t *)(&PWM + 1))
    {
        pIndex = PWM.raw;
    }
}
PWM.point[x] использовать для заполнения массива. По ним тоже можно шагать указателем.


--------------------
На любой вопрос даю любой ответ
"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
Огурцов
сообщение Oct 9 2008, 06:49
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(Сергей Борщ @ Oct 9 2008, 00:09) *
PORTA = *pIndex++;

На сколько я помню свои эксперименты, результат компиляции будет совершенно одинаков с PORTA=pwm[pwmstep++];
Go to the top of the page
 
+Quote Post



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

 


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


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