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

 
 
> Никак не обмануть gcc 4.1.2
demiurg_spb
сообщение Aug 15 2008, 11:45
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Пытаюсь оптимизировать процедуру очистки дисплея, но gcc не поддаётся дрессуреsmile.gif
Оптимизация: Os.
Код
#define LCD_WIDTH             128U
#define LCD_HEIGHT            64U
#define LCD_STR_HEIGHT     8U

unsigned char lcd_vram[LCD_WIDTH][LCD_HEIGHT/LCD_STR_HEIGHT];    // Буфер видеопамяти LCD.

//====================================
void lcd_clrscr(void)
{
    unsigned char*p = &lcd_vram[0][0];

#if (((LCD_WIDTH*LCD_HEIGHT/LCD_STR_HEIGHT)/8)>255)
# error "(sizeof(lcd_vram)/8)>255 !!!"
#endif

    register unsigned char i = sizeof(lcd_vram)/8;
    do
    {
        *p++ = 0; // 1
        *p++ = 0; // 2
        *p++ = 0; // 3
        *p++ = 0; // 4
        *p++ = 0; // 5
        *p++ = 0; // 6
        *p++ = 0; // 7
        *p++ = 0; // 8
    }
    while (--i);
}


Получаю листинг такого вида:
Код
lcd_clrscr:
        ldi r30,lo8(lcd_vram)
        ldi r31,hi8(lcd_vram)
.L2:  
        st Z,__zero_reg__
        std Z+1,__zero_reg__
        std Z+2,__zero_reg__
        std Z+3,__zero_reg__
        std Z+4,__zero_reg__
        std Z+5,__zero_reg__
        std Z+6,__zero_reg__
        std Z+7,__zero_reg__
        adiw r30,8
        ldi r24,hi8(lcd_vram+1024)
        cpi r30,lo8(lcd_vram+1024)
        cpc r31,r24
        brne .L2
        ret

Мне никак не удаётся заставить gcc использовать однобайтный счётчик цикла, отказаться от adiw и использовать st+,__zero_reg__. Так код стал бы и короче и быстрее...

И попутно вопрос №2:
Я считал, что static const является альтернативой define.
Но, видимо, я заблуждался...

Код
static const unsigned char MY_ARRAY_SIZE = 2;
//#define MY_ARRAY_SIZE 2

unsigned char my_array[MY_ARRAY_SIZE] = {0,0};

получаю сообщение:
../../../arclib/common/lcd128x64.c:10: error: variably modified 'my_array' at file scope
../../../arclib/common/lcd128x64.c:10: warning: excess elements in array initializer
../../../arclib/common/lcd128x64.c:10: warning: (near initialization for 'my_array')

А если через #define MY_ARRAY_SIZE 2 - то всё ок.

Знающие люди, объясните такое поведение.
Спасибо!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Pasha
сообщение Aug 15 2008, 17:27
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Только что глянул код и листинг еще раз, и увидел:
оптимизатор исключил переменную i, воспользовавшись ZL:ZH как регистром базы и, однвременно, переменной цикла. А если так, то все попытки ввести "дрессурой" перем. цикла в явном виде, порождают менее эффективный код. Вывод : ни о чем беспокоиться не надо. Компилер сделал правильно.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 15 2008, 17:57
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(_Pasha @ Aug 15 2008, 23:27) *
все попытки ввести "дрессурой" перем. цикла в явном виде, порождают менее эффективный код.


А из моего асмового варианта получилось:
Код
    278c:    80 e8           ldi    r24, 0x80; 128
    278e:    e7 e6           ldi    r30, 0x67; 103
    2790:    f0 e0           ldi    r31, 0x00; 0

00002792 <L_22>:
    2792:    11 92           st    Z+, r1
    2794:    11 92           st    Z+, r1
    2796:    11 92           st    Z+, r1
    2798:    11 92           st    Z+, r1
    279a:    11 92           st    Z+, r1
    279c:    11 92           st    Z+, r1
    279e:    11 92           st    Z+, r1
    27a0:    11 92           st    Z+, r1
    27a2:    81 50           subi    r24, 0x01; 1
    27a4:    b1 f7           brne    .-20     ; 0x2792 <L_22>


Это менее эффективно?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 15 2008, 19:39
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(AHTOXA @ Aug 15 2008, 21:57) *
Это менее эффективно?

А Вы посчитайте - если не ошибаюсь, Вы выиграли 2 такта и/или 3 слова программ. smile.gif
Зачем полировать то, что может быть гораздо шершавее ?
Другой вопрос, что на сях корявенько - через switch(lcd_state){...} состояния делаются, на асме через упрощенную кооперативную многопоточность куда проще и даже читабельнее, но это оффтоп.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:29
Рейтинг@Mail.ru


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