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

Как наибыстрейше вывести на экран точку?

2 minutes ago, GenaSPB said:

Этого не зватило

Не хватило - это как?

 

Я прописал только ее. Там еще есть dsp3D_LL_readFromDepthBuffer - ее пока не знаю как прописывать, поэтому закомментируйте, иначе функция не будет рисовать точку.

void dsp3D_drawPointDepthBuffer(int32_t x, int32_t y, float32_t z, color32_t color)
{
	if((x > -1) && (x < SCREEN_WIDTH) && (y > -1) && (y < SCREEN_HEIGHT))
	{
		int32_t index = (x + y * SCREEN_WIDTH) * 3;

	//	if(dsp3D_LL_readFromDepthBuffer(index) < z)
		//	return;

		dsp3D_LL_writeToDepthBuffer(index, z);
		dsp3D_LL_drawPoint(x, y, color);
		
	
	
		
	}
}

В main пробуйте последовательно

dsp3D_renderPoints  (это точно должно работать)

dsp3D_renderWireframe

dsp3D_renderFlat

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


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

 

 

 

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

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


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

5 minutes ago, GenaSPB said:

 

 

Так это на вашем 800 МГц проце.... А у меня 208 МГц. Но и у Фабио такой же проц и скорость нормальная. 

Нужно, чтобы кто нить запустил на F7.  Я все больше подозреваю, что тормозят операции с плавающей точкой. Не зря в библиотеке arm_math прописывается FPU_PRESENT и DSP_PRESENT... 

GenaSPB, а вы можете посчитать, сколько тактов проходит между вызова и записи точки? Если столько же сколько у меня (345-380) значит ваш проц берет частотой (что вряд ли - частота всего в 4 раза выше, а вот быстродействие в десятки раз). 

Если меньше, значит мой проц не рационально работает. 

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


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

Не только частотой. Тут а7 а не м7. И cmsis  скомпилирована с максимальной оптимизацией по скорости.

Еще вас спрашивали про пиксел клок вашего дисплея. В остатках кода увидел размеры 1024 на 600. По паспорту на 7 дюймов обычно 50 МГц. Скажем прямо - с таким дисплеем и при 32 бит цвете на работу процессора с памятью sdram на  FMC совсем не остается пропускной способности.    

1024 на 600 при 60 кадров в секунду и 32  бит цвете это около 200 мегабайт в секунду из памяти к ltdc.

На моем аппарате 800х480 и память 16 бит ddr3 на 533 мгц. Потому 120 мегабайт в секунду при 32 бит цвете не влияют существенно.

 

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

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


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

37 minutes ago, GenaSPB said:

Скажем прямо - с таким дисплеем и при 32 бит цвете на работу процессора с памятью sdram на  FMC совсем не остается пропускной способности.    

Нет. У меня дело в расчетах.  Ибо очистка экрана мгновенная, а вот кадр рисуется 1 секунду.

 

Хотя..... может быть попиксельное обращение к LTDC дезорганизует работу донельзя.....  сейчас посмотрю, как будет меняться время расчета, если отключить вывод на экран.

40 minutes ago, GenaSPB said:

Скажем прямо - с таким дисплеем и при 32 бит цвете

Поставил разрешение 800х480 - все равно медленно.

1 hour ago, GenaSPB said:

Нет не могу.

Простите, а в чем сложность? В 157 камне нет DWT или его аналога?

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


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

46 minutes ago, Salamander said:

Нет. У меня дело в расчетах.  Ибо очистка экрана мгновенная, а вот кадр рисуется 1 секунду.

 

Хотя..... может быть попиксельное обращение к LTDC дезорганизует работу донельзя.....  сейчас посмотрю, как будет меняться время расчета, если отключить вывод на экран.

Поставил разрешение 800х480 - все равно медленно.

Простите, а в чем сложность? В 157 камне нет DWT или его аналога?

Код подсчеиа иактов с использованием dwt  дайте

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


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

