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

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

On 10/2/2023 at 1:59 PM, repstosw said:

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

я имел ввиду налету переключается через параметры gcc -mabi=call0, по умолчнию в конфиге из оверлея windowed - оверлей я не трогал

On 10/2/2023 at 1:59 PM, repstosw said:

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

конечно, .ct-ng menuconfig

Paths and misc options  --->

(${HOME}/src) Local tarballs directory

[*]   Save new tarballs

 

Я сразу взял их конфиг от одноядерного варианта

./ct-ng xtensa-esp32s2-elf

через меню поменял Tuple's vendor string и оверлей указал от нашего процессора. Собрал полученным кросскомпилятором freertos -  она работает но Linux падает по неизвестной причине, не стал разбираться, со старым компилятором не было такого

On 10/2/2023 at 1:59 PM, repstosw said:

Есть ли способ собрать crosstool-ng в винде с помощью minGW32 ? 

наверно есть но мне это без надобности поэтому не пробовал. Прикрепил конфиг с которым собирал

 

t113_espressif.config

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

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


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

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, либо что-то пошло не так...

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

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


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

Очень странный 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:
 

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

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


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

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.

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


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

On 10/2/2023 at 5:40 PM, repstosw said:

Удалось построить xtensa-esp32s3-elf

 

On 10/2/2023 at 5:40 PM, repstosw said:

Во-1, без включения сопроцессора,  любая fpu-инструкция приводит к исключению 0 "Illegal Instruction". 

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

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


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

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.

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

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


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

On 10/3/2023 at 11:18 AM, repstosw said:

Нету внятной доки именно на ядро HiFi4.

HIFI4 это маркетинговое название расширений DSP для работы со звуком, ядро LX7, причём у esp32 нет этого расширения.

On 10/3/2023 at 11:18 AM, repstosw said:

Так что может что-то и урезали.

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

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


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

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, то тоже.

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

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


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

On 10/3/2023 at 2:59 PM, repstosw said:

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

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

https://github.com/thesofproject/xtensa-overlay

они все очень похожи на t113 и не похожи на esp32  - у них даже регистры fpu не описаны.

On 10/3/2023 at 2:59 PM, repstosw said:

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

freertos так и линкуется

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


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

1 hour ago, repstosw said:

размер бинарника вырастет

Считаю это не имеющим значения в нашем случае. Грузит его хост, у которого скажем так не большие ограничения. А расходовать dsp iram чтобы средствами dsp копировать в dsp dram это слегка того... мягко говоря оверинжениринг.

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


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

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

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


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

2 minutes ago, repstosw said:

требует путь к тулчейну

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

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

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


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

8 hours ago, GenaSPB said:

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

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

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

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

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

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

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

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

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

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

Не мой путь.

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

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


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

В обработчиках прерываний, кроме сохранения-восстановления регистров a0 .. a15, нужно также сохранять-восстанавливать вот эти регистры: lbeg, lend, lcount, sar, acclo, acchi, m0 .. m3 .

Пока их не добавил, прерывания нарушали работу  софтового кодека для сжатия-разжатия звука.

Для полного счастья ещё  надо добавить регистры: aed0 .. aed15 .  В ассемблерном листинге моей программы они тоже встречаются, но я пока не нашёл ассемблерных инструкций для load/store этих регистров.

 

А какие регистры сохраняет FreeRTOS в обработчиках прерываний для HiFi4 DSP?

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

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


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

On 10/6/2023 at 11:32 AM, repstosw said:

А какие регистры сохраняет FreeRTOS в обработчиках прерываний для HiFi4 DSP?

https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/blob/164696d952116d20100daefd7a475d2ede828eb0/kernel/portable/xtensa_context.S#L61

On 10/6/2023 at 11:32 AM, repstosw said:

acclo, acchi, m0 .. m3

для этих есть отдельный макрос, в коде не видел чтобы он использовался

https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/blob/164696d952116d20100daefd7a475d2ede828eb0/kernel/portable/xtos-internal.h#L157

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


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

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

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

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

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

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

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

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

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

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