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

jcxz

Свой
  • Постов

    13 618
  • Зарегистрирован

  • Посещение

  • Победитель дней

    38

Весь контент jcxz


  1. Необходимо подключить старый SAU510 USB (не ISO) к рабочей плате на L137. Проблема возникла у моего иностранного товарища, он не знает русского и просил меня спросить сюда. У меня новый SAU510 ISO PLUS и с ним эта плата работает нормально. Как я понимаю - с моим .ccs-файлом старый SAU510 работать не будет (и не работает). Я попробовал самостоятельно создать .ccs-файл для старого SAU510, но не знаю - правильно-ли? Старался делать по аналогии с моей конфигурацией. Выкладываю его сюда с просьбой знающим людям (особенно SAURIS GmbH ;) проверить - правильно-ли? sau510.zip Или может кто работает с L137 через такой JTAG и может прислать мне свой .ccs-файл?
  2. Посоветуйте ARM

    По-моему для веб-морды не нужна быстрая память, даже скорее без разницы какая будет. Хоть вообще LPC1778FBD144 + SRAM. А если она ещё и без жирной графики, то для означенной задачи можно вообще внутренними 96K вполне обойтись. Для означенного без графики думаю и 32К внутренней хватило-бы за глаза.
  3. Выдержка из map-файла для _aImgBuffer ? А также - для EXTRARAM ? Запись *(uint8 *)0x2008C000 = x; работает?
  4. Посоветуйте ARM

    Если нет проблем с местом, то какая разница? Вы кста не привели требований по объёму RAM. Или надо именно 512M? В LPC1778 96KB внутренней. Мы сейчас используем LPC1778FBD144 для разрабатываемого изделия - очень нравится ;)
  5. Приведите описание буфера из исходников, а также - размещение этого буфера из map-файла. Пока же видно, что в USB_RAM_region у вас помещается только секция EXTRARAM. Секция USB_RAM у вас помещается в EXT_RAM_region. В какую секцию вы компилите буфер?
  6. Да - нужен или монитор питания (с прерыванием по пропаданию) или в два раза больше non-volatile памяти для дублирования.
  7. А интересно - как вы обеспечиваете безопасность модификации этих регистров если они у вас модифицируются в порядке чтение-модификация-запись и отключение питания прервёт эту последовательность? Или это у вас просто набор незавимисмых друг от друга флагов?
  8. Если вы имеете в виду DMA c автоинициализацией, то пинг-понг - это она и есть. Да и наверно передача связанных списков есть - из неё тоже можно сделать передачу с автоинициализацией. В одном блоке ставите указатель на второй блок, во-втором - на первый. Либо более сложную конструкцию из кольцевой цепочки блоков. EFM - это который Energy Micro? Мы подумывали его использовать. Но потом всё же решили остаться на привычном LPC. AES сделаем программный.
  9. Вероятно - Вы правы. Мне так и не удалось получить 2 такта на цикл, хотя повторил, то что писал SAURIS GmbH - всё равно 3 такта. Хотя и не очень нужно - у меня по алгоритму в этой функции трудно сделать x%8==0. Зато y%8==0 - выполнимо. Только использовал _amem8(). А можно-ли прикрутить CGT 7.3.х вместо CGT 6.1.x к CCS3.3? На сайте TI для CCS3.3 имеется только CGT 6.1.x.
  10. То что Вы написали - это определение региона, а не использование. Размещение секций кода-данных производится директивами "place ...". Что-то у вас напутано. Вы же сами пишете: define symbol __ICFEDIT_region_ROM0_start__ = 0x00080000; define symbol __ICFEDIT_region_ROM0_end__ = 0x0009FFFF; define symbol __ICFEDIT_region_ROM1_start__ = 0x00100000; define symbol __ICFEDIT_region_ROM1_end__ = 0x0011FFFF; т.е. - у вас должно быть два региона по 128k.
  11. Судя по *.icf вы первый регион флеш вообще не используете (только вектора прерываний туда разместили). Допишите строку: place in ROM1_region {ro, first section .intvec}; А строку: place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; вообще удалите.
  12. просто _sshl() убрал. Вот: #pragma CODE_SECTION(".text:optimized") #pragma FUNC_INTERRUPT_THRESHOLD(-1) void DSPF_fltoq31(const float* restrict x, int * restrict y, int n) { int fadcr_store; float t00, t01, t02, t03, t10, t11, t12, t13; _nassert(n > 0); _nassert(n % 4 == 0); fadcr_store = FADCR; //preserve the FADCR value FADCR = _set(FADCR, 9, 10); //set FADCR bits to switch to ROUND TOWARD NEGATIVE INF FADCR = _set(FADCR, 25, 26); //set mode for both L units #pragma MUST_ITERATE(1, , ) while ((n -= 4) >= 0) { t00 = x[n + 0]; t01 = x[n + 1]; t02 = x[n + 2]; t03 = x[n + 3]; t10 = t00 * 0x80000000; //multiply by 2^23 for converting to Q23 format (this brings the number in the range -0x800000 to 0x800000) t11 = t01 * 0x80000000; t12 = t02 * 0x80000000; t13 = t03 * 0x80000000; *y++ = _spint(t13); //use intrinsic to convert the number to integer *y++ = _spint(t12); *y++ = _spint(t11); *y++ = _spint(t10); } FADCR = fadcr_store; //restore the FADCR value }
  13. Почти всё выполнил, но цикл остался таким-же - 4 такта. .compiler_opts --c64p_l1d_workaround=off --endian=little --hll_source=on --mem_model:code=near --mem_model:const=data --mem_model:data=far_aggregates --silicon_version=6740 --symdebug:none ;* GLOBAL FILE PARAMETERS * ;* Architecture : TMS320C674x * ;* Optimization : Enabled at level 3 * ;* Optimizing for : Speed * ;* Based on options: -o3, no -ms * ;* Endian : Little * ;* Interrupt Thrshld : 3000 * ;* Data Access Model : Far Aggregate Data * ;* Pipelining : Enabled * ;* Speculate Loads : Enabled * ;* Memory Aliases : Presume not aliases (optimistic) * ;* Debug Info : No Debug Info * $C$L3: ; PIPED LOOP PROLOG ; EXCLUSIVE CPU CYCLES: 13 SPLOOPD 4 ;16 ; (P) || MVC .S2X A4,ILC ;** --------------------------------------------------------------------------* $C$L4: ; PIPED LOOP KERNEL ; EXCLUSIVE CPU CYCLES: 4 SPMASK L2 || ADD .L2X 8,A3,B5 || LDNDW .D1T1 *A3--(16),A9:A8 ; |124| (P) <0,0> LDNDW .D2T2 *B5--(16),B9:B8 ; |122| (P) <0,1> NOP 3 MPYSP .M1 A7,A8,A4 ; |124| (P) <0,5> MPYSP .M2X A7,B8,B6 ; |122| (P) <0,6> || MPYSP .M1 A7,A9,A8 ; |124| (P) <0,6> MPYSP .M2X A7,B9,B8 ; |122| (P) <0,7> NOP 1 SPINT .L1 A4,A5 ; |124| (P) <0,9> SPINT .L2 B6,B7 ; |122| (P) <0,10> || SPINT .L1 A8,A4 ; |124| (P) <0,10> SPMASK L1,S2 || MV .S2 B10,B4 || ADD .L1X 8,B10,A6 || SPINT .L2 B8,B6 ; |122| (P) <0,11> NOP 2 STNDW .D1T1 A5:A4,*A6++(16) ; |124| <0,14> SPKERNEL 3,0 || STNDW .D2T2 B7:B6,*B4++(16) ; |122| <0,15> Вот какие опции в свойствах проекта: -pdsw225 -al -o3 -fg -fr"$(Proj_dir)\RELEASE.OUT" -fs"$(Proj_dir)\RELEASE.OUT" -ft"$(Proj_dir)\RELEASE.OUT" -i"$(Proj_dir)" -i"$(Proj_dir)\.." -i"$(Proj_dir)\lib_dsp_math" -i"$(Proj_dir)\processing_framework" -mt -mw -mh -mi3000 -mf5 -mv6740 --mem_model:const=data --single_inline --symdebug:none У меня и была Release. Помогла ручная вставка опции "--symdebug:none" (спасибо AndrewN). но результат остался тот же :(( Единственное существенное отличие (не считая COFF) от ваших опций - мне не удалось найти где включить "--long_precision_bits=40", при ручной вставке компилёр ругается: WARNING: invalid compiler option --long_precision_bits=40 (ignored) Измеритель оттестирован на таймере - всё сошлось до 1% - так что вряд-ли. Возможно повлияло что цикл стал короче и грузиться в конвеер стал быстрее. Возможно вся причина что у меня 4 такта, а у вас ==2 в этом: ??? У меня: v6.1.21
  14. Да уж, это точно. Какое-то время работал под CCS4.2.4 с F28M35H52 так даже была такая ситуация, что компилирую, заливаю, дальше смотрю область памяти с только что залитой прошивки и она НЕ СОВПАДАЕТ с содержимым залитого файла! Т.е. - в файле есть константный массив (в секции .const), а в памяти (сразу после заливки до старта) на этом месте 0xFF. Это случалось только если этот массив линковщик компоновал самым последним в загрузочный образ, если немного изменить проект и этот массив оказывался не последним - всё было ок. Даже отправлял это в техподдержку TI. там посоветовали перейти на CCS5 ;) А уж что там переменные не отображаются в окнах при отладке либо показывают чушь - я уже даже и внимания не обращал ;) После такого я понял, что с CCS4 пора завязывать и вернулся на CCS3.3.
  15. Пожалуйста: ;* GLOBAL FILE PARAMETERS * ;* * ;* Architecture : TMS320C674x * ;* Optimization : Enabled at level 3 * ;* Optimizing for : Speed * ;* Based on options: -o3, no -ms * ;* Endian : Little * ;* Interrupt Thrshld : 3000 * ;* Data Access Model : Far Aggregate Data * ;* Pipelining : Enabled * ;* Speculate Loads : Disabled * ;* Memory Aliases : Presume are aliases (pessimistic) * ;* Debug Info : DWARF Debug for Program Analysis w/Optimization * Не знаю как у вас получилось "No Debug Info", у меня в свойствах проекта отключена debug info везде где можно (и в опциях компилятора и линкёра). Похоже - не совсем так. Я, как Вы советовали, убрал сдвиги из цикла, в результате - кол-во команд в теле цикла значительно уменьшилось, и загрузка процессора заметно уменьшилась. Но заголовок цикла остался тем-же: "SPLOOPD 4 ;16" см. результаты замеров ниже. Я пробовал ставить его ==64 - тело цикла не меняется ни на команду. Вот тело цикла с _sshl(): SPLOOPD 4 ;16 ; (P) || SUB .L1 A3,8,A16 || SUB .D1 A3,16,A3 || MVC .S2X A4,ILC ;** ------------------------------------------------------------ $C$L4: ; PIPED LOOP KERNEL $C$DW$L$_DSPF_fltoq31__FPCfPii$7$B: LDW .D1T1 *A3--(16),A7; |121| (P) <0,0> || LDW .D2T2 *B6--(16),B16; |122| (P) <0,0> LDW .D1T1 *A16--(16),A8; |123| (P) <0,1> || LDW .D2T2 *B9--(16),B8; |125| (P) <0,1> NOP 3 MPYSP .M1 A17,A7,A6; |121| (P) <0,5> || MPYSP .M2X A17,B16,B8 ; |122| (P) <0,5> MPYSP .M1 A17,A8,A6; |123| (P) <0,6> || MPYSP .M2X A17,B8,B5; |125| (P) <0,6> SPMASK D2 || SUB .D2 B10,16,B10 SPMASK L2,S2 || MV .L2 B10,B4 || MV .S2 B10,B7 SPMASK S1 || MV .S1X B10,A5 || SPINT .L1 A6,A8 ; |121| (P) <0,9> || SPINT .L2 B8,B5 ; |122| (P) <0,9> SPMASK S1,D1,S2 || ADDK .S2 24,B7 || MV .D1X B10,A4 || ADDK .S1 28,A5 || SPINT .L1 A6,A9 ; |123| (P) <0,10> || SPINT .L2 B5,B17 ; |125| (P) <0,10> SPMASK S1,S2 || ADDK .S2 16,B4 || ADDK .S1 20,A4 NOP 1 SSHL .S2 B5,8,B16 ; |127| <0,13> || SSHL .S1 A8,8,A7 ; |128| <0,13> STW .D2T2 B16,*B7++(16); |127| <0,14> || STW .D1T1 A7,*A5++(16); |128| <0,14> || SSHL .S1 A9,8,A6 ; |126| <0,14> || SSHL .S2 B17,8,B5 ; |125| <0,14> .dwpsn file "DSPF_fltoq31.c",line 129,column 0,is_stmt SPKERNEL 3,0 || STW .D1T1 A6,*A4++(16); |126| <0,15> || STW .D2T2 B5,*B4++(16); |125| <0,15> Вот - без _sshl(): SPLOOPD 4 ;16 ; (P) || MVC .S2X A4,ILC ;** ----------------------------------------------------------- $C$L4: ; PIPED LOOP KERNEL $C$DW$L$_DSPF_fltoq31__FPCfPii$7$B: SPMASK L2 || ADD .L2X 8,A3,B5 || LDNDW .D1T1 *A3--(16),A9:A8; |124| (P) <0,0> LDNDW .D2T2 *B5--(16),B9:B8; |122| (P) <0,1> NOP 3 MPYSP .M1 A7,A8,A4 ; |124| (P) <0,5> MPYSP .M2X A7,B8,B6 ; |122| (P) <0,6> || MPYSP .M1 A7,A9,A8 ; |124| (P) <0,6> MPYSP .M2X A7,B9,B8 ; |122| (P) <0,7> NOP 1 SPINT .L1 A4,A5 ; |124| (P) <0,9> SPINT .L2 B6,B7 ; |122| (P) <0,10> || SPINT .L1 A8,A4 ; |124| (P) <0,10> SPMASK L1,S2 || MV .S2 B10,B4 || ADD .L1X 8,B10,A6 || SPINT .L2 B8,B6 ; |122| (P) <0,11> NOP 2 STNDW .D1T1 A5:A4,*A6++(16); |124| <0,14> .dwpsn file "DSPF_fltoq31.c",line 125,column 0,is_stmt SPKERNEL 3,0 || STNDW .D2T2 B7:B6,*B4++(16); |122| <0,15> Загрузка процессора (на этой функции) уменьшилась на 40% !!! Т.е. - в первом варианте полная загрузка процессора задачей составляла == 8.8% Во-втором варианте полная загрузка процессора задачей == 8.2% При закомментировании этой функции (выполняется только остальная обработка) == 7.3% Хотя - если посчитать по командам - оба варианта должны быть одинаковы.... Код функции и вх. данные линкуются во внутреннюю L2-память, выходные данные - во внутренней L3-памяти.
  16. Даже с этими сдвигами должно быть гораздо оптимальнее чем компилится. Не в них главная проблема. Сейчас пришёл и посмотрел в проект - вообще-то у меня изначально стояло -mv6740, и то что я приводил вначале - это с помощью него и скомпилено. Так что - мимо кассы. :laughing: Лучше покажите как вы этого добились "8 iterations in parallel"? У меня "ii = 4 Schedule found with 4 iterations in parallel" и длина цикла ==16тактов. Именно с -mv6740 2 LDDW и 2 STDW - я пока и не мечтаю. Если-б компилятор хотя-бы эти NOP-ы убрал....... В другой функции у меня получаются 2 LDDW в параллель, но после них стоит NOP 4, который убивает всю пользу от этих LDDW :( PS: Сейчас попробовал разные ключики: -mv6700, -mv6710, -mv6740, -mv67p - при всех кроме -mv6740 получается цикл в 4 такта, и только при -mv6740 дыра какая-то.... :01: Причём нигде кроме -mv6740 не используется SPLOOP
  17. Вечером попробую -mv6740 - но что-то не помню такой опции в компилёре.... Учту. Я сомневался, что SPINT отрабатывает насыщение, поэтому и поставил сдвиг
  18. Заинтересовала 2-я задача. ТЗ на код хотя-бы в общих чертах? И сколько платите и срок? PS: В настоящее время работаю с платой на OMAP-L137.
  19. Во! Скомпилил как у вас для C67+ и сразу получил 4 такта внутри kernel loop (у вас 2 такта как я понимаю) - очень похоже на Ваш результат. Вернул обратно на C674x - всё вернулось к старому моему результату - похоже не даёт оптимизить тип процессора :crying: Все отладки у меня выключены. Вот что получается: ;*----------------------------------------------------------------------------* ;* SOFTWARE PIPELINE INFORMATION ;* ;* Loop found in file : DSPF_fltoq31.c ;* Loop source line : 112 ;* Loop opening brace source line : 112 ;* Loop closing brace source line : 129 ;* Known Minimum Trip Count : 1 ;* Known Max Trip Count Factor : 1 ;* Loop Carried Dependency Bound(^) : 0 ;* Unpartitioned Resource Bound : 2 ;* Partitioned Resource Bound(*) : 4 ;* Resource Partition: ;* A-side B-side ;* .L units 2 2 ;* .S units 2 2 ;* .D units 2 2 ;* .M units 2 2 ;* .X cross paths 0 2 ;* .T address paths 4* 4* ;* Long read paths 0 0 ;* Long write paths 0 0 ;* Logical ops (.LS) 0 0 (.L or .S unit) ;* Addition ops (.LSD) 0 0 (.L or .S or .D unit) ;* Bound(.L .S .LS) 2 2 ;* Bound(.L .S .D .LS .LSD) 2 2 ;* ;* Searching for software pipeline schedule at ... ;* ii = 4 Schedule found with 5 iterations in parallel ;* Done ;* ;* Loop will be splooped ;* Collapsed epilog stages : 0 ;* Collapsed prolog stages : 0 ;* Minimum required memory pad : 0 bytes ;* ;* Minimum safe trip count : 1 ;*----------------------------------------------------------------------------* Ключик этот у меня включён и Partitioned Resource Bound почти ка у вас == 4, а толку нет :(
  20. Похоже дело было не в затирании памяти. Сейчас ещё проверил - все работает. Наверно висло не из-за этого, а когда я заглянул в листинг - мне показалось странным такое поведение указателя 'y'. Спасибо SAURIS GmbH разъяснил про SPMASK :rolleyes: Кстати эту функцию я получил из такой: void DSPF_fltoq31(const float* restrict x, int * restrict y, int n) { int fadcr_store; _nassert(n > 0); _nassert(n % 2 == 0); fadcr_store = FADCR; //preserve the FADCR value FADCR = _set(FADCR, 9, 10); //set FADCR bits to switch to ROUND TOWARD NEGATIVE INF FADCR = _set(FADCR, 25, 26); //set mode for both L units #pragma MUST_ITERATE(1, , ) for (x += n - 1; --n >= 0; ) *y++ = _sshl(_spint(*x-- * 0x800000), 8); FADCR = fadcr_store; //restore the FADCR value } Ожидал, что если сделать групповую обработку по 4 сэмпла, это должно ускорить. По листингу вижу, что вроде тактов стало меньше, но почему-то по измерениям загрузка процессора как была 8.8% так и осталась Кстати - попробовал interrupt threshold в опциях проекта (==3000) и вообще попробовал перед функцией поставить: #pragma FUNC_INTERRUPT_THRESHOLD(-1); запретив прерывания на время выполнения функции - на генерируемый компилятором листинг это не оказывает никакого влияния. Похоже всё-таки придётся изучать асм для этого процессора. Насколько я понимаю глядя на получающийся после оптимизатора код - он очень неэффективный, столько NOP-ов... Вот это забавная штука... Да уж - в 5502 всё было по другому - наставил-бы stall-ов кроме того, что в первой команде был-бы конфликт ресурсов. Значит здесь неучёт времени выполнения (или фазы выполнения?) команд ведёт к неверной работе кода, в то время как в 5502 это вело-бы просто к лишним stall-ам.
  21. Вон оно что... Про SPMASK не читал... я собсно не знаю асма для этого ядра, так - навскидку смотрю листинг B) Здесь асм что-то сложный похоже... в C5502 был гораздо проще - там я всё целиком на нём писал ;) Надо прочитать про SPMASK. Обработчики прерывания здесь в этом ядре не сохраняют состояние аппаратных циклов и на время вызова функций DSPLIB надо запрещать прерывания? Интересно - а как тогда весь остальной код работает? Написал большой объём кода на это ядро (без использования DSPLIB и restrict) и всё прекрасно работало с множеством прерываний. С оптимизацией.
  22. С декрементированием. Посмотрите внимательнее на указанные строки листинга. Точно хочу - в буфере входных данных данные расположены в обратном порядке, а функции DSPLIB (для которых готовит данные указанная функция) требуют прямого порядка.
  23. Имеем CC3.3 + C6000 Code Generation Tools v6.1.21. Компилим с таргет = -mv6740. Функция: void DSPF_fltoq31(const float* restrict x, int * restrict y, int n) { int i0, i1, fadcr_store; float t00, t01, t10, t11; _nassert(n > 0); _nassert(n % 2 == 0); fadcr_store = FADCR; //preserve the FADCR value FADCR = _set(FADCR, 9, 10); //set FADCR bits to switch to ROUND TOWARD NEGATIVE INF FADCR = _set(FADCR, 25, 26); //set mode for both L units #pragma MUST_ITERATE(1, , ) for (; (n -= 2) >= 0; ) { t00 = x[n]; t01 = x[n + 1]; t10 = t00 * 0x800000; //multiply by 2^23 for converting to Q23 format (this brings the number in the range -0x800000 to 0x800000) t11 = t01 * 0x800000; //multiply by 2^23 for converting to Q23 format (this brings the number in the range -0x800000 to 0x800000) i0 = _spint(t10); //use intrinsic to convert the number to integer i1 = _spint(t11); //use intrinsic to convert the number to integer *y++ = _sshl(i1, 8); //saturate the number if required *y++ = _sshl(i0, 8); //saturate the number if required } FADCR = fadcr_store; //restore the FADCR value } Как видно - результат выполнения пишется в 'y' с инкрементированием. Но после компиляции смотрим в листинг и видим, что компилятор построил цикл с декрементированием 'y' !!! :crying: (обратите внимание на строки: 263, 268, 269, 277, 278) ... 241 00000090 0ce6 SPLOOP 2 ;16 ; (P) 242 00000092 9de1 || SUB .L2X A3,4,B6 243 00000094 018f0058 || SUB .L1 A3,8,A3 244 245 ;** --------------------------------------------------------------------------* 246 00000098 $C$L4: ; PIPED LOOP KERNEL 247 00000098 $C$DW$L$_DSPF_fltoq31__FPCfPii$8$B: 248 249 00000098 030c5465 LDW .D1T1 *A3--(8),A6 ; |116| (P) <0,0> 250 000000a0 041854e6 || LDW .D2T2 *B6--(8),B8 ; |118| (P) <0,0> 251 252 000000a4 00008000 NOP 5 253 254 000000a8 02990e01 MPYSP .M1 A8,A6,A5 ; |116| (P) <0,6> 255 000000ac 03a11e02 || MPYSP .M2X A8,B8,B7 ; |118| (P) <0,6> 256 257 000000b0 00004000 NOP 3 258 259 000000b4 03940159 SPINT .L1 A5,A7 ; |116| (P) <0,10> 260 000000b8 029c015a || SPINT .L2 B7,B5 ; |118| (P) <0,10> 261 262 000000bc 000b0001 SPMASK L2 263 000000c0 052b005a || SUB .L2 B10,8,B10 264 265 000000c4 0c6e NOP 1 266 267 000000c6 2f66 SPMASK S1,S2 268 000000c8 022901a3 || ADD .S2 8,B10,B4 269 000000cc 022991a0 || ADD .S1X 12,B10,A4 270 271 000000d0 029d08a1 SSHL .S1 A7,8,A5 ; |119| <0,14> 272 000000d4 0ec3 || SSHL .S2 B5,8,B5 ; |118| <0,14> 273 274 .dwpsn file "DSPF_fltoq31.c",line 120,column 0,is_stmt 275 276 000000d6 dc67 SPKERNEL 7,0 277 000000d8 2c54 || STW .D1T1 A5,*A4++(8) ; |119| <0,15> 278 000000da 3c55 || STW .D2T2 B5,*B4++(8) ; |118| <0,15> ... Естественно, что функция не работает - затирает чужую память. Если убрать модификатор 'restrict' для 'x' и 'y' всё начинает работать, но скорость совсем не та - не строится аппаратного цикла SPLOOP насколько я понимаю. Если делать обработку за один проход по одному сэмплу (одна операция *y++) - тоже всё нормально компилится и 'y' в листинге инкрементируется. Кто-нить сталкивался? Или я чего-то недогоняю? Или в CodeTools v6.1.21 'restrict' кривой и, чтобы писать быструю обработку, придётся изучать асм C674x???
  24. Опять ни байта о характеристиках изображения (разрешение, цветность и т.п.) и какая скорость загрузки картинок требуется.... Можно добавить на каждый монитор кнопку типа "Показать всем", по которой ваша картинка показывается на всех других мониторах и кнопку "выключить изображение" для скрытия. Это упростит механику - не нужна будет поворотность экранов.
×
×
  • Создать...