repstosw 18 22 сентября, 2023 Опубликовано 22 сентября, 2023 · Жалоба 4 hours ago, sasamy said: кеширование чего - кода или данных ? И того и другого. 4 hours ago, sasamy said: диапазон MMIO периферии не кешируется Очевидные вещи говорите. Факт есть факт. И он установлен. Причина: процессор при включенном кеше кода бежит быстрее, и выход из прерывания происходит раньше, чем регистр успевает обновиться. Известная проблема. Я лишь акцентировал внимание на то, как это можно избежать. Три варианта: 1. отключить кеш (самый плохой вариант) 2. прочитать регистр после его записи (кросс-портабельный вариант) 3. вставить инструкцию memw (самый лучший вариант для DSP, но платформенно-зависимый) 4 hours ago, sasamy said: я пока кроме экспериментов не касался прерываний от периферии, доделал загрузку кода в DSP из Linux на ARM Линукс, RTOS и другие ОС, не покажут вам спорадические прерывания. Слишком многое остаётся скрыто "за капотом" ))) Вот за это мне и нравится BareMetal: особенности архитектуры чувствуешь на себе )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 23 сентября, 2023 Опубликовано 23 сентября, 2023 (изменено) · Жалоба Собрал в Линуксе тулчейн для Винды под ABI-call0. Так называемая "канадская" кросс-компиляция 🙂 Теперь можно забыть о головной боли, связанной с регистровыми окнами, контроле/подмене стека, исключениях. В ABI=call0 эти исключения не нужны: Window owerflow/underflow, Alloca, Syscall. Вся работа с регистрами процессора прозрачна и в стиле "обычных" архитектур. А также доступны манипуляции с указателем стека для резервирования временных данных(стековые фреймы). Простейший рабочий стартап выглядит так: .section .entry.text,"x" .align 4 .global Start Start: j BypassLiteral .section .literal,"a" .global Literal Literal: //Literals located here .text .align 4 .global BypassLiteral BypassLiteral: movi a0,0 //disable all interrupts wsr.intenable a0 movi a0,VECTORS //vector table base address wsr.vecbase a0 movi a0,0 //PS.WOE = 0, PS.UM = 0, PS.EXCM = 0, PS.INTLEVEL = 0 wsr.ps a0 rsync /* Xtensa® Instruction Set Architecture (ISA) Reference Manual 8.1.9 Stack Initialization. p. 618 */ movi a0,0 movi sp,__stack-16 addi a4,sp,32 //point 16 past extra save area s32e a4,sp,-12 //access to extra save area call0 libc_init call0 board_init call0 main Пример как выглядит обработчик прерывания: //... .org 0x1FC //Kernel (IntLevel1) Vector j Kernel //... .align 4 Kernel: addi sp,sp,-64 s32i a0,sp,0 s32i a2,sp,4 s32i a3,sp,8 s32i a4,sp,12 s32i a5,sp,16 s32i a6,sp,20 s32i a7,sp,24 s32i a8,sp,28 s32i a9,sp,32 s32i a10,sp,36 s32i a11,sp,40 s32i a12,sp,44 s32i a13,sp,48 s32i a14,sp,52 s32i a15,sp,56 movi a2,PS_INTLEVEL(1) //mask interrupts to prevent stack corrupt in C/C++ calls wsr.ps a2 rsync call0 INTC_Handler l32i a15,sp,56 l32i a14,sp,52 l32i a13,sp,48 l32i a12,sp,44 l32i a11,sp,40 l32i a10,sp,36 l32i a9,sp,32 l32i a8,sp,28 l32i a7,sp,24 l32i a6,sp,20 l32i a5,sp,16 l32i a4,sp,12 l32i a3,sp,8 l32i a2,sp,4 l32i a0,sp,0 addi sp,sp,64 rfi 1 Дополнительно собрал libhal(включение кеширования для DSP) под ABI-call0 из исходников. Скачать GCC-тулчейн и исходники либы libhal (вместе с готовой либой) под ABI=call0 для T113-s3 HiFi4 DSP. Изменено 23 сентября, 2023 пользователем repstosw 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 23 сентября, 2023 Опубликовано 23 сентября, 2023 · Жалоба On 9/23/2023 at 1:43 AM, repstosw said: Очевидные вещи говорите. для меня не очевидно - я не вижу что вы кешируете, поэтому и спросил - вдруг мне тоже потом надо барьер памяти делать On 9/23/2023 at 1:43 AM, repstosw said: Линукс, RTOS и другие ОС, не покажут вам спорадические прерывания. Слишком многое остаётся скрыто "за капотом" ))) Вот за это мне и нравится BareMetal: особенности архитектуры чувствуешь на себе )) надеюсь в порте freertos мне не надо чувствовать модель памяти на себе :) пока занимаюсь драйвером msgbox для Linux. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 23 сентября, 2023 Опубликовано 23 сентября, 2023 · Жалоба 6 часов назад, repstosw сказал: Дополнительно собрал libhal(включение кеширования для DSP) под ABI-call0 из исходников. Удалось ли повысить быстродействие теста вышеприведенного DSP? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 23 сентября, 2023 Опубликовано 23 сентября, 2023 (изменено) · Жалоба On 9/23/2023 at 11:55 AM, mantech said: Удалось ли повысить быстродействие теста вышеприведенного DSP? call0 наоборот медленней оконного ABI Quote The CALL0 ABI can be used with any Xtensa processor. It does not make use of register windows, so it typically has slightly worse performance and code size than the win- dowed register ABI. чтобы повысить быстродействие надо расширения ISA использовать, сомневаюсь что они есть в GCC, не зря же cadance свои оптимизирующие компиляторы делают. Изменено 23 сентября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 23 сентября, 2023 Опубликовано 23 сентября, 2023 (изменено) · Жалоба 36 minutes ago, mantech said: Удалось ли повысить быстродействие теста вышеприведенного DSP? Нет. С ABI-call0 она осталась прежней. Собственно, я и не надеялся увеличить скорость через ABI. Для ускорения того бенчмарка нужно распараллеливание на VLIW. И то - у меня есть сомнения: что тот код в исходном виде будет работать быстрее - его придётся переписать под архитектуру ДСП. У C6745 с которым я возился несколько лет назад, там от силы 2-3 распараллеливания из доступных 8 получалось. И там довольно хороший оптимизатор - иногда по пол-часа компилируется... На обычном сишном алгоритме. VLIW - это ещё не так просто. Не каждый алгоритм поддастся распарралеливанию. Так что VLIW - не более чем коммерческий ход. Так что тему пора переименовать в "Allwinner T113-s3 уделал HiFi4 DSP, смеяться или плакать?" 26 minutes ago, sasamy said: чтобы повысить быстродействие надо расширения ISA использовать, сомневаюсь что они есть в GCC, не зря же они свой оптимизирующий компилятор делают. C Cadense Xtensa Tools всё гибло: требуют лицензию. И постоянно включенный комп с их сервером, который пасёт лицензию. Крякнутых версий не нашёл. Так что придётся довольствоваться General Purpose выхлопом от GCC без VLIW и SIMD. Хотя, вполне допускаю, что какой-нибудь местный хакер сможет в коде программ с command-line Inteface найти место где проверяется лицензия и заменить опкод перехода. Тот кто дружит с трассировкой и дебагингом могут это сделать. Если конечно в Cadence защиту от трассировки не сделали А что за оптимизирующий компилятор? Где его можно скачать чтоб опробовать? Изменено 23 сентября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 23 сентября, 2023 Опубликовано 23 сентября, 2023 · Жалоба 5 минут назад, repstosw сказал: А что за оптимизирующий компилятор? Где его можно скачать чтоб опробовать? У меня большое подозрение, что на этом процессоре придется делать оптимизацию "руками", путем написания асмовых программ((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 23 сентября, 2023 Опубликовано 23 сентября, 2023 (изменено) · Жалоба Есть ещё Sigma Studio от Analog Devices. Там есть поддержка ADAU1472 - это ДСП от АД с HiFi4 ядром. Но это не для программистов. Скорее для музакеров и производителей акустических систем. Типа визарда - накидать через GUI акустический конвеер (фильтры, ресемплеры, дисторшены, эхо, итп..). Сильно узкоспецифичен. Плагин на каждый чип там в виде DLL. Наверное проприетарный формат. DSP от T113-s3 туда не воткнёшь. Но можно выдирать бинарник (код) для ДСП через линуксовый парсер или ручками из *.dspproj. 14 minutes ago, mantech said: У меня большое подозрение, что на этом процессоре придется делать оптимизацию "руками", путем написания асмовых программ((( Чего мелочиться - сразу в машинных кодах писать фрагменты с VLIW/SIMD Документация на опкоды есть. Возможно оформить в виде макросов и вызывать их. Изменено 23 сентября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 23 сентября, 2023 Опубликовано 23 сентября, 2023 (изменено) · Жалоба Обнаружил ещё одну особенность DSP. Если кеширование включено и используются IRAM, DRAM0,1 (собственная память DSP), то в дескрипторы DMA должны записываться адреса с обнулённым битом кеширования: address_dma = address&(~0x20000000) При этом DSP может писать в кешированные регионы, не забывая делать сброс с кеша в память: #define CACHE_MASK (~0x20000000) void DMA_DAC_Init(u32 dst,u32 src,u32 bc) { DMA_Clock(); DMA_IRQ_EN_REG1|=(3<<((DMA_DAC_CHANNEL-8)*4)); //DMA 8..15 Interrupts Enable: Half & Full DMA_IRQ_PEND_REG1|=(7<<((DMA_DAC_CHANNEL-8)*4)); //Reset DMA 8..15 INT static u32 DMA_DAC_Descriptor[6]; // dw=16 dm=IO db=8 dd=AC sw=16 sm=Lin sb=8 sd=DDR DMA_DAC_Descriptor[0]=(1<<25)|(1<<24)|(2<<22)|(7<<16)|(1<<9)|(0<<8)|(2<<6)|(1<<0); //DMA Configuration DMA_DAC_Descriptor[1]=src&CACHE_MASK; //DMA Source Address DMA_DAC_Descriptor[2]=dst; //DMA Destination Address DMA_DAC_Descriptor[3]=bc; //DMA Byte Counter DMA_DAC_Descriptor[4]=0; //DMA Parameter (Wait Clock Cycles=0) DMA_DAC_Descriptor[5]=((u32)DMA_DAC_Descriptor)&CACHE_MASK; //DMA Link xthal_dcache_all_writeback(); DMA_DESC_ADDR_REG(DMA_DAC_CHANNEL)=((u32)DMA_DAC_Descriptor)&CACHE_MASK; //DMA Descriptor Address while(DMA_DESC_ADDR_REG(DMA_DAC_CHANNEL)!=(((u32)DMA_DAC_Descriptor)&CACHE_MASK)); } Здесь у src и адреса DMA_DAC_Descriptor сбрасывается старший бит кеширования. При CPU ведёт запись кешированные адреса, после чего вызывается xthal_dcache_all_writeback() (функция библиотеки libhal.a). dst- это регистр DAC (AC_DAC_TXDATA), поэтому он остаётся без изменения: DMA_DAC_Init((u32)&AC_DAC_TXDATA,(u32)DACBuffer,SAMPLE*2*sizeof(s16)); Если же код и данные находятся в DDR, то для DMA пофигу какие адреса: 0x40000000(не кеширован) или 0xC0000000(кеширован). Скорее всего это связано с тем, что DSP и DMA по-разному трактуют адреса памяти, лежащие в диапазоне 0x00000000 .. 0x1FFFFFFF Изменено 23 сентября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 23 сентября, 2023 Опубликовано 23 сентября, 2023 · Жалоба On 9/23/2023 at 12:12 PM, repstosw said: А что за оптимизирующий компилятор? Где его можно скачать чтоб опробовать? где-то там же где и Tensilica Software Development Toolkit GCC-based compiler: xt-xcc and its friends. Clang-based compiler: xt-clang and its friends. https://docs.zephyrproject.org/latest/develop/toolchains/cadence_xcc.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 23 сентября, 2023 Опубликовано 23 сентября, 2023 (изменено) · Жалоба 6 hours ago, repstosw said: не для программистов. Скорее для музакеров и производителей акустических систем. Типа визарда - накидать через GUI акустический конвеер (фильтры, ресемплеры, дисторшены, эхо, итп..). Сильно узкоспецифичен. Я знаю один радиоприемник- белка dsp - сделанный на базе Adau. И ещё один коллега пытается применить в радиостанции. Обработка квадратурных каналов, фильтры, ару... https://www.google.com/amp/s/habr.com/ru/amp/publications/708178/ Изменено 23 сентября, 2023 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 23 сентября, 2023 Опубликовано 23 сентября, 2023 (изменено) · Жалоба Портанул эмулятор OPL3 и сделал плеер ДОС-треков для HiFi4 DSP. Выводит звук через встроенный аудиокодек: Starport.zip Более ей ничего не нужно. Трек слинкован вместе с программой. Адрес загрузки программы со стороны T113-s3: 0x00028000 Стартовый адрес для HiFi4 DSP: 0x20028000 (кешированный регион!) - содержимое регистра DSP_ALT_RESET_VEC_REG Программа использует только DSP память: IRAM, DRAM0, DRAM1. Параметры звука: 48000 Гц, 16 бит, 1 канал Частота обновления звукового буфера: 70 Гц Прерывания: 1. DMA канал 8 (рендеринг звука) 2. Таймер 0 DSP (парсинг трека) T113-s3 после загрузки программы в DSP - курит в пустом цикле в main(). DSP тоже курит в цикле main(), все телодвижения - по прерываниям. main.bin - бинарник для загрузки в память DSP main.txt - текстовая версия бинарника STARPORT.mp3 - проверочный трек прослушивания на ПК/Смартфоне Highly accurate Yamaha OPL3 (YMF262, CT1747) emulator: https://github.com/nukeykt/Nuked-OPL3 Этот DSP идеален для создания виртуальной периферии: вынести порты для доступа к регистрам OPL3-чипа на пару ячеек памяти, аля как у Adlib (порты 0x388/0x389) и рулить им со стороны T113-s3 Изменено 23 сентября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 24 сентября, 2023 Опубликовано 24 сентября, 2023 (изменено) · Жалоба 18 hours ago, sasamy said: где-то там же где и Tensilica Software Development Toolkit GCC-based compiler: xt-xcc and its friends. Clang-based compiler: xt-clang and its friends. https://docs.zephyrproject.org/latest/develop/toolchains/cadence_xcc.html Так а в чём прикол? Я видел эту ссылку и там написано что без лицензии хрен что работать будет: Make sure you have obtained a license to use the SDK, or has access to a remote licensing server А дальше идёт установка зефирных инверонментов. Зачем это мне? , когда уже раскачал BareMetal. Вопрос был задан в контексте того что имеет ли этот зефир свой компилятор, работающий без всяких лицензий или нет. Tensilica Software Development Toolkit e у меня и самого есть с их инструментами которые не работают без лицензии: Толку от неё ровно ноль. Разве что документацию почитать или посмотреть исходники. 18 hours ago, GenaSPB said: Я знаю один радиоприемник- белка dsp - сделанный на базе Adau. И ещё один коллега пытается применить в радиостанции. Обработка квадратурных каналов, фильтры, ару... https://www.google.com/amp/s/habr.com/ru/amp/publications/708178/ Программирует ADAU на C или SigmaStudio? Изменено 24 сентября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 24 сентября, 2023 Опубликовано 24 сентября, 2023 · Жалоба 8 minutes ago, repstosw said: Программирует Сигмастудио Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 25 сентября, 2023 Опубликовано 25 сентября, 2023 (изменено) · Жалоба Портанул ещё один плеер, который может воспроизводить треки от AdlibTracker2: https://github.com/dmitrysmagin/a2t_play Грузить в: 0x41800000 Запускать с: 0xC1800000 (регистр DSP_ALT_RESET_VEC_REG) Требует 6 МБ для своей работы, адреса: 0x41800000 .. 0x41DFFFFF В ахвиве ROM для HiFi4 DSP и виндовая версия с треками. A2T_Player.zip P.S. Плата MangoPi. Используется UART3 : PB6 TX, PB7 RX. На плате дополнительно работают: камера DVP, Si4463 SPI (к плееру не имеют никакого отношения). Изменено 25 сентября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться