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

repstosw

Участник
  • Постов

    2 582
  • Зарегистрирован

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

    2

Сообщения, опубликованные repstosw


  1. Использую две библиотеки, самостоятельно собранные из исходников (исходники доступны): libcelt.a и libspeexdsp.a

    В обоих библиотеках есть модули - kiss_fft.c, функции которых отличаются:  libcelt использует свой набор функций из своего модуля kiff_fft.c, а libspeex - соответственно свои.

    Объединить kiss_fft.c - не вариант: слишком разные реализации.

    При статической линковке я указываю соответственно -lcelt и -lspeexdsp.   В итоге рождается нерабочий код, улетающий в исключение.  Виной тому: линковщик берёт одну реализацию функций из одного модуля kiss_fft.c и применяет его к обоим библиотекам.

    Пока решил проблему - переименованием дублей функций во всех исходниках libspeex.  Читал ещё про смену перфикса через objdump, но это муторно - нужно переправлять все хедеры функциям.

     

    Вопрос: как решить проблему более красиво?  Надо чтобы функции в библиотеках работали только в пределах самой библиотеки и не распостранялись  на другие библиотеки.  Они static. Тулчейн - GCC.

  2. 8 hours ago, GenaSPB said:

    Левые или правые слеши пробовали? Может не bin а выше?

    Всё пробовал. Ничего не помогло.

    Однако, нашёл китайскую доку с описанием и картинками как надо делать: https://forums.100ask.net/uploads/short-url/jbjVnuCu0HrS6asoVNXB1DKfnBa.pdf

    Пишут: "Свяжитесь с Allwinner, для получения DSP лицензии".  Так что пускай китайцы дурака не включают, что они ничего не знают.

    Установил я этот package через эксплорер и накачал семплов.

    Но работать всёравно не даст - в задачах висит много копий c-lang (компилятор) и начинает бомбить кучей всплывающих окон о том, что нужна лицензия.

    Причём этих окон 4 штуки наклонировалось. Даже открытие файла проекта сопровождается появлением этих окон.

    Слишком назойливый и агрессивный ход.

    Сами семплы не особо порадовали - вершки абстракции. Как калокуб под STM32.  Не увидел железа. Очевидно и не увижу. Так как скорее всего спрятано в проприетарные либы.

    Расчитано на дураков, которые хотят по-быстрому въехать и рубить бабло, не изучая при этом архитектуру ядра.

    Не мой путь.

    • Thanks 1
  3. 17 minutes ago, GenaSPB said:

    А расходовать dsp iram чтобы средствами dsp копировать в dsp dram это слегка того... мягко говоря оверинжениринг.

    Это были эксперименты, чтобы увидеть специфику. Не более.

    Считаю нецелесообразным использовать DSP IRAM и DRAM, так как для моих задач их не хватает. Последний проект, который я перенёс на этот ДСП - занимает чуть более 228 кБ кода и требует для нормальной работы 4 МБ памяти.  Тут только исполнение кода в DDR. Без вариантов.

    47 minutes ago, sasamy said:

    я не видел такого, сам fpu опциональное расширение. Смотрел оверлеи от imx, mtk, lx7hifi4

    Читаю сейчас архив hifi4_ss_spfpu_7  - от Cadence. Там есть файлик install.exe который требует путь к тулчейну. Я его указываю, но ничего не происходит - инсталлятор  тихо сворачивается.

    Что с этим делать и что это такое - непонятно.

    1.thumb.jpg.3d430327c707fc2203c7bd9f3ddd3c45.jpg2.thumb.jpg.09151902655fc2ce594ebe1b4a59cd25.jpg

    Путь к тулчейну как я понимаю - вот этот?

    image.thumb.png.ec653d0d8cc9705b90bb0dfc97473a3d.png

  4. 3 hours ago, sasamy said:

    ядро LX7, причём у esp32 нет этого расширения.

    А в доках на ядро LX7 сказано, какие инструкции VFPU - mandatory, а какие - нет?

    3 hours ago, sasamy said:

    если так, рулетка с FPU выглядит малопривлекательно - неизвестно когда выстрелит,

    Согласен. Без чёткой инфы - занятие становится похожим на реверс.

    3 hours ago, sasamy said:

    мне изначально не нужен FPU,

    А мне очень нужен 🙂 Все кодеки которые использую - в основном работают на floating point.  Ещё со времён STM32 🤣

     

    Обнаружил ещё одну особенность: чтение из памяти DSP IRAM - только порциями по 4 байта.  Если делать чтение по 2- или 1- байт, то результат непредсказуем.

    По этой причине иногда подвисал сишный стартап (на месте копирования данных из LMA в VMA - секция .data). 

    Секция .rodata таже должна быть скопирована из LMA в VMA в сишном стартапе, чтобы избежать жесткого контроля чтения переменных  const по 4 байта.

    Конечно, данные можно хранить в DSP DRAM, но тогда размер бинарника вырастет до 64 КБ+, так как будет большая дырка )))

     

    Если код находится в DDR, то ограничение снимается.  И если включено кеширование IRAM, то тоже.

  5. 1 hour ago, sasamy said:

    правильно я понял вы собрали компилятор в crosstool-ng с оверлеем от esp32s3,  а не дописывали всё что касается fpu в оверлей от t113 (binutils/bfd/xtensa-modules.c) ?

    Да. Собрал чистый вариант  для esp32-s3.   Очевидно, что для T113-s3 HiFi4 DSP запрещены некоторые инструкции с floating point, которые разрешены для ESP32-s3.   И некоторые регистры не доступны, например ATOMCTL - при его чтении возникает всё то же исключение - illegal instruction.

    И для HiFi4 DSP - VFPU как опция. Так что может что-то и урезали.  Нету внятной доки именно на ядро HiFi4. Какие именно инструкции разрешены? И что оставили от него китайцы ?

    Вот список инструкций, которые в T113-s3 HiFi4 завершаются аварийно:

    mov.s f*, f*
    lsi f*, a*, const
    trunc.s a*, f*, const

    Инструкции которые работают:

    	wfr	f*,a*
    	add.s	f*,f*,f*
    	madd.s	f*,f*,f*
    	rfr	a*,f*
    

    По крайней мере - результат их вычислений корректен.

     

    Пробовал строить свои проекты  xtensa-esp32s3-elf  - если не использовать плавучку, то на HiFi4 они сохраняют работоспособность. Правда, встроенные дефайны компилятора в этом случае лучше не использовать :biggrin:

    1 hour ago, sasamy said:

    а не дописывали всё что касается fpu в оверлей от t113 (binutils/bfd/xtensa-modules.c) ?

    Там слишком многое придётся переносить. И не факт, что часть из этого заработает с T113-s3 HiFi4 DSP.

  6. 1 hour ago, repstosw said:

    MADD.S не работает как надо.

    С madd разобрался.  Проблема была здесь:

    movi		a13,1
    movi		a14,2
    movi		a15,3

    Нужно грузить числа в представлении  floating point. Не доглядел.

    Сделал передачу float в аргументах:

    Test:
    	wfr	f0,a2		//0.5
    	wfr	f1,a3		//1.7
    
    	add.s	f0,f0,f1	//2.2
    	madd.s	f0,f0,f1	//5.94
    
    	rfr	a2,f0
    
    	ret
    
    extern float Test(float p1,float p2);
    
    int main(void)
    {
     printf("%f\n",Test(0.5F,1.7F));
     while(1);
    //...

    Теперь всё корректно.

    Осталось разобраться, почему некоторые инструкции вываливаются в "illegal instruction".

    Например,  mov.s f4,f1. Вполне безобидный код.  Сравнил опкод по мануалу и то, что сделал тулчейн: одинаково - 0xFA4100.

  7. Очень странный VFPU у этого HiFi4 DSP.   Не работает, согласно Xtensa® Instruction Set Architecture (ISA) Reference Manual.

    Сделал небольшую функцию. Результат печатаю через printf:

    	//ASM:
    
    	.align 4
    	.global Test
    
    Test:
    	movi		a13,1
    	movi		a14,2
    	movi		a15,3
    	wfr		f0,a13		//f0=1
    	wfr		f1,a14		//f1=2
    	wfr		f2,a15		//f2=3
    	add.s		f0,f0,f1	//f0=f0+f1=1+2=3
    	madd.s		f0,f1,f2	//f0=f0+(f1*f2)=3+(2*3)=9
    	rfr		a2,f0		//return value
    	ret
    
          //C:
          
    extern u32 Test(void);
    
    int main(void)
    {
     printf("%d\n",Test());
     while(1);
          //...

     

    MADD.S не работает как надо. Вместо 9 возвращает 3.   Умножение между f1 и f2 не происходит.  Неужели китайцы и здесь намудрили? (так же как и с интерливом адресов в DRAM).

    Допустим, что у него нет VFPU. Тогда все инструкции должны приводить к исключению "Illegal Instruction". А это наблюдается только у некоторых инструкций.

    Кроме того, при выключенном бите сопроцессора (он же - и Boolean coprocessor) в регистре cpenable, при выполнении любой инструкции VFPU возникает исключение "coprocessor #1 disabled".

    Тоесть делаю вывод - оно как бы есть, но какое-то не такое, как в мануале... :aggressive:
     

  8. 3 hours ago, repstosw said:

    У меня Линукс виснет во время билда почему-то.  Просто курсор мыши исчезает и даже на Ctrl+Alt+Del не реагирует. Только из розетки выключать.

    Отключил GUI: Ctrl+Alt+F1. Удалось построить xtensa-esp32s3-elf для ABI=call0 по умолчанию.

    В общем не всё так просто с этим Floating Point.

    Во-1, без включения сопроцессора,  любая fpu-инструкция приводит к исключению 0 "Illegal Instruction".   Нужно его включить (бит 1 регистр cpenable):

    	movi		a0,2 			//bit 1 - Floating Point (coprocessor #1)
    	wsr.cpenable	a0
    	rsync					/* wait for WSR to CPENABLE to complete before accessing FP coproc state */
    
    	movi		a0,0
    	wur.fcr		a0			/* clear FCR (default rounding mode, round-nearest) */
    	wur.fsr		a0	    	/* clear FSR */

    Во-2, почему-то не все инструкции проходят. Та, что закомментирована - вызывает исключение:

    	wfr	f1, a4
    	sub.s	f0, f3, f1
    	wfr	f2, a2
    //	mov.s	f4, f1          //приводит к Double Exception
    	madd.s	f4, f2, f3
    	add.s	f0, f0, f2
    	rfr	a2, f4

     

    Либо опкоды у esp32 отличаются от HiFi4, либо что-то пошло не так...

  9. 3 hours ago, sasamy said:

    я им собирал с оверлеем китайца видел что abi переключается но fpu не взлетел и я подумал что gcc настолько убог и не поддерживает  - не ожидал что такая подстава в оверлее, всегда смотрел только core-isa а там всё есть и адреса совпадают, так похоже на правду было.

    А как вы переключали ABI ?  Я правил в оверлее все дефайны касающиеся WINDOWED/CALL0.  Полагаю, есть способ проще.

    3 hours ago, sasamy said:

    у espressif есть свой форк crosstool-ng - кроме прочего (свои форки gcc, binutils) там есть поддержка вплоть до gcc 13

    https://github.com/espressif/crosstool-NG/tree/esp-1.25.x

    Собрал его в Линуксе.  Но не удаётся построить тулчейн - тупит при загрузке zlib 2.1.13. Не может его загрузить и всё завершается неудачно.

    Есть ли способ заставить ct-ng  не качать и устанавливать каждый раз всё барахло, а сохранять и устанавливать на локальной машине?

    Слишком долго ждать постоянно когда строится.  У меня 2 часа один билд.  GCC собирается в 2 прохода (это помто что BUILD != HOST)

    Старый crosstool-ng собирает без проблем.

    3 hours ago, sasamy said:

    похоже espressif дальше других продвинулись в разработке

    Да.  Они молодцы. Развивают оверлеи.

    4 hours ago, sasamy said:

    xtensa_esp32s2 - одноядерный lx7 без fpu

    xtensa_esp32s3 - двухядерный lx7 + fpu

    HiFi4 - Это тоже LX7 ?

    Глянул даташиты на эти ESP:

    ESP32 - LX6

    ESP32-s2 : не имеет регистров FPU

    ESP32-s3: имеет только FPU одинарной точности (SP, не DP).

     

    И ещё. Есть ли способ собрать crosstool-ng в винде с помощью minGW32 ?  У меня Линукс виснет во время билда почему-то.  Просто курсор мыши исчезает и даже на Ctrl+Alt+Del не реагирует. Только из розетки выключать.

     

  10. 43 minutes ago, sasamy said:

    xtensa_esp32s3 - двухядерный lx7 + fpu

    Скачал этот тулчейн: xtensa-esp32s3-elf-12.2.0_20230208-i686-w64-mingw32.zip

    Он легко гуглится. Там же и для Линукса есть.

    Проверил.

    Результаты впечатлили: кроме floating point он ещё может переключать ABI. По умолчанию там Windowed, но я поставил Call0. 

    Но слинковать им не выйдет. И полностью откомпилять HiFi4 не получится (не видит некоторые регистры/инструкции для HiFi4).

    Поэтому сделал смешанную компиляцию: арифметику скомпилил xtensa-esp32s3-elf , а остальное xtensa-hifi4-elf.

    Тестирование провел на таком коде:

    float ttt(float a,float b,float c,float d)
    {
     float e;
     e=a+b;
     e-=c;
     e*=c;
     e+=(a*b)+c;
     return e;
    }
    
    int main(void)
    {
     AVS_CNT0_REG=0;
     float z=0;
     for(u32 i=0;i<100000;i++)z+=ttt(0.5F,0.123F,0.25F,0.1F);
     printf("result: %f, delay: %d us\n",z,AVS_CNT0_REG/6);
     while(1);
     return 0;
    }

    Листинг функции ttt() с компилятора xtensa-esp32s3-elf-gcc - кроме FPU регистров даже присутствуют  инструкции madd, что меня очень сильно радует. Код функции вышел крохотным:

    ttt:
    	wfr	f1, a4
    	wfr	f3, a3
    	sub.s	f0, f3, f1
    	wfr	f2, a2
    	mov.s	f4, f1
    	madd.s	f4, f2, f3
    	add.s	f0, f0, f2
    	madd.s	f4, f1, f0
    	rfr	a2, f4
    	ret.n

    Совсем иная картина с "родным" тулчейном xtensa-hifi4-elf-gcc:

    Spoiler
    ttt:
    	addi	sp, sp, -32
    	s32i.n	a14, sp, 16
    	mov.n	a14, a3
    	s32i.n	a13, sp, 20
    	mov.n	a3, a4
    	mov.n	a13, a2
    	mov.n	a2, a14
    	s32i.n	a0, sp, 28
    	s32i.n	a12, sp, 24
    	s32i.n	a15, sp, 12
    	mov.n	a12, a4
    	call0	__subsf3
    	mov.n	a3, a13
    	call0	__addsf3
    	mov.n	a3, a2
    	mov.n	a2, a12
    	call0	__mulsf3
    	mov.n	a15, a2
    	mov.n	a3, a14
    	mov.n	a2, a13
    	call0	__mulsf3
    	mov.n	a3, a12
    	call0	__addsf3
    	mov.n	a3, a15
    	call0	__addsf3
    	l32i.n	a0, sp, 28
    	l32i.n	a12, sp, 24
    	l32i.n	a13, sp, 20
    	l32i.n	a14, sp, 16
    	l32i.n	a15, sp, 12
    	addi	sp, sp, 32
    	ret.n

     

     

    Результаты очевидны.

    Хардовая плавучка:

    Quote

    result: 40476.511719, delay: 666 us

    Софтовая - почти в 10 раз медленее:

    Quote

    result: 40476.511719, delay: 6229 us

    Надо как-то наложить на HiFi4 оверлей возможности FPU 🙂

  11. Оверлей, предоставленный японцем, не поддерживает hard float. В файле xtensa-config.c отсутствуют описания регистров f0 .. f15 и операции над ними. Построение тулчейна со включенными опциями vfpu2 завершилось неудачно: не знает что такое регистры f0..f15.

    Вот как выглядит настоящий код с плавающей точкой в архитектуре xtensa:

    Spoiler
    	wfrd		f1, xh, xl
    	wfrd		f2, yh, yl
    
    	div0.d		f3, f2
    	nexp01.d	f4, f2
    	const.d		f0, 1
    	maddn.d		f0, f4, f3
    	const.d		f5, 0
    	mov.d		f7, f2
    	mkdadj.d	f7, f1
    	maddn.d		f3, f0, f3
    	maddn.d		f5, f0, f0
    	nexp01.d	f1, f1
    	div0.d		f2, f2
    	maddn.d		f3, f5, f3
    	const.d		f5, 1
    	const.d		f0, 0
    	neg.d		f6, f1
    	maddn.d		f5, f4, f3
    	maddn.d		f0, f6, f2
    	maddn.d		f3, f5, f3
    	maddn.d		f6, f4, f0
    	const.d		f2, 1
    	maddn.d		f2, f4, f3
    	maddn.d		f0, f6, f3
    	neg.d		f1, f1
    	maddn.d		f3, f2, f3
    	maddn.d		f1, f4, f0
    	addexpm.d	f0, f7
    	addexp.d	f3, f7
    	divn.d		f0, f1, f3
    
    	rfr		xl, f0
    	rfrd		xh, f0

    Я понимаю, что инструкции SIMD и VLIW недоступны с данным тулчейном.  Но инструкции FPU - они просто ОБЯЗАНЫ быть!

    Нужно искать другой оверлей. И строить с ним новый тулчейн через crosstool-ng.

  12. float ttt(float a,float b)
    {
     float c=a+b;
     printf("%f\n",c);
     return c;
    }
    
    int main(void)
    {
     printf("%f\n",ttt(0.5F,0.333F));
     return 0;
    }
    xtensa-hifi4-elf-gcc -Ofast -std=c99 -DNDEBUG -ffast-math -fno-math-errno -ffinite-math-only -fno-trapping-math -S -o my_asm_output.s main.c
    ttt:
    	movi	a9, 0x90
    	sub	sp, sp, a9
    	s32i	a0, sp, 140
    	s32i	a12, sp, 136
    	call0	__addsf3
    	mov.n	a12, a2
    	call0	__extendsfdf2
    	mov.n	a5, a3
    	l32r	a3, .LC1
    	mov.n	a4, a2
    	mov.n	a2, sp
    	call0	sprintf
    	mov.n	a2, sp
    	call0	UART_puts
    	l32i	a0, sp, 140
    	movi	a9, 0x90
    	mov.n	a2, a12
    	l32i	a12, sp, 136
    	add.n	sp, sp, a9
    	ret.n

     

    Стыдоба и позор: __addsf3, __extendsfdf2.

    https://github.com/gcc-mirror/gcc/blob/master/libgcc/soft-fp/addsf3.c

    Quote

    Software floating-point emulation.
       Return a + b

    У меня libcelt с включенной в конфиге floating-point реализацией даёт всего 88 FPS.  А с Fixed point реализацией: 438 FPS.

    https://github.com/scjtqs2/libcelt/tree/main

     

    Имеет ли этот HiFi4 DSP аппаратную поддержку floating point? Если да, то есть ли способ заставить компилятор НЕ использовать эмуляцию floating point? 

    Вариант применения всяких интринсиков типа Float_Add(Float_Mul(a,b),c ) - не рассматриваю.   Нужно чтобы набранное в сях float d = a*b+c  становилось ассемблерными инструкциями.

  13. 1 hour ago, GenaSPB said:

    Про инлайн- обычной спрсоб в виде -fno-errno или какой-то такой флаг помогает? На cortex это обычное дело

    Использую эти : -fno-math-errno -ffast-math. Вызовы остаются

  14. 29 minutes ago, sasamy said:

    вывод: если в автомобиль не заливать бензин (SIMD и VLIW) а тащить собачкой (core ISA)  он не может обогнать даже велосипедиста!

    Много работаю с чужим кодом. Обычным кодом.  Который не VLIW. Обычный сишный код.  General purpose. Именно производительность на таком коде HiFi4 DSP будет хуже T113-s3 CPU.

    Чтобы заливать бензин марки VLIW - нужно писать с нуля под этот набор инструкций.

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

    32 minutes ago, sasamy said:

    наверно как и в Linux

    https://ru.wikipedia.org/wiki/Math.h#libm

    не уверен что комьюнити версия поддерживает floating-point сопроцессор, в freertos сторонняя библиотека libm.a и возможно поддерживает - надо проверять

    В нормальных тулчейнах GCC это переключается флагом -mhard-float.  Но в xtensa-hifi4-elf-  этот флаг не работает и при его использовании пишет ошибку.

    И дело не в libm.  Дело не в синусах-косинусах.  Простое умножение двух чисел: арифметические выражения должны инлайниться ассемблерными инструкциями, а не вызовами функций.

  15. 17 hours ago, sasamy said:

    а можно куда-нибуть скинуть весь SDK ?

    В сжатом виде он занимает около 12 ГБ. Слишком большой объём. Я не буду столько закачивать и ждать.:boredom:

    1 hour ago, sasamy said:

    только неизвестно поддерживает ли xcc этот abi иначе затея с bare metal для него обречена тормозить

    Чего? 🙂

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

    Тот компилер, что я собрал под call0 ABI уже давно всё работает, перевел на него несколько проектов. По скорости одинаково с windowed ABI, делал замер скорости на рутинных вычислениях.  А вот то, что с Call0 не дергаются экспешены по вызову переключений окон и копирования в стек - это  явно плюс + освобождает программиста от головной боли.

    1 hour ago, sasamy said:

    в freertos используются сторонние бинарные либы, это видно из map файла и из выхлопа printf

    Честно говоря, меня этот FreeRTOS уже начинает порядком раздражать. Куда ни посмотри на сорцы - везде суют контекст многозадачности в обработчики прерываний, делая их неуклюжими.  И кишки, торчащие из libc, которые требуют реентабельность. На самом деле проще надо быть! Проще!  🙂

    1 hour ago, sasamy said:

    для меня совсем не интересно - вся периферия работает в Linux, на freertos скидывать есть смысл только задачи требующие реалтайма - максимум пара прерываний от INTC  и вложенность тут вообще непонятно для чего

    Для меня неинтересны ни Линукс, ни фриРТОС. :)))

    А вложенность и приоритеты мне нужны, чтобы не потерять пакеты в потоковом режиме, которые принимает приёмник на Si4463 по прерыванию, при этом есть ещё дополнительные три прерывания: камера, дисплей и аудио-DMA 🙂

     

    P.S. Ещё не совсем понятно, как у данного тулчейна как строится работа с floating point.  Я перемножаю два числа и результат вывожу printf. В ассемблерном листинге я вижу вызовы функций типа mulf_ , formatf_.  А должны быть ассемблерные вкрапления инструкций.   Из-за  этого я был вынужден перевести компиляцию библиотек libspeexdsp и libcelt в режим fixed point.

     Возможно нужно простроение тулчейна с ABI hardfp.

     

    Из всего увиденного и испытанного я сделал вывод, что вычислительная мощь HiFi DSP  явно проигрывает основному ядру Cortex A7. В разы. Скажем так - в 3..4 раза. При условии, если считать частоты одинаковыми.  А если учесть, что у HiFi4 частота вдвое меньше, то проигрыш - в 6..8 раз.

    А крику-то сколько было... Cadence, Tensillica...  На поверку оказалось хуже, чем ARM.   ESP32 туда же.

    Не стоит ждать от этого ядра слишком много.  Как второстепенный недо-проц, чтобы посчитать какой-нибудь звуковой синтез или проэмулять раритет - пойдёт.  На что-то более серьёзное - нет.

    Лучше взять H616 с его 4-мя ядрами 😃

     

  16. 48 minutes ago, sasamy said:

    а можно куда-нибуть скинуть весь SDK ?

    В своё время Tina T113-s3 Linux SDK выкачивал с baidu.com через Motrix. Проверил, сейчас эта ссылка дохлая.

    Попытаюсь закачать то что есть.

    48 minutes ago, sasamy said:

    то что я видел на гитхабе - там нет этого, возможно и xcc там есть и лицензия.

    На гитхабе не полная версия Тины для T113-s3.

    48 minutes ago, sasamy said:

    Я так понял инструментарий (компилятор) для кастомных инструкций TIE генерируется средой разработки - какие расширения заложили в ядро xtensa только allwinner знает, они и должны дать оптимизированный компилятор

    Честно говоря, в свое время я задолбался возиться с этим китайским(точнее - японским) оверлеем!  Он ни в какую не видел настройки для ABI=call0.  Пришлось брать оригинальный оверлей от xtensa и пробовать с ним.  Получилось. Но позже обнаружил, что не все регистры и инструкции прописаны.  В итоге, я сделал свой оверлей - который легко сетапится на ABI=call0 + все дефайны и инструкции взял от китайского японского оверлея.  Получил то, что надо 🙂

    48 minutes ago, sasamy said:

    а китаец ещё и сторонние бинарнные библиотеки и конфиг (оверлей) откуда то взял - явно не из астрала

    Кто-то накидал ему для оверлея описание регистров и инструкций - именно для T113-s3. Так как lx7 и hifi4 от xtensa подходят не 100% и содержат меньше информации.

     

    Кроме того, libc, которую собрал китаец японец - НЕ поддерживает printf с %f и %x.  Собрал свой libc (пока на уровне библиотеки libstdio.a) -  с полной поддержкой printf.

     

    Сделал приоритеты внешним прерываниям. Сейчас разбираюсь с вложенными прерываниями.  Теперь стало ясно, зачем группа регистров pintc_regs->resp,resp1,resp2 - они позволяют замаскировать источник прерывания, чтобы не было вложенности самого на себя.  Но об этом позже.

     

    Как я понял, FreeRTOS не умеет во вложенные прерывания (речь о внешних прерываниях, которые на INTC с его приоритетами).

     

    Новые номера внешних источников прерываний, которые нашёл по ходу работы:

    #define GPIOB_INTC_SOURCE 40 //GPIO Port B
    #define LCD_INTC_SOURCE   56 //LCD TCON0
    #define CSIC_INTC_SOURCE  61 //CSIC - digital camera capture (DVP)
    53 minutes ago, sasamy said:

    а китаец ещё и сторонние бинарнные библиотеки и конфиг (оверлей) откуда то взял - явно не из астрала

    Скорее всего они были взяты из Cadence Xtensa. Тот самый, что больше 1 ГБ и требует лицензию.

    Исходники libhal я нашёл и пересобрал. Ссылку давал выше с компилятором под ABI=call0.

  17. ▶️ Сделан ещё одни SDK - для HiFi4 DSP, входящий в состав T113-s3💥

     

    Возможности SDK:

    1. Инициализация ядра, прерываний, настройка кеширования

    2. Настройка окружения C/C++

    3. Драйвер загрузки программ для HiFi4 DSP со стороны T113-s3.

    4. Поддержка модулей: таймеры, контроллер внешних прерываний, MessageBox, ауди-кодек, DMA, GPIO.

     

    5. Поддержка плееров с эмулятором OPL3 (Adlib):

    https://github.com/nukeykt/Nuked-OPL3

    https://github.com/dmitrysmagin/a2t_play

     

    6. Поддержка мультиформатного плеера с эмуляторами многих систем:

    https://github.com/mmontag/game-music-emu

    AY        ZX Spectrum/Amstrad CPC
    GBS       Nintendo Game Boy
    GYM       Sega Genesis/Mega Drive
    HES       NEC TurboGrafx-16/PC Engine
    KSS       MSX Home Computer/other Z80 systems (doesn't support FM sound)
    NSF/NSFE  Nintendo NES/Famicom (with VRC 6, Namco 106, and FME-7 sound)
    SAP       Atari systems using POKEY sound chip
    SPC       Super Nintendo/Super Famicom
    VGM/VGZ   Sega Master System/Mark III, Sega Genesis/Mega Drive,BBC Micro

     

    🌐 По вопросам приобретения SDK (A13, V3s, T113-s3, HiFi4) пишите на почту  repstosw2018  @    gmail.com

    Цена договорная (зависит от уровня подготовки покупателя, плюс цена зависит от того, какие модули программ приобретаются).

  18. 9 hours ago, haker_fox said:

    Что-то выделить из этой темы в отдельную? Если да, то я поглядел всю тему бегло, считаю, что это сделать сложно без потери целостности изложения материала.

    Совершенно верно.

    Я как автор темы, против разбиения этой темы.

     

    3 hours ago, GenaSPB said:

    Пожалуй переименование и закреп здорово помогут.  Мне кстати на начальных этапах именно данная тема здорово помогла в разбирательствах с allwinner

     

    3 hours ago, haker_fox said:

    Модератор: Закрепил. Предлагайте новые имена темы. Я в данной теме микроконтроллеров не очень компетентен. Чтобы не засорять тему, я предлагаю писать мне личные сообщения.

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

     

    Доделал настройку тулчейна и SDK для C++.

    Портировал ещё один мега-проектище, поддерживающий музыкальные форматы различных игровых систем: https://github.com/mmontag/game-music-emu

    Game_Music_Emu is a collection of video game music file emulators that
    support the following formats and systems:
    
    AY        ZX Spectrum/Amstrad CPC
    GBS       Nintendo Game Boy
    GYM       Sega Genesis/Mega Drive
    HES       NEC TurboGrafx-16/PC Engine
    KSS       MSX Home Computer/other Z80 systems (doesn't support FM sound)
    NSF/NSFE  Nintendo NES/Famicom (with VRC 6, Namco 106, and FME-7 sound)
    SAP       Atari systems using POKEY sound chip
    SPC       Super Nintendo/Super Famicom
    VGM/VGZ   Sega Master System/Mark III, Sega Genesis/Mega Drive,BBC Micro

     

    Как раз там один жёсткий С++ с классами.

     

    Из особенностей, можно отметить следующее:

     

    1. Линковать с -lstdc++. Иначе многое будет не определено.

     

    2. Пришлось сделать свою реализацию __ieee754_remainder():

    //                       IEEERemainder   Remainder operator
    // 3 / 2 =                          -1                    1
    // 4 / 2 =                           0                    0
    // 10 / 3 =                          1                    1
    // 11 / 3 =                         -1                    2
    // 27 / 4 =                         -1                    3
    // 28 / 5 =                         -2                    3
    // 17.8 / 4 =                      1.8                  1.8
    // 17.8 / 4.1 =                    1.4                  1.4
    // -16.3 / 4.1 =    0.0999999999999979                   -4
    // 17.8 / -4.1 =                   1.4                  1.4
    // -17.8 / -4.1 =                 -1.4                 -1.4
    /*
    Remainder = (Math.Abs(dividend) - (Math.Abs(divisor) *   
                (Math.Floor(Math.Abs(dividend) / Math.Abs(divisor))))) *   
                Math.Sign(dividend)  
    
    IEEERemainder = dividend - (divisor * Math.Round(dividend / divisor))  
    */
    
    double __ieee754_remainder(double x,double y)
    {
     return x-(y*round(x/y));
    }

     

    3. Функции-пустышки.  Не вызываются.  Но из-за -lstdc++ должны быть определены:

    Spoiler
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wunused-parameter"
    #pragma GCC diagnostic ignored "-Wreturn-type"
    
    void _exit(void)
    {
     printf("_exit\n");
    }
    
    int _getpid_r(struct _reent *r)
    {
     printf("_getpid_r\n");
    }
    
    int _kill_r(struct _reent *r,int a,int b)
    {
     printf("_kill_r\n");
    }
    
    int _fstat_r(struct _reent *r,int a,struct stat *s)
    {
     printf("_fstat_r\n");
    }
    
    _ssize_t _read_r(struct _reent *r,int a,void *p,size_t s)
    {
     printf("_read_r\n");
    }
    
    _off_t _lseek_r(struct _reent *r,int a,_off_t o,int b)
    {
     printf("_lseek_r\n");
    }
    
    _ssize_t _write_r(struct _reent *r,int a,const void *p,size_t s)
    {
     printf("_write_r\n");
    }
    
    int _close_r(struct _reent *r,int a)
    {
     printf("_close_r\n");
    }
    
    #pragma GCC diagnostic pop

     

     

    4. Компиляция с флагами:

    -Ofast -DNDEBUG -fmax-errors=1 
    -ftree-vectorize -fno-math-errno -ffast-math 
    -fno-rtti -fno-exceptions -fno-unwind-tables 
    -fno-asynchronous-unwind-tables -fomit-frame-pointer
    -fno-threadsafe-statics -ffunction-sections -fdata-sections

    5. Линковка:

    -nostartfiles -nostdlib -nodefaultlibs -ffreestanding 
    -Wl,--gc-sections -Wl,--static -Wl,--strip-all
    -lstdc++ -lhal

    Постарался всё лишнее вырезать.

     

    Работы над SDK для HiFi4 завершены.  Всё что хотел, получил.:biggrin:

     

  19. 13 hours ago, repstosw said:

    Вопрос, как побороть это?   Может в данном GCC это не preinit_array, а как-то по-другому называется?

    map-файл тоже пишет, что секция не занята.

    Заработали конструкторы и статические объявления классов в С++.

    Тулчейн размещает конструкторы в секцию .ctors, а не в .init / .init_array. Следовательно стартап для С++ с рабочими конструкторами выглядит так:

    extern char _sidata,_sdata,_edata;
    extern char _sbss,_ebss;
    extern char _ctors_start,_ctors_end;
    
    static void cxx_invoke_constructors(void)
    {
     typedef void (*ctor_func_t)(void);
     ctor_func_t *func=(ctor_func_t*)&_ctors_start;
     for(;func!=(ctor_func_t*)&_ctors_end; func++)(*func)();
    }
    
    void libc_init(void)
    {
    // memcpy(&_sdata,&_sidata,&_edata-&_sdata); //copy LMA to VMA
     memset(&_sbss,0,&_ebss-&_sbss);           //clear BSS
     cxx_invoke_constructors();                //constructor init (C++)
    }

    Для линкера:

    .ctors :
    {
        PROVIDE_HIDDEN (_ctors_start = .);
        KEEP (*(SORT(.ctors.*)))
        KEEP (*(.ctors*))
        PROVIDE_HIDDEN (_ctors_end = .);
    } > ROM

    Работают нормально как сишные конструкторы, так и статически объявленные C++ классы с инициализацией:

    #include "klass.h"
    
    void init101(void) __attribute__((constructor));
    void init102(void) __attribute__((used,constructor));
    
    void init101(void)
    {
     UART_puts("init101\n");
    }
    
    void init102(void)
    {
     UART_puts("init102\n");
    }
    
    IClass ic(2,5);      //делаем экземпляр класса - уже на момент создания класса, С++ рантайм должен вывести строку
    TestClass tc(ic);
    
    int main(void)
    {
     UART_init();
     printf("\nHiFi4 C++ Class Example\n");
     while(1);
     return 0;
    }

    вывод:

    init101
    init102
    Hi! I'm Constructor ;)
    HiFi4 C++ Class Example

     

  20. Пытаюсь поднять C++ окружение.  Создаю конструкторы:

    //C constructor
    __attribute__((constructor(101))) void init101() { UART_puts("init101"); }
    
    //C++ constructor
    IClass ic(2,5);      //делаем экземпляр класса - уже на момент создания класса, С++ рантайм должен сработать
    TestClass tc(ic);
    
    int main(void)
    {
    //...

    В линкере описываю нужные секции:

    .preinit_array :
    {
        PROVIDE_HIDDEN (__preinit_array_start = .);
        KEEP (*(.preinit_array*))
        PROVIDE_HIDDEN (__preinit_array_end = .);
    } > ROM
    
    .init_array :
    {
        PROVIDE_HIDDEN (__init_array_start = .);
        KEEP (*(SORT(.init_array.*)))
        KEEP (*(.init_array*))
        PROVIDE_HIDDEN (__init_array_end = .);
    } > ROM
    
    .fini_array :
    {
        _fini = . ;
        PROVIDE_HIDDEN (__fini_array_start = .);
        KEEP (*(SORT(.fini_array.*)))
        KEEP (*(.fini_array*))
        PROVIDE_HIDDEN (__fini_array_end = .);
    } > ROM
    
    .ctors :
    {
        KEEP (*(SORT(.ctors.*)))
        KEEP (*(.ctors*))
    } > ROM
    
    .dtors :
    {
        KEEP (*(SORT(.dtors.*)))
        KEEP (*(.dtors*))
    } > ROM

    А в сишном стартапе пишу:

    extern void (*__preinit_array_start []) (void) __attribute__((weak));
    extern void (*__preinit_array_end []) (void) __attribute__((weak));
    extern void (*__init_array_start []) (void) __attribute__((weak));
    extern void (*__init_array_end []) (void) __attribute__((weak));
    extern void (*__fini_array_start []) (void) __attribute__((weak));
    extern void (*__fini_array_end []) (void) __attribute__((weak));
    
    void _fini(void);
    void _exit(int return_code) __attribute__((noreturn));
    
    static void __libc_init_array(void)
    {
     size_t count,i;
    
     count=__preinit_array_end-__preinit_array_start;
     for(i=0;i<count;i++)__preinit_array_start[i]();
    
     count=__init_array_end-__init_array_start;
     for(i=0;i<count;i++)__init_array_start[i]();
    }
    
    static void __libc_fini_array(void)
    {
     int count,i;
     count=__preinit_array_end-__preinit_array_start;
     for(i=count-1;i>=0;i--)__fini_array_start[i]();
     _fini();
    }
    
    void exit(int return_code)
    {
     __libc_fini_array();
     _exit(return_code);
    }
    
    void libc_init(void)
    {
    // memcpy(&_sdata,&_sidata,&_edata-&_sdata); //copy LMA to VMA
     memset(&_sbss,0,&_ebss-&_sbss);           //clear BSS
    
     __libc_init_array();                      //constructor init (C++)
    }

     

    В итоге конструкторы не работают!  Если их вызвать в main(), то они работают.   Вариант выше работает в ARM GCC, но не работает в DSP GCC.

    Ассемблер показал следующее:

    c18028a4 <.text.__libc_init_array>:
    c18028a4:	e0c112                      	addi	a1, a1, -32
    c18028a7:	7109                          	s32i.n	a0, a1, 28
    c18028a9:	fff631                      	l32r	a3, 0xc1802884
    c18028ac:	fff621                      	l32r	a2, 0xc1802884
    c18028af:	c02320                      	sub	a2, a3, a2
    c18028b2:	212220                      	srai	a2, a2, 2
    c18028b5:	1129                          	s32i.n	a2, a1, 4
    c18028b7:	020c                          	movi.n	a2, 0
    c18028b9:	0129                          	s32i.n	a2, a1, 0
    c18028bb:	0005c6                      	j	0xc18028d6
    c18028be:	000000                      	ill
    c18028c1:	fff031                      	l32r	a3, 0xc1802884
    c18028c4:	0128                          	l32i.n	a2, a1, 0
    c18028c6:	1122e0                      	slli	a2, a2, 2
    c18028c9:	232a                          	add.n	a2, a3, a2
    c18028cb:	0228                          	l32i.n	a2, a2, 0
    c18028cd:	0002c0                      	callx0	a2

     

    Тоесть он почему-то считает что __preinit_array_end = __preinit_array_start =  0xc1802884.   Тоесть в этой секции дырка от бублика, а не указатели, которые надо вызвать:

     count=__preinit_array_end-__preinit_array_start;
     for(i=0;i<count;i++)__preinit_array_start[i]();

     

    Вопрос, как побороть это?   Может в данном GCC это не preinit_array, а как-то по-другому называется?

    map-файл тоже пишет, что секция не занята.

  21. 16 minutes ago, sasamy said:

    проверил - в freertos перестановка пендингов мествами не влияет, код работает корректно без дополнительных барьеров

    Значит в коде freertos есть фрагмент, который вносит задержку после чтения-записи регистра, выполняющий роль барьера )))

    Что там идёт после вашего сишного обработчика?  Простыня из контекстов восстановлений? ))) Чем не барьер?

     https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/blob/master/kernel/portable/xtensa_vectors.S#L617

    https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/blob/master/kernel/portable/xtensa_vectors.S#L1051

    Слишком дофига всего:

       /* Save rest of interrupt context and enter RTOS. */
        call0   XT_RTOS_INT_ENTER               /* common RTOS interrupt entry */
    
        /* !! We are now on the RTOS system stack !! */ 
    
        /* Set up PS for C, enable interrupts above this level and clear EXCM. */
        #ifdef __XTENSA_CALL0_ABI__
        movi    a0, PS_INTLEVEL(1) | PS_UM
        #else 
        movi    a0, PS_INTLEVEL(1) | PS_UM | PS_WOE
        #endif
        wsr     a0, PS
        rsync
    
        /* OK to call C code at this point, dispatch user ISRs */
    
        dispatch_c_isr 1 XCHAL_INTLEVEL1_MASK
    
        /* Done handling interrupts, transfer control to OS */
        call0   XT_RTOS_INT_EXIT                /* does not return directly here */

     

    На голом железе обработчик намного быстрее и понятнее )))

    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
          
    	rsr.exccause	a2
    	beqi		a2,EXCCAUSE_LEVEL1,IntLevel1
    	
    	j		. 	//catch rest interrupts
    
    	.align 4
    
    IntLevel1:
    	movi		a2,INTC_VECTOR
    	memw
    	l32i		a2,a2,0
    	l32i		a2,a2,0
    	callx0		a2
          
    	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

     

  22. 33 minutes ago, sasamy said:

    похоже что в freertos обработка прерываний корректно работает без барьера. Написал тестовый драйвер для Linux msgbox и проверил прерывания - соединил два gpio, один на выход с меандром а второй на вход прерываний, число пульсов совпадает с числом прерываний

    Очевидно, роль барьера взял на себя вот этот фрагмент кода:

    33 minutes ago, sasamy said:
    val = read32(SUNXI_R_INTC_PBASE + INTC_PENDING1);
    	write32(SUNXI_R_INTC_PBASE + INTC_PENDING1, val);

    Проверил.  Действительно, если сделать чтение-запись регистра GPIO раньше, чем чтение-запись  INTC, то работает нормально.  И барьер не нужен:

    void GPIOC_Handler(void)
    {
     u32 val;
    
     UART_putc('c');
    
     val=PC_EINT_STATUS;
     PC_EINT_STATUS=val;
    
     val=pintc_regs->pending1;
     pintc_regs->pending1=val;
    }

    Так тоже работает нормально без барьера:

    void GPIOC_Handler(void)
    {
     UART_putc('c');
    
     PC_EINT_STATUS=PC_EINT_STATUS;
     pintc_regs->pending1=pintc_regs->pending1;
    }

    А вот так уже не работает нормально - без барьера будет второй заход в прерывание:

    void GPIOC_Handler(void)
    {
     UART_putc('c');
    
    //buggy...
     pintc_regs->pending1=pintc_regs->pending1;
     PC_EINT_STATUS=PC_EINT_STATUS;
    }

     

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

  24. 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?

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

     

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