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

 
 
9 страниц V  « < 7 8 9  
Reply to this topicStart new topic
> Сбылась мечта идиота - приехали программатор и SAM7S256, Теперь нужен ликбез.
ViKo
сообщение May 18 2010, 11:36
Сообщение #121


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Сергей Борщ @ May 18 2010, 14:24) *
Да там и в листинге будут видны две идентичные команды.

Это конечно, только в симуляторе еще и такты видны.
"Медленно как-то получается" - явно не из-за этих команд.
Go to the top of the page
 
+Quote Post
zheka
сообщение May 18 2010, 11:52
Сообщение #122


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Хорошо, а если так:
Код
#define CS 4

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

int void main()
{
CS_ON;
}

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

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


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

Сообщение отредактировал zheka - May 18 2010, 11:37
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 18 2010, 11:54
Сообщение #123


Гуру
******

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



Цитата(zheka @ May 18 2010, 14:52) *
Это копилятор оптимизирует?
Конечно. Выражение-то константное, значит может и будет расчитано на этапе компиляции.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение May 18 2010, 12:07
Сообщение #124


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Лучше написать
Код
#define CS_ON() AT91C_BASE_PIOA->PIO_SODR=(1<<CS);
int main()
{
CS_ON();
}

Чтобы было видно, что это функция, а не константа.
Ой, а что это за int void main?
Go to the top of the page
 
+Quote Post
zheka
сообщение May 18 2010, 13:47
Сообщение #125


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Еслои быть точным, то в Кейловском примере пишется "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 - May 18 2010, 13:56
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 18 2010, 15:24
Сообщение #126


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zheka @ May 18 2010, 17:47) *
Что еще господа посоветуют для акселерации работы с дисплеем?.

Оптимизацию включить и заинлайнить все. Заполнять он должен явно быстрее четырех раз в секунду.
Go to the top of the page
 
+Quote Post
zheka
сообщение May 18 2010, 15:50
Сообщение #127


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



уважаемый. Не хочу потратить еще 5 часов на поиски и чтение. В двух словах - как в KEIL это сделать?
Еще раз все перепроверил, нашел пару мест, где недосмотрел, запустил во флеш - получилось - до переделки заполнение за 247 мс, после - за 72 мс.

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

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

Оптимизация уровня 0 затормозила работу. Уровень 3 - привел к тем же 72 мс.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 18 2010, 16:35
Сообщение #128


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zheka @ May 18 2010, 19:50) *
Кстати, в RAM работает в 2 раза медленнее. Это нормально?

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

Цитата(zheka @ May 18 2010, 19:50) *
Оптимизация уровня 0 затормозила работу. Уровень 3 - привел к тем же 72 мс.

Optimize for Time стоит?
Go to the top of the page
 
+Quote Post
zheka
сообщение May 18 2010, 16:53
Сообщение #129


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Да, есть такая галка.
А что же с RAM ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 18 2010, 17:14
Сообщение #130


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zheka @ May 18 2010, 20:53) *
А что же с RAM ?

Предлагаете угадать? Проект лучше выложите, тогда посмотрим.
Go to the top of the page
 
+Quote Post
zheka
сообщение May 18 2010, 17:34
Сообщение #131


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Вот проект
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 18 2010, 17:47
Сообщение #132


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



В конфигурации RAM оптимизация просто выключена.
Go to the top of the page
 
+Quote Post
zheka
сообщение May 18 2010, 18:16
Сообщение #133


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Я включил - ничего не изменилось
В настройках вкладка С++, галка Optimize for time, галка Enable ARM/THUMB interworking, и optimization level 3. Я все правильно сделал?
Go to the top of the page
 
+Quote Post

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

 


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


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