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

 
 
> Никак не обмануть 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
Ответов
rezident
сообщение Aug 15 2008, 15:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(demiurg_spb @ Aug 15 2008, 17:45) *
И попутно вопрос №2:
Я считал, что static const является альтернативой define.
Но, видимо, я заблуждался...
Конечно заблуждаетесь! #define это команда препроцессора, а не компилятора. По ней он всего лишь делает тупую подстановку и никаких проверок (соответствия типа, например) не происходит.
static const на разных архитектурах может интерпретироватся по-разному. Где-то под переменную будет выделена отдельная ячейка в ОЗУ, где-то константа будет размещена во Flash. Но в любом случае
static определяет класс переменных, констант и функций, "область видимости" которых ограничена текущим модулем или функцией.
const указывает на то, что переменная в текущем модуле или функции явным образом не модифицируется. Значение переменной типа const (если она в ОЗУ была расположена) можно изменять либо явным приведением типа, либо неявно, через указатель.

В вашем примере случай
Код
#define MY_ARRAY_SIZE 2
unsigned char my_array[MY_ARRAY_SIZE] = {0,0};

преобразуется препроцессором в
Код
unsigned char my_array[2] = {0,0};

А тот который дает ошибку
Код
static const unsigned char MY_ARRAY_SIZE = 2;
unsigned char my_array[MY_ARRAY_SIZE] = {0,0};

означает попытку объявить переменную my_array типа unsigned char и одновременно присвоить одной переменной со смещением равным значению MY_ARRAY_SIZE сразу два значения. Естественно, что компилятор обалдевает от такой наглости и выдает вам ошибку. biggrin.gif
Go to the top of the page
 
+Quote Post
Vokchap
сообщение Aug 15 2008, 15:25
Сообщение #3


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

Группа: Админы
Сообщений: 1 884
Регистрация: 15-07-06
Из: Новосибирск, Россия
Пользователь №: 18 835



Цитата(rezident @ Aug 15 2008, 18:10) *
static определяет класс переменных, констант и функций, "область видимости" которых ограничена текущим модулем или функцией.

Время жизни переменной также определяет (для полноты определения). smile.gif smile.gif
Go to the top of the page
 
+Quote Post



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

 


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


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