9 minutes ago, GenaSPB said:

Код подсчеиа иактов с использованием dwt  дайте

	delta_tick=DWT->CYCCNT-last_tick; // считаю разницу.
	last_tick=DWT->CYCCNT;		//обновляю счетчик.

Код выше вставляете в функцию dsp3D_drawPointDepthBuffer (неважно куда)

Глобально объявляете     uint32_t last_tick, delta_tick;

delta_tick - смотрите в отладчике в нем постоянно разница тактов

 

Вот это инициализация DWT в F7. Как в MP157 - не знаю.

uint32_t DWT_Delay_Init(void) {
  /* Disable TRC */
 // CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000;
  /* Enable TRC */
//  CoreDebug->DEMCR |=  CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000;

	DWT->LAR = 0xC5ACCE55; 
  /* Disable clock cycle counter */
  DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001;
  /* Enable  clock cycle counter */
  DWT->CTRL |=  DWT_CTRL_CYCCNTENA_Msk; //0x00000001;

  /* Reset the clock cycle counter value */
  DWT->CYCCNT = 0;

     /* 3 NO OPERATION instructions */
     __ASM volatile ("NOP");
     __ASM volatile ("NOP");
  __ASM volatile ("NOP");

  /* Check if clock cycle counter has started */
     if(DWT->CYCCNT)
     {
       return 0; /*clock cycle counter started*/
     }
     else
  {
    return 1; /*clock cycle counter not started*/
  }
}

 

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


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

3 часа назад, Salamander сказал:

В первом условии накосячить сложно, да и по факту  - всего 7 тактов занимает запись точки.

Это не запись точки. Неправильно измерили. Есть такое понятие как "кеш" для внешней памяти. Хоть включен ли он у вас - только вам ведомо.  :unknw:

3 часа назад, Salamander сказал:

Еще вопрос - серия F7 имеет  аппаратную поддержку плавающей точки? Наверное да. Если так, то может быть такое, что у меня эта функция отключена?

Посмотреть в листинги и убедиться.

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


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

Quote

 Как в MP157 - не знаю.

Да, там DWT такого нет... Есть дркугие счетчики циклов но Вам они бесполезны...

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


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

13 minutes ago, jcxz said:

Это не запись точки. Неправильно измерили. Есть такое понятие как "кеш" для внешней памяти. Хоть включен ли он у вас - только вам ведомо.  

Все может быть. Но если я к памяти вообще не обращаюсь, а просто рассчитываю точку, это занимает 380 тактов. Если поделить частоту (208 мгц) на такты и на разрешение получится чуть больше секунды. Примерно одну секунду у меня и рассчитывается один кадр.

Вот скрин с демо 

Q5xDJV6k.png?download=1&name=%D0%A1%D0%B

я подразобрался в библиотеке. В функцию вывода точки действительно нужно добавить строки для заполнения буфера. А вывод буфера на экран отдельная функция - dsp3D_present

render - это время расчета.

present - это вывод на экран кадра.

Как видите, расчет при 480х272 занимает 41 ms

считаем.  480х272х20.4 =  2 663 424 точки в секунду.

То есть примерно 78 тактов на точку при 208 МГц.  А у меня 380

9 minutes ago, GenaSPB said:

Есть дркугие счетчики циклов но Вам они бесполезны...

А вы знаете, как их запустить?

Как потом использовать - я написал

delta_tick=DWT->CYCCNT-last_tick; // считаю разницу.
	last_tick=DWT->CYCCNT;		//обновляю счетчик.

Гляньте, навскидку, все ли хорошо в настройках arm_math?

 

arm_math.h

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

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


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

.... Нафик. Стер. При вызове dsp3D_projectVertex из dsp3D_renderPoint используется память за пределами массива coord.
И об этом сообщает компилятор еще до исполнения... Куда автор смотрел?

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


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

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

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

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

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

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

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

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

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

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