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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> BF533 отрисовка на дисплей, шина EBIU
__inline__
сообщение Sep 8 2017, 22:24
Сообщение #31


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(jcxz @ Sep 8 2017, 19:01) *
И сколько получилось? 40+15 FPS? И это по 16-битной шине?? Это всё равно очень медленно.


Это FPS всего эмулятора, а не экранный FPS:

Код
while(!quit)
{
// эмуляция процессоров Z80, M68020
// эмуляция видео-подсистемы (4 графических слоя)
// эмуляция звуковой системы (FM синтезатор + ADPCM + Wav sound*4 канала)
// эмуляция системы ввода
// эмуляция памяти
//эмуляция ROM-set-а

// отрисовка на дисплей
// вывод звука
// считывание клавиш
}


Вот это всё ВМЕСТЕ - 55 FPS ! biggrin.gif

Сообщение отредактировал __inline__ - Sep 8 2017, 22:25
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 8 2017, 23:13
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 193
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(__inline__ @ Sep 9 2017, 05:24) *
Это FPS всего эмулятора, а не экранный FPS:
Код
// эмуляция процессоров Z80, M68020}

да как-то всё равно не очень-то быстро.
Z80 на АВРах даже как-то эмулируется, 68к с его 5мипсами не особо сложнее должно быть.
а тут целый блэкфин на 550МГц.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 9 2017, 06:49
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 3 643
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(_pv @ Sep 9 2017, 06:13) *
да как-то всё равно не очень-то быстро.
Z80 на АВРах даже как-то эмулируется, 68к с его 5мипсами не особо сложнее должно быть.
а тут целый блэкфин на 550МГц.

Не просто "не быстро", а ОЧЕНЬ медленно.
Лет уже почти 20 назад писал подобный эмулятор только для КР580ВМ80 3МГц-ового и на компе с CPU = i486 работающем на 100МГц (или 120?).
FPS у меня получался (если без задержек и без эмуляции реалтайма) в несколько раз выше чем на эмулируемой системе.
Так, что я даже сделал потом эмуляцию реалтайма: для каждой эмулируемой команды суммировал её время выполнения и периодически делал задержку для компенсации лишнего времени. И графика у меня тоже эмулировалась (2 режима: 256*256*4 бита или 512*256*2 бита с регистрами палитры) и звуковой синтезатор (3 + 1 канала) и прочая периферия.
И (если не вносить задержки) всё летало в несколько раз быстрее чем на эмулируемой системе.
Да и как иначе - процессор эмулятора уже был на порядки быстрее эмулируемого.
А у автора ещё в разы более мощная система.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 9 2017, 07:10
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 5-09-17
Пользователь №: 99 126



Если критические участки в программе переписывать на Ассемблере (эмуляция процессоров, эмуляция графики / звука), то производительность должна вырасти.
Это выходит за рамки моей задачи, так как было нужно портировать эмулятор (автором которого я НЕ являюсь) на устройство с ADSP BF533.

В целом результатом доволен, быстродействие вышло таким:

45 - 55 FPS при эмуляции CPS1
30 - 40 FPS при эмуляции CPS2.

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

Система CPS слишком наворочена, так как графика/звук у неё заточены под игры(быстрые).
И не надо сравнивать какой-то допотопный КР580ВМ80 в связке с убогой графикой (Спектрум небось? biggrin.gif )

Ну и вдогонку: телефон с процессором ARM9 800 МГц воспроизводит данный эмулятор хуже (не мой порт), и КПК на 300 МГц ещё хуже!

Замерял количество полных отрисовок экрана за 1 секунду (Буфер 320x224x2 из SDRAM + конвертация 16-битной палитры + вывод на дисплей) - 188 раз.

Мерял этим:

Код
static __inline__ enable_cycles(void)
{
__asm__ __volatile__ ("R2=SYSCFG;");
__asm__ __volatile__ ("BITSET(R2,1);");
__asm__ __volatile__ ("SYSCFG=R2;");
}

static __inline__ disable_cycles(void)
{
__asm__ __volatile__ ("R2=SYSCFG;");
__asm__ __volatile__ ("BITCLR(R2,1);");
__asm__ __volatile__ ("SYSCFG=R2;");
}

static __inline__ start_cycles(void)
{
__asm__ __volatile__ ("R2=0;");
__asm__ __volatile__ ("CYCLES=R2;");
__asm__ __volatile__ ("CYCLES2=R2;");
}

static __inline__ u64 get_cycles(void)
{
u32 t0,t1;
__asm__ __volatile__ ("%0=cycles;%1=cycles2;":"=d"(t0),"=d"(t1));
return t0|((u64)t1<<32);
}



Цитата(_pv @ Sep 8 2017, 23:13) *
да как-то всё равно не очень-то быстро.
Z80 на АВРах даже как-то эмулируется, 68к с его 5мипсами не особо сложнее должно быть.
а тут целый блэкфин на 550МГц.


Это типа троллинг? santa2.gif
Полный перечень того что делается:

Цитата
// эмуляция процессоров Z80, M68020
// эмуляция видео-подсистемы (4 графических слоя)
// эмуляция звуковой системы (FM синтезатор + ADPCM + Wav sound*4 канала)
// эмуляция системы ввода
// эмуляция памяти
//эмуляция ROM-set-а

// отрисовка на дисплей
// вывод звука
// считывание клавиш

Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 9 2017, 08:03
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 2 193
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(__inline__ @ Sep 9 2017, 13:10) *
Это типа троллинг?

вовсе нет, просто на первый взгляд ресурсов там более чем достаточно для этой задачи. и то что просто использование ДМА для вывода в дисплей на треть подняло fps просто намекает на не очень оптимальное этих ресурсов использование.
но тут да, надо допиливать код под блэкфин.


> Полный перечень того что делается:
// эмуляция процессоров Z80, M68020
Z80 вполне эмулируется на avr, 68к не особо сложнее, арифметика только по разрядности не для 8ми битного авр.

// эмуляция видео-подсистемы (4 графических слоя)
тут не скажу, но отрисовка 2д спрайтов не должна быть сильно уж затратнее чем эмуляция основного процессора.

// эмуляция звуковой системы (FM синтезатор + ADPCM + Wav sound*4 канала)
с этим в оригинале вроде как Z80 и справлялся.

// эмуляция памяти return mem[addr]
//эмуляция ROM-set-а return rom[addr]
// отрисовка на дисплей DMA
// вывод звука DMA

// эмуляция системы ввода
// считывание клавиш
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 9 2017, 08:34
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 3 643
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Sep 9 2017, 14:10) *
И не надо сравнивать какой-то допотопный КР580ВМ80 в связке с убогой графикой (Спектрум небось? biggrin.gif )

В чём убогость-то? У Вас вроде 320*224? И во сколько раз это отличается от 256*256? А во сколько раз отличается частота вашего CPU от древнего i486?
И какие частоты у эмулируемых ваших CPU? Во сколько раз они отличаются от ВМ80?
Эмулируемые системы вполне сравнимы по скорости.
И это при том, что система команд у DSP гораздо более эффективна для обработки потоковых данных (конвертации экранной картинки).
И ресурсов (и по частоте CPU и по скорости работы системы памяти) у вас в разы больше чем было у меня на i486.
Да и тут уже несколько раз Вам показали с цифрами, что вывод картинки у Вас должен быть в разы быстрее.

Цитата(__inline__ @ Sep 9 2017, 14:10) *
Это типа троллинг? santa2.gif

Нет. Просто кому-то для частотного управления двигателем достаточно слабого 8-битника, а кому-то гигагерцового ARM-а не хватает для мигания лампочками.... laughing.gif

Цитата(__inline__ @ Sep 9 2017, 14:10) *
Полный перечень того что делается:

И что?
И сколько тактов тратится на "эмуляция памяти"? Или на "эмуляция ROM-set-а"? biggrin.gif
В чём сложность-то? Самое тяжёлое там: эмуляция графики. Но, как уже заметил ув. _pv, даже с самыми тормозными характеристиками вашей шины достаточно 3мсек на вывод всей картинки. Остальное - вообще крохи.

Цитата(_pv @ Sep 9 2017, 15:03) *
// эмуляция звуковой системы (FM синтезатор + ADPCM + Wav sound*4 канала)
с этим в оригинале вроде как Z80 и справлялся.

Не знаю, что там у автора понимается под этим синтезатором, но думаю скорее всего - три канала генерации тонального сигнала с устаналиваемыми частотами, с последующим смешиванием этих каналов в один.
Для DSP (тем более такого довольно высокого класса) это пара процентов загрузки CPU максимум.
Когда-то писал на TMS320VC5502 на 220МГц. И у меня ЧМ-модулятор генерил поток 96kS/s на внешний кодек, параллельно принимая с него-же поток сэмплов. При этом нагружая этот самый DSP всего на несколько единиц процентов.

PS: Сорри - нашёл и заглянул сейчас в тот свой код ЧМ-модулятора, пересчитал - он занимал процессорного времени менее 0.5%. И это ещё не самый быстрый алгоритм (считаю синус полиномом), можно гораздо быстрее.
Непонятно какие могут быть трудности с каким-то "FM-синтезатором" звуковой частоты wacko.gif
На CPU автора (даже если предположить, что он генерит 3 синусоидальных сигнала и смешивает их потом, а не тупо - 3 меандра biggrin.gif ) даже в случае 3 синусоид и частоты квантования 48кГц, загрузка CPU этим синтезатором должна быть менее 1%.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 9 2017, 09:23
Сообщение #37


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата
заглянул сейчас в тот свой код ЧМ-модулятора, пересчитал - он занимал процессорного времени менее 0.5%. И это ещё не самый быстрый алгоритм (считаю синус полиномом), можно гораздо быстрее. Непонятно какие могут быть трудности с каким-то "FM-синтезатором" звуковой частоты


Цитата
На CPU автора (даже если предположить, что он генерит 3 синусоидальных сигнала и смешивает их потом, а не тупо - 3 меандра biggrin.gif ) даже в случае 3 синусоид и частоты квантования 48кГц, загрузка CPU этим синтезатором должна быть менее 1%.


Так и хочется натянуть свой опыт, да? biggrin.gif
Не выйдёт.
Не мешайте говно с мёдом.......

Для начала советую поразмыслить над тем, как эмуляция вашего ЧМ-модулятора относится к:

1) Capcom System QSound™
2) Yamaha YM2151
3) OKI6295

Вы хотя бы один из этих чипов эмулировали ?

Более на дебаты теоретиков не реагирую.

------------------

А теперь вопросы:

1) Насколько тормозной тип double для BlackFin ? Имеет ли смысл его заменить float ?

2) Каким образом можно изменить параметры растактовки шины EBIU для асинхронного банка, когда он был инициализирован ранее?
Тоесть переинициализировать. После того как EBIU запущен, изменить параметры перезаписью в региcтры: EBIU_AMBCTL0 EBIU_AMBCTL1 EBIU_AMGCTL не получается!


Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 9 2017, 09:40
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 3 643
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Sep 9 2017, 16:23) *
Для начала советую поразмыслить над тем, как эмуляция вашего ЧМ-модулятора относится к:

Относится так, что любой источник звука - это генератор синусоиды (в самом тяжёлом случае) или их суммы. ЧМ-модулятор - тоже генерит синусоиду.
А более простые звуковые синтезаторы вообще меандры генерят. laughing.gif
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 9 2017, 09:56
Сообщение #39


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 5-09-17
Пользователь №: 99 126



Попробовал поставить частоту дискретизации 22050 Гц вместо 44100. Скорость всей эмуляции возросла до 75 FPS.
Из чего можно сделать вывод, что звуковая система занимает приличный ресурс времени.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 9 2017, 10:07
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 3 643
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(__inline__ @ Sep 9 2017, 16:56) *
Из чего можно сделать вывод, что звуковая система занимает приличный ресурс времени.

Из чего можно сделать вывод что её тоже надо оптимизировать biggrin.gif
PS: Насчёт "параметров растактовки шины EBIU" - это правильный ход мыслей, но тут я не советчик.

Цитата(__inline__ @ Sep 9 2017, 16:23) *
1) Насколько тормозной тип double для BlackFin ? Имеет ли смысл его заменить float ?

Если ваш Blackfin не имеет аппаратной поддержки double (смотреть надо мануал на ядро), то очень тормозной - на порядки медленнее аппаратного. И если можно заменить - следует менять.
А если он не имеет аппаратной поддержки и float тоже, то лучше стараться вообще не использовать плавучку. Тем более, что она редко когда реально нужна.
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 9 2017, 10:19
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 2 193
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(__inline__ @ Sep 9 2017, 15:23) *
А теперь вопросы:

1) https://ez.analog.com/thread/43898
2) что-то не припомню никаких граблей при одновременном использовании на EBUI sdram и асинхронной шины.

Цитата(jcxz @ Sep 9 2017, 17:07) *
Из чего можно сделать вывод что её тоже надо оптимизировать biggrin.gif

так точно.
генераторы синуса и проигрование wavов, по нормальному реализованные, не могут занимать столько же времени как та же обработка палитры для всей картинки, объёмы данных не сравнимы.
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 9 2017, 10:33
Сообщение #42


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(_pv @ Sep 9 2017, 10:19) *
2) что-то не припомню никаких граблей при одновременном использовании на EBUI sdram и асинхронной шины.

Не про то вопрос был.
Когда я меняю параметры асинхронного банка (на котором висит дисплей) ПОВТОРНО - новые параметры не вступают в силу!
В мануале написано, что не следует менять параметры контроллера шины EBIU именно AMB во время его работы (тоесть когда уже проинициализирован) - мой случай.
Тогда как их менять, если по зарез надо?
При нажатии на reset ведь как-то работает. Может есть какой-нибудь способ перезагрузить параметры шины?

Цитата
Если ваш Blackfin не имеет аппаратной поддержки double (смотреть надо мануал на ядро), то очень тормозной - на порядки медленнее аппаратного. И если можно заменить - следует менять.
А если он не имеет аппаратной поддержки и float тоже, то лучше стараться вообще не использовать плавучку. Тем более, что она редко когда реально нужна.

Это плохо!
Весь код звуковой системы на плавучке. Эмулятор был написан для x86 на языке Cи, при перекладке кода на Blackfin, будет эмуляция FPU.
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 9 2017, 12:52
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 2 193
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(__inline__ @ Sep 9 2017, 17:33) *
Когда я меняю параметры асинхронного банка (на котором висит дисплей) ПОВТОРНО - новые параметры не вступают в силу!
В мануале написано, что не следует менять параметры контроллера шины EBIU именно AMB во время его работы (тоесть когда уже проинициализирован) - мой случай.

то есть в регистр EBIU_AMBCTL0 ничего не пишется??
а если сначала перед этим в EBIU_AMGCTL ноль записать, а потом поменять EBIU_AMBCTL0 и активировать банк обратно?
Go to the top of the page
 
+Quote Post
__inline__
сообщение Sep 11 2017, 04:10
Сообщение #44


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 5-09-17
Пользователь №: 99 126



Цитата(_pv @ Sep 9 2017, 10:19) *

Чуть-помогло (+5 FPS), сделал -fast-fp , бинарник чуть-вырос, что свидетельствует о замене либы, что радует.

Цитата
то есть в регистр EBIU_AMBCTL0 ничего не пишется??
а если сначала перед этим в EBIU_AMGCTL ноль записать, а потом поменять EBIU_AMBCTL0 и активировать банк обратно?

Принял решение временно поиграться с загрузчиком - в нем менял времянки, увы - те что стоят оптимальны по устойчивости и быстродействию.
Попытка укоротить setup, hold, write - приводит к плачевным результатам: кривая картинка на дисплее или её отсутствие.
Кстати, дисплей буферизован - он подключен к шине через микросхему буфера, чтобы избежать ёмкостного шунтирования SDRAM, которая тоже висит на шине.

Если дисплей привешать к PPI, то к нему можно будет обращаться как к массиву точек? Или PPI генерит свою развёртку ?
Дисплей PPT9999-A003-06-Q со встроенным контроллером S6E63D6.

Вот драйвер для него (тоже сам писал):

Код
/*
Display PPT9999-A003-06-Q
S6E63D6 Display Controller Driver
*/

#define OLED_Command (*(volatile u16*) 0x20000000)
#define OLED_Data    (*(volatile u16*) 0x20010000)

const u8 Font8x8[2048]=
{
//тут моноширный шрифт 8x8 пикселей кодировка DOS :)
}

u16 OLED_Key;  //Цвет прозрачности
u16 OLED_Back; //Цвет фона

void OLED_Register(u8 c,u16 d)
{
OLED_Command=c;
OLED_Data=d;
}

void OLED_Prepare(void)
{
OLED_Command=0x23;          //Select 18-/16-bit Data Bus Interface
OLED_Register(0x03,0x0111); //16-bit Mode
OLED_Register(0x10,0x0000); //IC Standby Off
OLED_Register(0x05,0x0000); //Display Off
OLED_Register(0x18,0x003D); //Frame Rate > 80 Hz
OLED_Register(0xF8,0x000F); //VGH = +5V
OLED_Register(0xF9,0x000F); //VGL = -5V
OLED_Register(0x70,0x2B80); //Gamma Top/Bottom R
OLED_Register(0x71,0x3600); //Gamma Top/Bottom G
OLED_Register(0x72,0x3E00); //Gamma Top/Bottom B
OLED_Register(0x73,0x1F19); //Gamma Top Bottom R1,2
OLED_Register(0x74,0x2214); //Gamma Top Bottom R3,4
OLED_Register(0x75,0x221B); //Gamma Top Bottom G1,2
OLED_Register(0x76,0x1E16); //Gamma Top Bottom G3,4
OLED_Register(0x77,0x241E); //Gamma Top Bottom B1,2
OLED_Register(0x78,0x2617); //Gamma Top Bottom B3,4
SimpleDelay(1000000);
OLED_Register(0x05,0x0001); //Display On
}

void OLED_Rectangle(u16 xs,u8 ys,u16 xe,u8 ye)
{
OLED_Register(0x35,319-xe);
OLED_Register(0x36,319-xs);
OLED_Register(0x37,(ys<<8)|ye);
OLED_Register(0x20,ys);
OLED_Register(0x21,319-xs);
OLED_Command=0x22;
}

void OLED_Clear(u16 Color)
{
register u32 i;
OLED_Rectangle(0,0,319,239);
for(i=0;i<320*240;i++) OLED_Data=Color;
}

void OLED_OutChar(u16 x,u8 y,u8 c,u16 k)
{
register u32 i;
OLED_Rectangle(x<<3,y<<3,(x<<3)+7,(y<<3)+7);
for(i=0;i<64;i++)
{
  if(((Font8x8[(c<<3)+(i>>3)]>>(7-(i&7)))&1)) OLED_Data=k;
  else OLED_Data=OLED_Back;
}
}

void OLED_OutString(u16 x,u8 y,u8* s,u16 k)
{
register u32 i=0;
while(s[i])
{
  OLED_OutChar(x+i,y,s[i],k);
  i++;
}
}

void OLED_OutNumber(u16 x,u8 y,u16 n,u16 k)
{
OLED_OutChar(x  ,y,(n/100)%10+'0',k);
OLED_OutChar(x+1,y,(n/ 10)%10+'0',k);
OLED_OutChar(x+2,y, n     %10+'0',k);
}

void OLED_OutSprite(u16 x,u8 y,u16 w,u8 h,const u8* s)
{
register u32 i;
register u16 c;
register u16 *S=(u16*)s;
OLED_Rectangle(x,y,x+w-1,y+h-1);
for(i=0;i<(w*h);i++)
{
  if((c=S[i])!=OLED_Key) OLED_Data=c;
  else OLED_Data=OLED_Back;
}
}
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 11 2017, 07:44
Сообщение #45


Гуру
******

Группа: Свой
Сообщений: 2 193
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(__inline__ @ Sep 11 2017, 11:10) *
Если дисплей привешать к PPI, то к нему можно будет обращаться как к массиву точек? Или PPI генерит свою развёртку ?
Дисплей PPT9999-A003-06-Q со встроенным контроллером S6E63D6.

у этого контроллера даже есть тупо 16ти битный RGB интерфейс, который на ppi вешается без какой-либо дополнительной логики вообще, просто напрямую.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th September 2017 - 19:28
Рейтинг@Mail.ru


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