Перейти к содержанию
    

Сбылась мечта идиота - приехали программатор и SAM7S256

Да там и в листинге будут видны две идентичные команды.

Это конечно, только в симуляторе еще и такты видны.

"Медленно как-то получается" - явно не из-за этих команд.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо, а если так:

#define CS 4

#define CS_ON AT91C_BASE_PIOA->PIO_SODR=(1<<CS);

int void main()
{
CS_ON;
}

Это копилятор оптимизирует?

 

"Медленно как-то получается" - явно не из-за этих команд.

 

Приду домой выложу код. Скорость проверялась на однородном заполнении экрана, там всего три команды.

Изменено пользователем zheka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это копилятор оптимизирует?
Конечно. Выражение-то константное, значит может и будет расчитано на этапе компиляции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше написать

#define CS_ON() AT91C_BASE_PIOA->PIO_SODR=(1<<CS);
int main()
{
CS_ON();
}

Чтобы было видно, что это функция, а не константа.

Ой, а что это за int void main?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еслои быть точным, то в Кейловском примере пишется "int main (void) {"

 

Вот функции,выполняющие заливку экрана.

void lcd_write_byte(uint8_t data, uint8_t D_C)
{    
unsigned long d; 
CS_OFF;                                //Выбор LCD
if (D_C) DCX_ON else DCX_OFF;     //Если данные то DCX =1  если команда то DCX = 0
  AT91C_BASE_PIOA->PIO_ODSR = data;    //Данные в порт
WRX_OFF;                            //Установка сигнала записи
WRX_ON;                             //Снятие сигнала записи

}


void lcd_fill_screen(uint32_t color)
{
uint32_t num;
lcd_write_byte(RAMWR, 0);
for(num = 0; num < 0x012C00; num++)
  {
   lcd_write_byte(r(color),1);     
   lcd_write_byte(g(color),1);     
   lcd_write_byte(b(color),1);     
  }
}

 

Приведены в оригинале. Мне удалось увеличить скорость. ПОка измерял на глазок - 16 заливок раньше выполнялось за 6 секунд, теперь за 4.

Что я сделал - убрал из lcd_write_byte строку проверки data_or_command (D_C) и сделал две разные - одну для вывода данных, другую для вывода команды, убрал и включение и выключение DCX в этих функциях, включаю принудительно перед каждым блоком работы с данными.

Далее, убрал из lcd_write_byte CS_OFF (выбор чипа) и прописал эту команду в местах где начинается работа с LCD.

В lcd_fill_screen я заменил lcd_write_byte(b(color),1); на bb=b(color); lcd_write_byte_data(bb); То есть составляющие цвета не вычленяются каждый раз при записи байта.

 

Получилось вот что:

void lcd_write_byte(uint8_t data, uint8_t D_C)
{    
CS_OFF;                                //Выбор LCD
if (D_C) DCX_ON else DCX_OFF;     //Если данные то DCX =1  если команда то DCX = 0
  AT91C_BASE_PIOA->PIO_ODSR = data;    //Данные в порт
WRX_OFF;                            //Установка сигнала записи
WRX_ON;                             //Снятие сигнала записи

}


void lcd_write_byte_data(uint8_t data)
{    
  AT91C_BASE_PIOA->PIO_ODSR = data;    //Данные в порт
WRX_OFF;                            //Установка сигнала записи
WRX_ON;                             //Снятие сигнала записи

}

void lcd_write_byte_command(uint8_t data)
{    
  AT91C_BASE_PIOA->PIO_ODSR = data;    //Данные в порт
WRX_OFF;                            //Установка сигнала записи
WRX_ON;                             //Снятие сигнала записи

}



void lcd_fill_screen(uint32_t color)
{
uint32_t num;
uint8_t rr,gg,bb;
rr=r(color); // выделяем
gg=g(color); // цветовые составляющие 
bb=b(color); //заранее
DCX_OFF; // строб команды
lcd_write_byte_command(RAMWR);
DCX_ON;  // строб данных
for(num = 0; num < 0x012C00; num++)
  {
   lcd_write_byte_data(rr);  // передаем данные с помощью оптимизированной функции
   lcd_write_byte_data(gg);     
   lcd_write_byte_data(bb);     
  }
DCX_ON;
}

 

Что еще господа посоветуют для акселерации работы с дисплеем?.

Изменено пользователем zheka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что еще господа посоветуют для акселерации работы с дисплеем?.

Оптимизацию включить и заинлайнить все. Заполнять он должен явно быстрее четырех раз в секунду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

уважаемый. Не хочу потратить еще 5 часов на поиски и чтение. В двух словах - как в KEIL это сделать?

Еще раз все перепроверил, нашел пару мест, где недосмотрел, запустил во флеш - получилось - до переделки заполнение за 247 мс, после - за 72 мс.

 

Кстати, в RAM работает в 2 раза медленнее. Это нормально?

 

продолжаем экспериментировать - thumb режим - 59 мс.

 

Оптимизация уровня 0 затормозила работу. Уровень 3 - привел к тем же 72 мс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, в RAM работает в 2 раза медленнее. Это нормально?

Нет, это не нормально.

 

Оптимизация уровня 0 затормозила работу. Уровень 3 - привел к тем же 72 мс.

Optimize for Time стоит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я включил - ничего не изменилось

В настройках вкладка С++, галка Optimize for time, галка Enable ARM/THUMB interworking, и optimization level 3. Я все правильно сделал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...