Jump to content

    

__inline__

Участник
  • Content Count

    740
  • Joined

  • Last visited

Everything posted by __inline__


  1. Цитата(mantech @ Sep 27 2017, 13:02) Ковырял МХ6 соло, и аллвиннер А10(13), с последним пока затык из-за времени. На МХ6 есть СДК для программирования без оси, с глюками, но разобраться можно. Графики нет нигде, в линуксе есть какие-то либы, но копаться в них очень утомительно, да и мне особо не нужно было, я использовал только 2Д-графику. С ситарами не работал, но, как говорили мне, там тоже далеко не все прекрасно. В MX6 Solo графика 2D- открыта? Выствить нужное разрешение, глубину цвета, частоту обновления смогу? Бит-блиттинг (bitblt) копирование из видеопамяти в другой участок видеопамяти с цветом прозрачности есть? Цитата(aaarrr @ Sep 27 2017, 13:16) DS, UM и даже схемы Я не нашел там даташит с описанием хотя бы базовых регистров. А также как написать standalone application. Цитата(mantech @ Sep 27 2017, 13:02) На МХ6 есть СДК для программирования без оси, с глюками, но разобраться можно. Уже прикрыли: https://community.nxp.com/docs/DOC-94139 При скачивании выдает, что временно недоступно, свяжитесь с их белыми воротничками для доступности скачивания. Что за дела вообще творятся? Продают камни без документации, это самое настоящее мудачество для электронщиков... у меня нет слов!
  2. Скачал AM335x Linux SDK BSP Source Code - файл am335x-evm-linux-rt-sdk-src-04.00.00.04.tar.xz Оказалось полным разводом, вообще нет ничего, что касается AM335x, куча каких-то других микросхем: opl4, m68k, mpu401, даже видео на уровне vesa. Скаладывается такое впечатление, что тут: http://software-dl.ti.com/processor-sdk-li.../index_FDS.html решили просто на отшибись выложить дерьмо с которым поделиться не жалко...
  3. 1) Отечественная продукция типа "Байкал", "Элвис", "КомДив" - с частными лицами не работают. В топку. 2) На рокчип RK3288 внятной документации не нашёл 3) Сейчас смотрю в сторону TI Sitara 335x БиглБоны Черные, доступны на АЛиЭксперссе, 1 ГГц, есть плавучка NEON, поддержка видео 2D/3D. Скачал Linux SDK на 1 Гб. Неужели в Линуксовых сорцах 3д- 2д- ускоритель тоже не используется из-за закрытости? 4) Да, я ССЗБ, как тут сказали, low-level-programming - моё увлечение, есть наработки в виде разных приложений типа эмуляторов, игр. Сейчас стоит цель поднять быстродействие некоторых приложений в 1,5-2 раза, без сильной оптимизации кода (код должен быть на С, с минимумом ассемблера). Сроки неограничены. mantech и jcxz как я вычитал, ковыряли камни на уровне bare-metal, посоветуйте хороший камень для комфортного ковыряния!!! TI Sitara 335x БиглБоны Черные - сойдет с позиции открытости или тоже фигня?
  4. Цитата(AVR @ Sep 27 2017, 10:04) Я не слепой и вижу: Но нет таких графических процессоров с документацией. Разве что может 2D простейший ускоритель блиттинга не более. Есть попытки реализовать открытые драйвера для Linux для 3D, но документацией там может и не пахнет. Остальное то вроде документировано. Подозреваю задача, где планируется жесткая сертификация, какой-нибудь авиационный индикатор или вроде того, может промышленное что-то критическое. А потому наверное какие-то SDK не подходят, т.к. предположительно не открыты и не имеют документации, только лишь API. Если есть какая-то полезная информация в SDK, то это тоже рассматривается. Это даже местами лучше, так как в исходном коде программы часто освещены моменты, упущенные в документации. В те дальние времена, мне пришлось программировать видеокарты 3Dfx Voodoo2 и Voodoo3. Документация с небольшими примерами была доступна. Ради интереса её прикрепил к этому посту, вот как должно быть как минимум расписан 3D-ускоритель для того чтобы можно было ваять программы. [attachment=108988:Voodoo2.pdf] Ну и пример работающей программы (целиком на ассемблере), собственно выводит движущийся тунель: [attachment=108989:V2Tunnel.txt] Так есть камни с открытой документацией на графический процессор?
  5. Цитата(blackfin @ Sep 27 2017, 09:14) Zynq UltraScale+!!! Как у них с документацией? 1) свободно для скачивания 2) прийдётся клянчить под NDA с бюрократической волокитой 3) закрыто Мне нужно: настройка частот ядра, шины. Настройка кеша данных, инструкций, конфигурирование SPI, GPIO, DMA, Memory DMA, загрузка своего кода, видео-подсистема на уровне формирования кадра, 2D-движок (блитинг), опционально: 3D-движок (рисование полигонов с текстурой и освещением) У вышеупомянутых процессоров(в первом посте) недостаточно частоты ядра или нет аппаратной поддерки плавающей точки или низкая частота/разрядность шины (в основном для памяти). Самый лучший был ADSP BlackFin, но теперь хочется поднять частоту ядра до ГГц и выше, обязательно поддержка плавучки хотя бы на уровне Float(одинарная точность), системная шина не ниже уровня PC133.
  6. Здравствуйте! Конфигурация: ADSP Blackfin BF532, код выполняется из SDRAM, кеширование включено. Первичная загрузка - из SPI флешки 8-битной (микросхема AT45DB....), затем переход кода в SDRAM. Нужно сбросить процессор, чтобы снова подгрузилась программа из SPI-флешки. (причем именно чтобы снова повторился цикл загрузки с SPI-флешки, ттак как старый образ программы в L1 может быть уже разрушен - стеком, буферами DMA) Вот так - НЕ работает: Кодwhile(1) __asm__ ("raise 1;"); Спецы, подскажите плиз как сбросить программно?
  7. Цитата(_pv @ Sep 19 2017, 17:21) а в SDRAMе код простите само по себе появляется или его туда кладёт кто-то. почему бы этому кому-то, а то и вообще штатному бутлоадеру небольшую часть кода не положить в L1? несколько МБ исполняемого кода для блэкфина? Это оправдано только лишь в единичном случае. Когда приложений много, и запросы каждого уникальны, то становится очень неразумно возлагать на загрузчик SDRAM дополнительно ещё функцию загрузки части кода в L1. Использую свой загрузчик, который с SD карты считывает несколько секторов и кладёт их в SDRAM и кидает туда управление. Поиск приложения - по специальной сигнатуре в стартовом секторе карты. Оттуда же и размер приложения берется. Единственное условие - файл приложения должен быть нефрагментированным, это легко: достаточно отформатировать карту и записать файлы. Это было давно - в 2009 г. Сейчас же конечно же можно FATFs прикрутить - испытано проверено: http://elm-chan.org/fsw/ff/00index_e.html Только пришлось писать обёртку, так как порядок аргументов, возвращаемые значения и некоторые принципы - отличаются от стандартных C-функций (fopen, fread,...) Речь на этот раз идёт о вот этом девайсике: [attachment=108861:1.jpg] [attachment=108862:2.jpg] Кстати вопрос по L1, есть память для кода в BlackFin-ax. Но ведь её можно как память для данных использовать? Иначе тогда как в неё класть код? Будет ли шуршать DMA из/в этой/эту память/и ?
  8. Цитата(_pv @ Sep 19 2017, 16:30) #pragma section("MY_L1_CODE_SECTION") void Blackfin_reset() ну как-то так, забыл уже. Так это всего-лишь говорит о том, что функция располагается в данной области памяти и не более того. А ответственность за наличие кода в этой области - лежит на программисте. На практике часто приходится делать большие ROM - от сотен килобайт - до несколько мегабайтов. Такие программы исполнять только в SRAM или SDRAM. Кроме того, программы загружаются во внешнюю память самописанным загрузчиком и линковщик максимум что может сделать - это сформировать вызов функции по адресу в регионе MY_L1_CODE_SECTION. А будет ли там код - это на совести программиста. Можно было вообще сделать без этих секций: Кодvoid* FunctionInL1Memory=(void*)MY_L1_CODE_SECTION_Physical_Address и вызывать уже как: КодFunctionInL1Memory(); Но сам код нужно будет размещать в L1 самому - копировать его из SDRAM в L1, и ещё FLUSH-ить кеш данных, чтоб гаранированно легло. И ещё Position Independent, чтоб от адресов не зависел... Я просто не представляю, как линковщик сделает копирование функции из SDRAM в L1, когда бинарный образ кода линкуется для адреса 0x4. - это внешняя память. Цитата(_pv @ Sep 19 2017, 16:30) этот кусок кода не должен находиться во внешней памяти. А вот задача была именно такая - из выполняемого кода в SDRAM, ресетнуть процессор. Решение найдено как писал ранее (WDT)
  9. Цитата(_pv @ Sep 19 2017, 14:59) объясните линкеру чтобы он эту конкретную функцию в внутреннюю память положил. А как он её положет, если сама программа исполняется в SDRAM с адреса 0x00000004 ? Образ программы в LDF-файле задается как ROM, но это для линковщика, на самом деле там всё RAM (ох уж эти линковщики Или речь идёт о том, что линкер сделает стартап, который сделает копию функции из SDRAM в L1 и сформирует вызовы именно из L1 ? (это фантастика =) Цитатаp.s. точку с запятой после while(i--) уберите, она там немного лишняя, а то компилятор может этот цикл выкинуть за ненадобностью. Ну я под этим подразумевал пустой цикл А если запятую убрать, то получится 75 раз NOP-ов )) Ну а на счёт выкинет, есть же volatile) Цитата(_pv @ Sep 19 2017, 15:26) мануалы читать надо, там написано для чего и какая пауза должна быть между записями в SWRST. Если фрагмент кода сброса находится во внешней кешируемой памяти - не поможет. Надо чтоб этот фрагмент гарантировано был закеширован, тогда отключение SDRAM не страшно. Иначе получается - программа рубит сук на котором сидит)
  10. В общем, найдёно изящное решение - сброс по сторожевому таймеру: Кодstatic __inline__ void BlackFin_Reset(void) { *pWDOG_CNT=13200000; //таймаут 0.1 секунды (число тактов шины SCLK, у меня 132 МГц) *pWDOG_CTL=0;        //выбираем RESET и включаем watchdog while(1);                    //зацикливание } Работает надёжно и с любого адреса, ресет такой же как при нажатии на кнопку, загрузчик снова тянет из SPI-флеш самописанную программу-загрузчик-инициализатор в SDRAM. До этого ещё пробовал как здесь: http://electronix.ru/forum/index.php?showtopic=32272 - НЕ помогло. Всё-же RAISE 1 и SWRST - это от лукавого (при выполнения кода из кешируемой области памяти)
  11. Сделал вот так: Кодstatic __inline__ void BlackFin_SoftReset(void) { *pSWRST=0x0007; ssync(); register u32 i=75; while(i--); __asm__ __volatile__ ("NOP;"); *pSWRST=0x0000; ssync(); __asm__ __volatile__ ("RAISE 1;"); } Работает, но не всегда - зависит от расположения данного кода. Подозреваю, что этот фрагмент должен быть в кеше инструкций целиком, тогда успешно. Каким образом можно сделать чтобы данный код был гарантированно в кеше инструкций? (код выполняется из SDRA со включенным write-back кешированием)
  12. Если программно ресет не сделать, то прийдётся выводить на экран сообщение, чтоб пользователь нажал кнопку RESET. А хочется автоматически чтоб....
  13. Да, хотелось бы так как при сбросе нажатием кнопки. Пара ног, которые определяют с какого носителя грузиться всегда в одном состоянии и не меняются. С какого адреса у BF532 начинается загрузчик? Попробую сделать прямой переход туда.
  14. Цитата(jcxz @ Sep 19 2017, 05:17) Перейти на начало загрузчика в ROM? Да. Штатный загрузчик, который по двум ногам определяет, что надо скопировать код с spi-флешки AT45DB... и передать на него управление
  15. Портирую очередную программу написанную на языке C с Win32 (x86) на BlackFin (BF532). При портировании возникла проблема: C-компилятор отказывается компилировать объявление переменных внутри цикла: Кодfor(int i=0;i<10;i++) ..... Стоит сделать так - всё работает. Кодint i; for(i=0;i<10;i++) ..... Понимаю, если по всей программе так штук 10-20... Но проблема как раз в том что в программе таких циклов огромное множество! Да и времена старой давности прошли, когда всё было строго. Есть ли у VDSP C compiler ключ какой-нибудь, чтобы понимать объявления переменных внутри цикла? Я знаю, что тот же Keil ARM C compiler поддерживает ключ -C99, при активации которого можно делать такого рода объявления и не только их! Так как? Способ переименования файлос в CPP не предлагать, нужно скомпилировать именно компилером C, а не C++ Всё, разобрался. Проблема была в том что читал протухший мануал C/C++ Compiler and Library Manual for Blackfin® Processors версии VDSP 4.0. В 5.x уже есть опция -c99 OFFTOP: В OpenWatcom C эта опция так и осталась недокументированной: -za99 и -aa
  16. Здравствуйте. Использую ADSP BF533 + SDRAM + OLED Display (подключен к EBIU 16 бит). Программа загружена в SDRAM, кэширование включено: для данных и программ, политика write back. Дисплей не прокеширован. Периодически нужно отрисовывать кадр на дисплей, как можно быстрее. Видеопамять дисплея - 16 бит на пиксел, адрес автоматически увеличивается на +1 пиксел после отрисовки точки. Есть буфер в котором строистя изображение - источник. Кодировка цветов через палитру. Приемником выступает сам дисплей. Палитру засунул в L1_DATA_B, чтобы ускорить доступ к ней (попиксельно идет обращение). Буфер источника находится в SDRAM (кеширована). За один присест сразу рисую 2 пиксела по 16 бит, по сути формирую 32-битное обращение к памяти дисплея: #define OLED_Data_32 (*(volatile u32*) 0x20010000) Хотя он подключен к 16-битной шине. Фрагмент кода: Код//u8, u16, u32 - char, short и long соответственно 1 2 4 байта UINT16* palette_16bit_lookup=(UINT16*)0xFF900000; //L1_DATA_B 16KB Тут палитра #define SRC_PITCH  544 /* Ширина источника */ #define DST_HEIGHT 224 /* Высота приемника */ #define SCR_WIDTH  320 /* Ширина дисплея */ #define SCR_HEIGHT 240 /* Высота дисплея */ #define OLED_Data_32 (*(volatile u32*) 0x20010000) /* Это регистр данных дисплея с автоинкрементом адреса, подключен к EBIU Blackfin - разрядность 16 бит */ #define PIXEL OLED_Data_32=(palette_16bit_lookup[src[1]]<<16)|palette_16bit_lookup[src[0]];src+=2; /* выводим сразу 2 пиксела(по 16 bit) на дисплей, цвет берем из палитры */ #define PIXELLAST OLED_Data_32=(palette_16bit_lookup[src[1]]<<16)|palette_16bit_lookup[src[0]];src+=(SRC_PITCH-SCR_WIDTH+2); /* последние 2 пиксела */ void Draw_Window(struct BITMAP *bitmap) //Отправка буфера на дисплей { register u16* src=(u16*)(((u32)bitmap->base)+17536+64); //Стартовый адрес источника register u32 y=DST_HEIGHT; OLED_Rectangle(0,(SCR_HEIGHT-DST_HEIGHT)>>1,SCR_WIDTH-1,((SCR_HEIGHT+DST_HEIGHT)>>1)-1); //Задаёт прямоугольную область 320x224 по центру дисплея (сам дисплей 320x240) while(y--) //цикл по Y, цикл по X развернут на 320 точек (160 слов) {   PIXEL /* 159 раз */   PIXEL   PIXEL /* ... */   PIXEL   PIXEL   PIXELLAST /* 160-й раз */ } } Цикл по X развернут макросами для ускорения. Компилировал это дело в Visual DSP++ 5.1.2 - пробовал такую оптимизацию: Speed 100, Interprocedural optimization, Frame-pointer optimization. Код работает как нужно , но подозреваю, что можно сделать быстрее! Дает ли прирост скорости 32-битное обращение к регистру данных дисплея, когда он подключен к 16-битной шине? Фактически это 2 операции подряд по 16 бит с увеличением адреса (не используются). Как можно сделать ещё быстрее? Рассмотрю любые способы: от изменения алгоритма, до системного управления процессором (кеширование, выравнивание). Пробовал изменить тайминги шины EBIU, ничего не меняется. Как можно пере-инициализировать контроллер асинхронной шины, когда он уже работает?
  17. Цитата(jcxz @ Sep 11 2017, 18:49) Скорей всего основную часть процессорного времени занимает звук, а не видео, а значит и оптимизировать нужно в первую очередь звук. Любой участок можно замерить теми же CYCLES, просто вплотную к оптимизации звука ещё не подошел. Кстати, отсутствие мат-сопроцессора в Блекфин меня в свое время очень разочаровало. Есть например приставка SNES, в которой плавучка просто необходима для расчета эффекта полупрозрачности и поворота на произвольный градус. Вот есть STM32 , у них есть мат-сопроцессор, но не более 300 МГц, то не радует. Есть ли камни контроллеров с тактовой от 1 ГГц с FPU и открытой архитектурой? Pi не предлагать, так как закрыта.
  18. Ещё обнаружил интересную ситуацию: Visual DSP 5.1.2 даёт рабочий код, а если собрать в VDSP 5.0, то эмулятор зависает в момент когда должен появиться звук. Если не использовать -fp-fast, то обе среды дают рабочий код. Подозреваю, что в 5.0 -fp-fast выполнен через ОПУ и не гарантирует корректной работы с эмуляцией плавучки ))
  19. На самом деле при включенном кешировании арбитраж шины не слишком сильно душит производительность всей системы в целом. Иначе, почему память видеокарт в ПК отображена на общее адресное пространство процессора? В неё тоже можно писать и читать из нее процессором и ПК не тормозит из-за арбитража шины. Понимаю, что видео-карта сама может ворочать в своей памяти и будет быстрее, но доступ со стороны CPU сохранен. Ну и финальный вопрос: вы можете примерно предположить, во сколько раз должна подняться производительность системы, если дисплей перевешать на PPI?
  20. Цитата(_pv @ Sep 11 2017, 07:44) у этого контроллера даже есть тупо 16ти битный RGB интерфейс, который на ppi вешается без какой-либо дополнительной логики вообще, просто напрямую. В своё время я поостерёгся использовать PPI + RGB-интерфейс дисплея. Показалось, что постоянная отрисовка на дисплей(формирование развертки видео-сигнала) отрицательно скажется на всей работе системы в целом. Не помню чем оттолкнула эта идея, то-ли от того что надо будет выжидать освобождения памяти или ещё чего-то... Давно это было. Вопрос про PPI был в другом: можно ли его настроить на управление контроллером S6E63D6 или тупо видео-сигнал? Хочется чтобы регенерацией экрана занимался именно S6E63D6 , а не ДМА Блекфина через PPI. И шину разгрузить хотелось бы Речь идет об этом девайсике: [attachment=108716:dtp.jpg] Решил "тряхнуть стариной" и портировать ещё несколько эмуляторов на него
  21. Цитата(_pv @ Sep 9 2017, 10:19) 1) https://ez.analog.com/thread/43898 Чуть-помогло (+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; } }
  22. Цитата(_pv @ Sep 9 2017, 10:19) 2) что-то не припомню никаких граблей при одновременном использовании на EBUI sdram и асинхронной шины. Не про то вопрос был. Когда я меняю параметры асинхронного банка (на котором висит дисплей) ПОВТОРНО - новые параметры не вступают в силу! В мануале написано, что не следует менять параметры контроллера шины EBIU именно AMB во время его работы (тоесть когда уже проинициализирован) - мой случай. Тогда как их менять, если по зарез надо? При нажатии на reset ведь как-то работает. Может есть какой-нибудь способ перезагрузить параметры шины? ЦитатаЕсли ваш Blackfin не имеет аппаратной поддержки double (смотреть надо мануал на ядро), то очень тормозной - на порядки медленнее аппаратного. И если можно заменить - следует менять. А если он не имеет аппаратной поддержки и float тоже, то лучше стараться вообще не использовать плавучку. Тем более, что она редко когда реально нужна. Это плохо! Весь код звуковой системы на плавучке. Эмулятор был написан для x86 на языке Cи, при перекладке кода на Blackfin, будет эмуляция FPU.
  23. Попробовал поставить частоту дискретизации 22050 Гц вместо 44100. Скорость всей эмуляции возросла до 75 FPS. Из чего можно сделать вывод, что звуковая система занимает приличный ресурс времени.
  24. Цитатазаглянул сейчас в тот свой код ЧМ-модулятора, пересчитал - он занимал процессорного времени менее 0.5%. И это ещё не самый быстрый алгоритм (считаю синус полиномом), можно гораздо быстрее. Непонятно какие могут быть трудности с каким-то "FM-синтезатором" звуковой частоты ЦитатаНа CPU автора (даже если предположить, что он генерит 3 синусоидальных сигнала и смешивает их потом, а не тупо - 3 меандра biggrin.gif ) даже в случае 3 синусоид и частоты квантования 48кГц, загрузка CPU этим синтезатором должна быть менее 1%. Так и хочется натянуть свой опыт, да? Не выйдёт. Не мешайте говно с мёдом....... Для начала советую поразмыслить над тем, как эмуляция вашего ЧМ-модулятора относится к: 1) Capcom System QSound™ 2) Yamaha YM2151 3) OKI6295 Вы хотя бы один из этих чипов эмулировали ? Более на дебаты теоретиков не реагирую. ------------------ А теперь вопросы: 1) Насколько тормозной тип double для BlackFin ? Имеет ли смысл его заменить float ? 2) Каким образом можно изменить параметры растактовки шины EBIU для асинхронного банка, когда он был инициализирован ранее? Тоесть переинициализировать. После того как EBIU запущен, изменить параметры перезаписью в региcтры: EBIU_AMBCTL0 EBIU_AMBCTL1 EBIU_AMGCTL не получается!
  25. Если критические участки в программе переписывать на Ассемблере (эмуляция процессоров, эмуляция графики / звука), то производительность должна вырасти. Это выходит за рамки моей задачи, так как было нужно портировать эмулятор (автором которого я НЕ являюсь) на устройство с ADSP BF533. В целом результатом доволен, быстродействие вышло таким: 45 - 55 FPS при эмуляции CPS1 30 - 40 FPS при эмуляции CPS2. При этом показывается каждый кадр, звуковой поток не рвётся (темп плавно понижается). Система CPS слишком наворочена, так как графика/звук у неё заточены под игры(быстрые). И не надо сравнивать какой-то допотопный КР580ВМ80 в связке с убогой графикой (Спектрум небось? ) Ну и вдогонку: телефон с процессором 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МГц. Это типа троллинг? Полный перечень того что делается: Цитата// эмуляция процессоров Z80, M68020 // эмуляция видео-подсистемы (4 графических слоя) // эмуляция звуковой системы (FM синтезатор + ADPCM + Wav sound*4 канала) // эмуляция системы ввода // эмуляция памяти //эмуляция ROM-set-а // отрисовка на дисплей // вывод звука // считывание клавиш