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

Allwinner T113-s3 уделал HiFi4 DSP. Смеяться или плакать?

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: особенности архитектуры чувствуешь на себе ))

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


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

Собрал в Линуксе тулчейн для Винды под 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.

 

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

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


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

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.

 

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


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

6 часов назад, repstosw сказал:

Дополнительно собрал libhal(включение кеширования для DSP) под ABI-call0 из исходников.

Удалось ли повысить быстродействие теста вышеприведенного DSP?

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


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

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 свои оптимизирующие компиляторы делают.

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

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


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

36 minutes ago, mantech said:

Удалось ли повысить быстродействие теста вышеприведенного DSP?

Нет.  С ABI-call0 она осталась прежней.  Собственно, я и не надеялся увеличить скорость через ABI. 

Для ускорения того бенчмарка нужно распараллеливание на VLIW. И то - у меня есть сомнения: что тот код в исходном виде будет работать быстрее - его придётся переписать под архитектуру ДСП.  У C6745 с которым я возился несколько лет назад, там от силы 2-3 распараллеливания из доступных 8 получалось. И там довольно хороший оптимизатор - иногда по пол-часа компилируется...  На обычном сишном алгоритме. VLIW - это ещё не так просто. Не каждый алгоритм поддастся распарралеливанию.  Так что VLIW - не более чем коммерческий ход. :big_boss:

Так что тему пора переименовать в "Allwinner T113-s3 уделал HiFi4 DSP, смеяться или плакать?"  :lol:

 

26 minutes ago, sasamy said:

чтобы повысить быстродействие надо расширения ISA использовать, сомневаюсь что они есть в GCC, не зря же они свой оптимизирующий компилятор делают.

C Cadense Xtensa Tools всё гибло:  требуют лицензию. И постоянно включенный комп с их сервером, который пасёт лицензию.  Крякнутых версий не нашёл.  Так что придётся довольствоваться General Purpose выхлопом от GCC без VLIW и SIMD.  Хотя, вполне допускаю, что какой-нибудь местный хакер сможет в коде программ с command-line Inteface найти место где проверяется лицензия и заменить опкод перехода.  Тот кто дружит с трассировкой и дебагингом могут это сделать. Если конечно в Cadence защиту от трассировки не сделали :biggrin:

А что за оптимизирующий компилятор?  Где его можно скачать чтоб опробовать?

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

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


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

5 минут назад, repstosw сказал:

А что за оптимизирующий компилятор?  Где его можно скачать чтоб опробовать?

У меня большое подозрение, что на этом процессоре придется делать оптимизацию "руками", путем написания асмовых программ(((

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


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

Есть ещё Sigma Studio от Analog Devices.   Там есть поддержка ADAU1472 - это ДСП от АД   с HiFi4 ядром.  Но это не для программистов.  Скорее для музакеров и производителей акустических систем.  Типа визарда - накидать через GUI акустический конвеер (фильтры, ресемплеры, дисторшены, эхо,  итп..).  Сильно узкоспецифичен.

Плагин на каждый чип там в виде DLL. Наверное проприетарный формат.  DSP от T113-s3 туда не воткнёшь.  Но можно  выдирать  бинарник (код) для ДСП через линуксовый парсер или ручками из *.dspproj.

14 minutes ago, mantech said:

У меня большое подозрение, что на этом процессоре придется делать оптимизацию "руками", путем написания асмовых программ(((

Чего мелочиться - сразу в машинных кодах писать фрагменты с VLIW/SIMD :biggrin:  Документация на опкоды есть.  Возможно оформить  в виде макросов и вызывать их.

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

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


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

Обнаружил ещё одну особенность 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

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

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


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

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

 

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


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

6 hours ago, repstosw said:

не для программистов.  Скорее для музакеров и производителей акустических систем.  Типа визарда - накидать через GUI акустический конвеер (фильтры, ресемплеры, дисторшены, эхо,  итп..).  Сильно узкоспецифичен.

Я знаю один радиоприемник- белка dsp  - сделанный на базе Adau.  И ещё один коллега пытается применить в радиостанции. Обработка квадратурных каналов, фильтры, ару...

 

 

https://www.google.com/amp/s/habr.com/ru/amp/publications/708178/

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

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


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

Портанул эмулятор 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 :sun_bespectacled:

 

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

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


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

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 у меня и самого есть с их инструментами которые не работают без лицензии:

image.thumb.png.486ec301cc21c693078f2711f26e7739.png

Толку от неё ровно ноль. Разве что документацию почитать или посмотреть исходники.

 

18 hours ago, GenaSPB said:

Я знаю один радиоприемник- белка dsp  - сделанный на базе Adau.  И ещё один коллега пытается применить в радиостанции. Обработка квадратурных каналов, фильтры, ару...

https://www.google.com/amp/s/habr.com/ru/amp/publications/708178/

Программирует ADAU на C или SigmaStudio?

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

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


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

8 minutes ago, repstosw said:

Программирует

Сигмастудио 

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


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

Портанул ещё один плеер, который может воспроизводить треки от 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 (к плееру не имеют никакого отношения).

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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