ViKo 1 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба Да там и в листинге будут видны две идентичные команды. Это конечно, только в симуляторе еще и такты видны. "Медленно как-то получается" - явно не из-за этих команд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 мая, 2010 Опубликовано 18 мая, 2010 (изменено) · Жалоба Хорошо, а если так: #define CS 4 #define CS_ON AT91C_BASE_PIOA->PIO_SODR=(1<<CS); int void main() { CS_ON; } Это копилятор оптимизирует? "Медленно как-то получается" - явно не из-за этих команд. Приду домой выложу код. Скорость проверялась на однородном заполнении экрана, там всего три команды. Изменено 18 мая, 2010 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба Это копилятор оптимизирует?Конечно. Выражение-то константное, значит может и будет расчитано на этапе компиляции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба Лучше написать #define CS_ON() AT91C_BASE_PIOA->PIO_SODR=(1<<CS); int main() { CS_ON(); } Чтобы было видно, что это функция, а не константа. Ой, а что это за int void main? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 мая, 2010 Опубликовано 18 мая, 2010 (изменено) · Жалоба Еслои быть точным, то в Кейловском примере пишется "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; } Что еще господа посоветуют для акселерации работы с дисплеем?. Изменено 18 мая, 2010 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба Что еще господа посоветуют для акселерации работы с дисплеем?. Оптимизацию включить и заинлайнить все. Заполнять он должен явно быстрее четырех раз в секунду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба уважаемый. Не хочу потратить еще 5 часов на поиски и чтение. В двух словах - как в KEIL это сделать? Еще раз все перепроверил, нашел пару мест, где недосмотрел, запустил во флеш - получилось - до переделки заполнение за 247 мс, после - за 72 мс. Кстати, в RAM работает в 2 раза медленнее. Это нормально? продолжаем экспериментировать - thumb режим - 59 мс. Оптимизация уровня 0 затормозила работу. Уровень 3 - привел к тем же 72 мс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба Кстати, в RAM работает в 2 раза медленнее. Это нормально? Нет, это не нормально. Оптимизация уровня 0 затормозила работу. Уровень 3 - привел к тем же 72 мс. Optimize for Time стоит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба Да, есть такая галка. А что же с RAM ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба А что же с RAM ? Предлагаете угадать? Проект лучше выложите, тогда посмотрим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба Вот проект Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба В конфигурации RAM оптимизация просто выключена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 мая, 2010 Опубликовано 18 мая, 2010 · Жалоба Я включил - ничего не изменилось В настройках вкладка С++, галка Optimize for time, галка Enable ARM/THUMB interworking, и optimization level 3. Я все правильно сделал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться