sasamy 0 30 сентября, 2023 Опубликовано 30 сентября, 2023 (изменено) · Жалоба On 9/17/2023 at 6:50 PM, repstosw said: Сделал архив с сорцами, всё что касается INTC On 9/17/2023 at 6:50 PM, repstosw said: В общем этот китаец взял описание регистров R_INTC из Tina Linux T113-s3 а можно куда-нибуть скинуть весь SDK ? то что я видел на гитхабе - там нет этого, возможно и xcc там есть и лицензия. Я так понял инструментарий (компилятор) для кастомных инструкций TIE генерируется средой разработки - какие расширения заложили в ядро xtensa только allwinner знает, они и должны дать оптимизированный компилятор, а китаец ещё и сторонние бинарнные библиотеки и конфиг (оверлей) откуда то взял - явно не из астрала Изменено 30 сентября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 30 сентября, 2023 Опубликовано 30 сентября, 2023 (изменено) · Жалоба 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. Изменено 30 сентября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 30 сентября, 2023 Опубликовано 30 сентября, 2023 (изменено) · Жалоба On 9/30/2023 at 10:01 AM, repstosw said: легко сетапится на ABI=call0 только неизвестно поддерживает ли xcc этот abi иначе затея с bare metal для него обречена тормозить On 9/30/2023 at 10:01 AM, repstosw said: Кроме того, libc, которую собрал китаец японец - НЕ поддерживает printf с %f и %x. в freertos используются сторонние бинарные либы, это видно из map файла и из выхлопа printf printf("DSP uart\n"); printf("hex 0x%x, float %lf\n", 1024, 3.14159); Quote DSP uart hex 0x400, float 3.141590 On 9/30/2023 at 10:01 AM, repstosw said: Как я понял, FreeRTOS не умеет во вложенные прерывания для меня совсем не интересно - вся периферия работает в Linux, на freertos скидывать есть смысл только задачи требующие реалтайма - максимум пара прерываний от INTC и вложенность тут вообще непонятно для чего Изменено 30 сентября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 30 сентября, 2023 Опубликовано 30 сентября, 2023 (изменено) · Жалоба 17 hours ago, sasamy said: а можно куда-нибуть скинуть весь SDK ? В сжатом виде он занимает около 12 ГБ. Слишком большой объём. Я не буду столько закачивать и ждать. 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-мя ядрами 😃 Изменено 30 сентября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба On 10/1/2023 at 2:34 AM, repstosw said: Чего? 🙂 На счёт поддерживает или нет - легко убедиться, взглянув в ассемблерный листинг с программы. Речь про XCC - оптимизирующий компилятор cadence, в crosstool-ng собирается версия от сообщества поддерживающая только core isa, есть какие-то работы в clang, помоему там даже поддержка TIE в форке espressif есть, но я не уверен что там всё радужно On 10/1/2023 at 2:34 AM, repstosw said: А вложенность и приоритеты мне нужны, чтобы не потерять пакеты в потоковом режиме, которые принимает приёмник на Si4463 вот эти пакеты и принимать на DSP и будет у него единственное прерывание, результат складывать в буфер и отдавать Linux On 10/1/2023 at 2:34 AM, repstosw said: при этом есть ещё дополнительные три прерывания: камера, дисплей и аудио-DMA 🙂 для них никакого реалтайма не требуется - прекрасно работают в gpos Linux параллельно с DSP. Если так нужны приоритетные прерывания - в ISR только отпендить и отключить источник прерывания и запустить задачу с обработчиком с нужным приоритетом а дальше проблема планировщика кто кого вытеснит в соответствии с его приоритетом On 10/1/2023 at 2:34 AM, repstosw said: Ещё не совсем понятно, как у данного тулчейна как строится работа с floating point. Я перемножаю два числа и результат вывожу printf. В ассемблерном листинге я вижу вызовы функций типа mulf_ , formatf_. А должны быть ассемблерные вкрапления инструкций. Из-за этого я был вынужден перевести компиляцию библиотек libspeexdsp и libcelt в режим fixed point. наверно как и в Linux https://ru.wikipedia.org/wiki/Math.h#libm не уверен что комьюнити версия поддерживает floating-point сопроцессор, в freertos сторонняя библиотека libm.a и возможно поддерживает - надо проверять On 10/1/2023 at 2:34 AM, repstosw said: Из всего увиденного и испытанного я сделал вывод, что вычислительная мощь HiFi DSP явно проигрывает основному ядру Cortex A7. В разы. Скажем так - в 3..4 раза. вывод: если в автомобиль не заливать бензин (SIMD и VLIW) а тащить собачкой (core ISA) он не может обогнать даже велосипедиста! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба 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. Дело не в синусах-косинусах. Простое умножение двух чисел: арифметические выражения должны инлайниться ассемблерными инструкциями, а не вызовами функций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба Про инлайн- обычной спрсоб в виде -fno-errno или какой-то такой флаг помогает? На cortex это обычное дело Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 октября, 2023 Опубликовано 1 октября, 2023 (изменено) · Жалоба 1 hour ago, GenaSPB said: Про инлайн- обычной спрсоб в виде -fno-errno или какой-то такой флаг помогает? На cortex это обычное дело Использую эти : -fno-math-errno -ffast-math. Вызовы остаются Изменено 1 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 1 октября, 2023 Опубликовано 1 октября, 2023 · Жалоба Да я про них... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 октября, 2023 Опубликовано 2 октября, 2023 · Жалоба 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 становилось ассемблерными инструкциями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 октября, 2023 Опубликовано 2 октября, 2023 (изменено) · Жалоба Оверлей, предоставленный японцем, не поддерживает 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. Изменено 2 октября, 2023 пользователем haker_fox Длинный код спрятал под спойлер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 2 октября, 2023 Опубликовано 2 октября, 2023 (изменено) · Жалоба On 10/2/2023 at 6:22 AM, repstosw said: Но инструкции FPU - они просто ОБЯЗАНЫ быть! это большой хз, смотрю оверлей xtensa-config-overlay.tar.gz (не сконвертированыый который), config/core.h Quote #define XCHAL_HAVE_USER_DPFPU 0 /* user DP floating-point pkg */ #define XCHAL_HAVE_USER_SPFPU 1 /* user SP floating-point pkg */ #define XCHAL_HAVE_FP 1 /* single prec floating point */ #define XCHAL_HAVE_FP_DIV 1 /* FP with DIV instructions */ #define XCHAL_HAVE_FP_RECIP 1 /* FP with RECIP instructions */ #define XCHAL_HAVE_FP_SQRT 1 /* FP with SQRT instructions */ #define XCHAL_HAVE_FP_RSQRT 1 /* FP with RSQRT instructions */ смотрю конфиг binutils/xtensa-config.h Quote #undef XCHAL_HAVE_FP #define XCHAL_HAVE_FP 0 #undef XCHAL_HAVE_FP_DIV #define XCHAL_HAVE_FP_DIV 0 в gcc/xtensa-config.h то же что в binutils - FPU отключен, похоже на какой-то самодел, чему тут верить непонятно. Посмотрел оверлеи espressif - там такого противоречия нет https://github.com/espressif/xtensa-overlays xtensa_esp32s2 - одноядерный lx7 без fpu xtensa_esp32s3 - двухядерный lx7 + fpu Изменено 2 октября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 октября, 2023 Опубликовано 2 октября, 2023 (изменено) · Жалоба 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 🙂 Изменено 2 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 2 октября, 2023 Опубликовано 2 октября, 2023 (изменено) · Жалоба On 10/2/2023 at 9:48 AM, repstosw said: Результаты впечатлили: кроме floating point он ещё может переключать ABI. у espressif есть свой форк crosstool-ng - кроме прочего (свои форки gcc, binutils) там есть поддержка вплоть до gcc 13 https://github.com/espressif/crosstool-NG/tree/esp-1.25.x я им собирал с оверлеем китайца видел что abi переключается но fpu не взлетел и я подумал что gcc настолько убог и не поддерживает - не ожидал что такая подстава в оверлее, всегда смотрел только core-isa а там всё есть и адреса совпадают, так похоже на правду было. UPD интересно но похоже не самодел а штатный сгенерированный оверлей, посмотрел для imx оверлеи, там тоже самое - в core-isa есть FPU а в конфигах утилит нет https://github.com/thesofproject/xtensa-overlay похоже espressif дальше других продвинулись в разработке Изменено 2 октября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 октября, 2023 Опубликовано 2 октября, 2023 · Жалоба 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 не реагирует. Только из розетки выключать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться