-
Постов
2 582 -
Зарегистрирован
-
Победитель дней
2
Сообщения, опубликованные repstosw
-
-
3 hours ago, sasamy said:
Решил написать как самому собрать кросскомпилятор для xtensa применительно к t113.
В принципе я всё так и делал, за исключением того, что брал конфиг японца, а не штатный ESP32.
Удалось построить тулчейн для Линукса.
Но с виндой проблемы - не линкуется ZLIB для Host.
И штатный путь для ZLIB - обламывается. Сделал так:
Source of ZLIB: Vendor/Custom repository VCS: Git https://github.com/madler/zlib.git ZlibPatches: none Version of zlib: newer than anything below
Для Build такое проходит, но для Host - облом.
Куда копать дальше?
-
48 minutes ago, dimka76 said:
Где вы взяли эту картинку ?
C даташита на STM32.
48 minutes ago, dimka76 said:И судя по ней, данные на выходе удерживаются также в течении одного такта, как и для SRAM.
Главное, что эти данные на выходе удерживаются в моих устройствах столько тактов, сколько нужно. И всё работает. И битовое поле в регистре есть соответствующее для записи числа тактов.
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
У японца в его тулчейне тоже нет libnosys : https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/releases/tag/Toolchains
Конфиг использовал такой:
CT_CONFIG_VERSION="3" CT_ARCH_XTENSA=y CT_XTENSA_CUSTOM=y CT_OVERLAY_NAME="hifi4" CT_OVERLAY_LOCATION="/home/tux" CT_TARGET_VENDOR="hifi4" CT_NEWLIB_SRC_DEVEL=y CT_NEWLIB_DEVEL_URL="https://github.com/espressif/newlib-esp32/" CT_GCC_V_10=y CT_CC_LANG_CXX=y CT_LIBC_NEWLIB_DISABLE_SUPPLIED_SYSCALLS=y CT_CANADIAN=y CT_TOOLCHAIN_TYPE="canadian" CT_BUILD="" CT_HOST="x86_64-w64-mingw32"
Опции для newlib использовал такие:
./configure \ --with-newlib \ --enable-newlib-reent-small \ --enable-newlib-nano-formatted-io \ --enable-target-optspace \ --disable-newlib-supplied-syscalls \ --disable-newlib-io-pos-args \ --disable-newlib-io-c99-formats \ --disable-newlib-io-long-long \ --disable-newlib-io-long-double \ --disable-newlib-io-float \ --disable-multilib \ --disable-newlib-multithread \ --disable-newlib-reent-check-verify \ --disable-newlib-mb \ --disable-newlib-register-fini \ --disable-newlib-wide-orient \ --disable-newlib-fvwrite-in-streamio \ --disable-newlib-fseek-optimization \ --disable-newlib-unbuf-stream-opt \ --disable-newlib-atexit-dynamic-alloc \ --disable-option-checking \ --program-transform-name="s&^&xtensa-hifi4-elf-&" \ --with-target-subdir=xtensa-hifi4-elf \ --target=xtensa-hifi4-elf
8 minutes ago, sasamy said:нет, там как раз 13 есть. Конфиг я китайский больше не использую - беру их, у них опции с понимаем включены и исходники из форков для xtensa, но оверлей указываю от т113. Попробую собрать для венды и написать пошагово.
С ABI call0 ?
12 minutes ago, sasamy said:я то смотрел, вы удивляйтесь
libc_nano.a тоже нет
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
1 hour ago, sasamy said:непонятно - вы не в crosstool-ng собираете тулзы ? libnosys.a собирается из коробки
tools/xtensa-t113-elf/xtensa-t113-elf/lib/libnosys.a
У меня нету там libnosys.a. Собралось без него. Вот что собралось:
1 hour ago, sasamy said:в тойже директории есть файл nosys.specs - его надо указывать компилятору(линкеру) если собираете для бареметала через параметр
--specs=nosys.specs
1 hour ago, sasamy said:-lnosys не надо вручную указывать
Без разницы. Хоть через --specs, или указание библиотеки. Вы во внутрь nosys.specs смотрели? Посмотрите. Будете удивлены.
On 10/2/2023 at 9:41 PM, sasamy said:On 10/2/2023 at 8:59 PM, repstosw said:Есть ли способ заставить ct-ng не качать и устанавливать каждый раз всё барахло, а сохранять и устанавливать на локальной машине?
конечно, .ct-ng menuconfig
Paths and misc options --->
(${HOME}/src) Local tarballs directory
[*] Save new tarballs
У меня оно стоит по умолчанию. Тем не менее, после неудачного билда - всёравно лезет в репозитории, качает, накладывает патчи, запускает, устанавливает...
On 10/2/2023 at 5:15 PM, sasamy said:у espressif есть свой форк crosstool-ng - кроме прочего (свои форки gcc, binutils) там есть поддержка вплоть до gcc 13
https://github.com/espressif/crosstool-NG/tree/esp-1.25.x
я им собирал с оверлеем китайца видел что abi переключается но fpu не взлетел и я подумал что gcc настолько убог и не поддерживает - не ожидал что такая подстава в оверлее, всегда смотрел только core-isa а там всё есть и адреса совпадают, так похоже на правду было.
Там только GCC 11.
Не собирает этот тулчейн.
Были проблемы с ZLIB и LIBGMP.
Пришлось ручками репозитории вписывать в menuconfig.
На сайт GMPLIB даже не заходит: https://gmplib.org/. Пришлось находить зеркала на гитхабе и ещё не каждый пропатчится.
С вот этого https://github.com/madler/zlib.git ct-ng не может взять zlib 1.2.13. Может из-за провайдера, может из-за блокировки в РФ или из-за РФ, в общем ХЗ.
Старый ct-ng работает без проблем , пути к либам там другие и версии либ другие. Тупо оттуда взять не получится.
Взял эти:
https://github.com/intel/zlib
https://github.com/sethtroisi/libgmpВсёравно - облом! Почему новый ct-ng не собирает как надо? Нет никакого "просто из коробки".
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
4 minutes ago, Arlleex said:Почему нельзя просто в отдельный сишник retarget.c запихнуть эти функции и не заморачиваться с библиотекой?
Потом, ИМХО, сами споткнетесь об эту библиотеку))
Потому что поставлена цель формализовать библиотеки. Раз стандарт предусматривает хранение заглушек в libnosys, значит ему надо следовать. А не плодить сторонние библиотеки с аналогичным содержанием.
Как я писал выше, ранее написал свои заглушки, которые были в startup_c.c.
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
Подключил к своим проектам библиотеку libnosys.a
Она позволяет не писать самому те самые функции, которые не находятся при линковке:
Spoilervoid *_sbrk(int incr) { static char *heap_end=NULL; char *prev_heap_end; if(!heap_end)heap_end=&__heap_start; prev_heap_end=heap_end; heap_end+=incr; if(heap_end<(&__heap_end))return (void*)prev_heap_end; errno=ENOMEM; return (void*)-1; } void *_sbrk_r(struct _reent *ptr,ptrdiff_t incr) { char *ret; errno=0; if((ret=(char*)(_sbrk(incr)))==(void*)-1&&errno!=0)ptr->_errno=errno; return ret; } struct _reent *__getreent(void) { static struct _reent REENT; return &REENT; } void _exit(void) { printf("_exit\n"); } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wreturn-type" 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) { UART_puts("_fstat_r\n"); } _off_t _lseek_r(struct _reent *r,int a,_off_t o,int b) { UART_puts("_lseek_r\n"); } _ssize_t _read_r(struct _reent *r,int a,void *p,size_t s) { UART_puts("_read_r\n"); } _ssize_t _write_r(struct _reent *r,int a,const void *p,size_t s) { UART_puts("_write_r\n"); } int _close_r(struct _reent *r,int a) { UART_puts("_close_r\n"); } #pragma GCC diagnostic pop
Библиотеку собирал вместе с newlib: https://github.com/espressif/newlib-esp32/tree/esp_based_on_4_1_0/libgloss/libnosys
Правда пришлось этот libnosys обработать напильником, потому что при линковке выдаются искуственные противные ворнинги, сообщающие о заглушках:
warning: _fstat_r is not implemented and will always fail
Для этого пришлось изменить макрос stub_warning(name), превратив его в ничто: https://github.com/espressif/newlib-esp32/blob/esp_based_on_4_1_0/libgloss/libnosys/warning.h#L40
Правильная последовательность библиотек при сборке (смешанный проект: C++ / C / ASM )
-lstdc++ -lc -lnosys -l всё остальное
Иначе, будут ошибки.
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
33 minutes ago, sasamy said:для отладки нельзя собирать проект с либой которая на 61 кб больше чем релизная и в ней есть нужный printf ? у процессора же 128 мегабайт DDR - мне показалось должно хватить
В принципе можно. Но мне не нравится таскать разные либы с одним проектом.
Свои проекты разделяю на: мини-проекты - которые помещаются полностью в IRAM/DRAM DSP. И биг-проекты: для DDR.
Остановился на nano-printf, ссылку оставил выше. Там можно перекидывать дефайны, урезая printf, уменьшая размер либы.
Больше всего мне нравится как сделано в arm-none-eabi: там ключём линковщика можно выставить поддержку float printf если надо. А в newlib-esp32 всё жестко и консервативно: хедеры от IBM. А всё что от ПК - оно монструозное 🙂
39 minutes ago, GenaSPB said:Некоторые индивидуумы без jtag не представляют себе отладку (я jtag в массе изделий и не вывожу).
Тогда я индивидуум-противоположность. Отлаживаю методом бинарного отсечения + printf. JTAG пользовал в далёком 2008 году от Segger. Часто глючил и отваливался. Не понравилось.
Если что-то надо отладить в реальном времени, то использую IAR и его C-RUN. CRUN выводит код ошибки(опять же - через UART 🙂 ), по нему нахожу строку кода где произошла ошибка. Для memory-corrupt'ы всякие этого хватает. Что-то наподобие, как asan и ubsan в Линуксе.
ГДБ от ГНУ как-то не смог запустить.
-
39 minutes ago, sasamy said:
это какой-то специфичный кодек для распечатывания звуков - printf ему зачем ?
Рука-лицо... честное слово! "Если звёзды зажигают - значит это кому-то нужно!"
Для отладки!
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
2 minutes ago, mantech said:флоат - да, дабл - нет, т.к. не представляю, где его использовать)))
Там, где нужна точность больше, чем 6 знаков после запятой 🙂
Например, в эмуляторах звуковых чипов.
У float набегает сильно большая погрешность со временем, что сказывается на точности эмуляции (просчёт звуковых волн).
double даёт точность больше: 15 знаков после запятой
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
1 hour ago, mantech said:Честно говоря уже с незапамятных времен использую собственный printf, он гораздо компактнее, да и чтоб не зависеть от различных его реализаций и от этого тем более...
Ваша реализация printf поддерживает вывод float, double, long long ?
Что даст вот этот тест? :
long double x=2.01234567890123456789012345678901234567890123456789; double y=2.01234567890123456789012345678901234567890123456789; float z=2.01234567890123456789012345678901234567890123456789; printf("%1.50Lf\n",x); printf("%1.50lf\n",y); printf("%1.50f\n\n",z); unsigned long long temp=0x123456789ABCDEF0; printf("temp=0x%llX\n",temp);
В общем этот newlib жрёт 61 кБ при упоминании хотя бы одного printf или sprintf. Огорчило. Там делается куча ненужных вещей для embeded.
Нужен printf понимающий float и long long и занимающий мало места.
Испытал вот этот НАНО-принтф: https://github.com/charlesnicholson/nanoprintf
Работает, но double не понимает:
2.01234579000000000000000000000000000000000000000000 2.01234579000000000000000000000000000000000000000000 2.01234579000000000000000000000000000000000000000000 temp=0x123456789ABCDEF0
Обёртка для стандартного printf:
void nputc(int c,void *ctx) { (void)ctx; if(c=='\n')UART_putc('\r'); else UART_putc(c); } int printf(char const *format,...) { va_list val; va_start(val,format); int rv=npf_vpprintf(&nputc,NULL,format,val); va_end(val); return rv; }
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
31 minutes ago, repstosw said:Чем он лучше, чем vsprintf ? Более стандартизирован возвращаемому значению числа выведенных символов не включая \0 ?
Да. Лучше. Стандартизировано возвращаемое значение. И безопаснее. Позволяет заранее узнать размер строки и выделить динамически память под строку.
Так как использую GCC с разрешением VLA, то вместо malloc/free можно использовать VLA.
Код printf теперь такой:
int printf(const char *format,...) { va_list args; va_start(args,format); size_t n=vsnprintf(NULL,0,format,args)+1; //+1 for the '\0' char buf[n]; int r=vsnprintf(buf,n,format,args); va_end(args); UART_puts(buf); return r; }
Помогло понять вот это:
https://stackoverflow.com/questions/7315936/which-of-sprintf-snprintf-is-more-secure
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
1 hour ago, GenaSPB said:Возвращаемся значение что у printf, что у vsprintf одинаковый смысл имеют.
Здесь почему-то сказано, что vsprintf возвращает число символов включая завершающий ноль:
https://vsokovikov.narod.ru/New_MSDN_API/Add_func_runtime_C/fn_vsprintf.htm
QuoteФункции vsprintf and vswprintf возвращают число записанных символов, включая символ завершающего нуля, или отрицательное значение, если происходит ошибка при выводе.
Хотя другие источники говорят, что без завершающего.
1 hour ago, GenaSPB said:Зы: откройте для себя vsnprintf
Чем он лучше, чем vsprintf ? Более стандартизирован возвращаемому значению числа выведенных символов не включая \0 ?
1 hour ago, GenaSPB said:Кстати в стандарте говорится о том что эффект от переопределения у себя функций стандартный библиотеки может вам удивить...
Перекомпилировал все проекты, где есть много вызовов printf в разных файлах. Подвоха не заметил.
И почему сделан упор на "стандартную" библиотеку? В чём её стандартность заключается? Она никуда не прибита намертво, и она пересобирается. Так что не знаю на счёт стандартности, по мне - обычная библиотека, как и все другие.
1 hour ago, GenaSPB said:Сделайте себе UART_printf и нет даже потенциальных проблем...
Вы предлагаете переправлять в нескольких десятках файлов чужих исходников printf на UART_printf ?
Переопределение printf как раз было задумано, чтобы вызовы printf не приводили к зависаниям, а программисту - не переправлять тонны исходников.
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
Сделал замену функции printf.
Ранее использовался вариадический макрос, что вызывало определённые неудобства: нужно было постоянно инклудить хедер с этим макросом в каждый файл, где используется printf.
Реализация printf:
void UART_putc(u8 c) { while(!(UART_LSR&(1<<6))); UART_THR=c; } void UART_puts(const char *s) { while(*s) { if(*s=='\n')UART_putc('\r'); UART_putc(*s++); } } #include <stdio.h> #include <stdarg.h> #include "UART.h" #define PRINTF_BUFFER_SIZE 256 static char printf_buffer[PRINTF_BUFFER_SIZE]; int puts(const char *s) { UART_puts(s); UART_putc('\r'); return '\n'; } int printf(const char *format,...) { memset(printf_buffer,0,PRINTF_BUFFER_SIZE); //? можно убрать va_list args; va_start(args,format); int r=vsprintf(printf_buffer,format,args)-1; //на 1 меньше, так как символ конца строки(=0) не считается в printf va_end(args); UART_puts(printf_buffer); return r; }
Дополнительно объявлена замена функции puts, потому что при сильной оптимизации компилятор вместо вывозва printf подсовывает puts - в случаях, когда указана просто одна строка:
printf("\nHiFi4 DSP...\n\n");
puts можно исключить, добавив флаг компиляции: -fno-builtin-printf.
Тупо замена функции _write( ), как это делается в STM'ах или ARM'ах - тут не прокатывает. Потому что newlib взята от самого IBM, а они любят усложнизмы. Там куча проверок на реентабельность и завязано всё на файловый ввод-вывод.
Тест:
printf("\nHiFi4 DSP...\n\n"); long double x=2.01234567890123456789012345678901234567890123456789; double y=2.01234567890123456789012345678901234567890123456789; float z=2.01234567890123456789012345678901234567890123456789; printf("%1.50Lf\n",x); printf("%1.50lf\n",y); printf("%1.50f\n\n",z); unsigned long long temp=0x123456789ABCDEF0; printf("temp=0x%llX\n",temp);
Выход:
HiFi4 DSP... 2.01234567890123461353368838899768888950347900390625 2.01234567890123461353368838899768888950347900390625 2.01234579086303710937500000000000000000000000000000 temp=0x123456789ABCDEF0
-
49 minutes ago, repstosw said:
В моём случае это не прототипы. А функции с телами. Надо попробовать -std=gnu99.
Не помогло.
make[3]: Entering directory `/c/newlib-esp32/xtensa-hifi4-elf/libgloss/libnosys' xtensa-hifi4-elf-cc -B/c/newlib-esp32/xtensa-hifi4-elf/newlib/ -isystem /c/newlib-esp32/xtensa-hifi4-elf/newlib/targ-include \ -isystem /c/newlib-esp32/newlib/libc/include -B/c/newlib-esp32/xtensa-hifi4-elf/libgloss/xtensa \ -L/c/newlib-esp32/xtensa-hifi4-elf/libgloss/libnosys -L/c/newlib-esp32/libgloss/xtensa \ -g -O2 -std=gnu99 -O2 -I. -I../../.././libgloss/libnosys/.. -c -g -O2 -std=gnu99 ../../.././libgloss/libnosys/pthread.c
И всё-же - как это переварить С ? Интересно...🤣
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
42 minutes ago, GenaSPB said:Про парамеиры плавучки. Раз это сопррцессор арму то походе должен формат с тем что арм ядрах
Сравнил со встроенными дефайнами тулчейна:
echo | %TOOLCHAIN%gcc -dM -E - > output.txt
#define __FLT32X_MANT_DIG__ 53 #define __FLT64_MANT_DIG__ 53 #define __FLT_MANT_DIG__ 24 #define __FLT32_MANT_DIG__ 24 #define __LDBL_MANT_DIG__ 53 #define __DBL_MANT_DIG__ 53 #define __SIZEOF_LONG_DOUBLE__ 8 #define __SIZEOF_DOUBLE__ 8
Вроде выбрал опции в ieeefp.h правильно.
Как я понял, чудес на этой архитектуре ждать не приходится : LONG DOUBLE = DOUBLE. У обоих мантисса 53 бита, а общая длина 64 бита(8 байт).
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
12 minutes ago, Arlleex said:В прототипах функций что в Си, что в C++ могут отсутствовать имена параметров, компилятору они не нужны.
В моём случае это не прототипы. А функции с телами. Надо попробовать -std=gnu99.
Про то, что в прототипах можно указывать типы без имён - знаю. Это вполне логично. Ну они могли бы пойти и дальше - разрешить указывать параметры без имен, если они не используются. Например если это заглушки. Хотя это будет нагрузка на стек. Или лишние присвоения регистров. Зависит от конвенции передачи параметров.
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
Собрал наконец-то самостоятельно полностью newlib для ABI=call0 с поддержкой printf с floating point. Очень было нужно.
За основу брал всё тот-же небезызвестный newlib-esp32, которой использовал японец при построении тулчейна с помощью crosstool-ng.
В винде не получилось сделать Makefile, потому что MSYS на базе MinGW не очень любит сторонние таргеты. И намертво прибитый гвоздями к окружению Винды и MinGW он не давал корректного мейкфайла для xtensa. Тема:
https://electronix.ru/forum/index.php?/topic/173554-configureautoconf-хост-win32-таргет-xtensa/
Пришлось всё сделать в Линуксе. Там всё оказалось намного проще.
Но есть две проблемы с исходниками.
Первая здесь: https://github.com/espressif/newlib-esp32/blob/esp_based_on_4_1_0/newlib/libc/include/ieeefp.h#L152
Вылетала ошибка, в итоге плюнул и жёстко задал такую конфигурацию:
#define LDBL_MANT_DIG 53 #define EXT_EXPBITS 11 #define EXT_FRACHBITS 20 #define EXT_FRACLBITS 32 #define __ieee_ext_field_type unsigned long
Не знаю, насколько она правильна для компилятора и архитектуры xtensa.
Вторая здесь: https://github.com/espressif/newlib-esp32/blob/esp_based_on_4_1_0/libgloss/libnosys/pthread.c#L30
Компилятору не понравилось, что параметру функции не задали имя, а указали всего-лишь его тип. И там таких ошибок много.
Непонятно, как эти треды затесались в билд, при построении использовал флаг - без тредов(об этом ниже) .
И не понятно как они С-компилятор заставили это компилить. Какой ключ у Си есть чтобы это компилировать без ошибки?
Пришлось скомпилировать этот исходник С++, который переваривает параметры без имён, не забыв добавить в начало:
#ifdef __cplusplus extern "C" { #endif
и в конец файла:
#ifdef __cplusplus } #endif
Иначе С++ создаст манглированные имена, которые не увидит С.
Флаги для конфигурации использовал такие:
./configure \ --with-newlib \ --enable-newlib-reent-small \ --enable-newlib-io-pos-args \ --enable-newlib-io-c99-formats \ --enable-newlib-io-long-long \ --enable-newlib-io-long-double \ --enable-newlib-io-float \ --disable-multilib \ --disable-newlib-multithread \ --disable-newlib-reent-check-verify \ --disable-newlib-supplied-syscalls \ --disable-newlib-nano-formatted-io \ --disable-newlib-mb \ --disable-newlib-atexit-dynamic-alloc \ --disable-option-checking \ --program-transform-name="s&^&xtensa-hifi4-elf-&" \ --with-target-subdir=xtensa-hifi4-elf \ --target=xtensa-hifi4-elf
Тоесть выкинул нафиг треды, проверку на повторное вхождение (мне оно не нужно). А НАНО-опции отключил, потому что с ними printf не печатает float. А мульти-байты напротив - не нужны.
В итоге вылепил - конфету. Чему я собственно и рад!
P.S. Ещё попутно нарвался на то, что если обработчик прерывания написан на С++, а используется в сишном или ассемблерном сорце, то используется дефолтный обработчик -функция с атрибутом weak. Тоесть - другой обработчик, который пустой ))) Добавил к С++ функции обработчика exten "C" и оно заработало как надо по вполне очевидным причинам (манглирование имён в С++).
-
Воистину кривой MSYS под винду, который на базе MinGW !
Сделал Makefile в Линуксе - вообще без проблем. Просто перекинул тулчейн через PATH и всё. Собрал в Линуксе. Собралось довольно быстро.
Ради эксперимента попробовал собрать в Винде - MSYS нормально обработал Makefile. Построение библиотеки также успешно. Только медленее раза в 4.
Ну и собственно вопрос - неужели так сложно в винде проэмулировать все особенности Линукса, чтобы родить мэйк-файл для сторонней платформы?
Выходит, MSYS намертво прибит гвоздями к MinGW и винде.
P.S. Мне всёравно где собирать библиотеку под таргет, отличный от ПК: тулчейны одинаковые - что в винде, что в Линуксе: скомпиленные статические либы понимают :)
-
Не могу сообразить, как построить newlib(libc, libm) для DSP ядра xtensa с помощью ./configure который лежит в MinGW для Win32.
Дано:
1) тулчейн DSP: xtensa-hifi4-elf - есть всё: компилятор, линковщик, утилита make...
2) Исходники библиотеки newlib для Cи. Makefile - нет, надо сгенерить с помощью ./configure.
Как под виндой это сделать? Проблема с правильным запуском configure, чтобы он правильно сделал make файл.
Я взял aotomake который лежит в MSYS от MinGW. Он упирается и не хочет видеть мой тулчейн под DSP.
Я уже и так сделал:
./configure --program-prefix=xtensa-hifi4-elf --build=xtensa-hifi4-elf \ --target=xtensa-hifi4-elf CC=xtensa-hifi4-elf-gcc AS=xtensa-hifi4-elf-as \ LD=xtensa-hifi4-elf-ld RANLIB=xtensa-hifi4-elf-ranlib READELF=xtensa-hifi4-elf-readelf\ --with-newlib --enable-multilib --disable-newlib-io-c99-formats --disable-newlib-supplied-syscalls\ --enable-newlib-nano-formatted-io --enable-newlib-reent-small --enable-target-optspace\ --program-transform-name=s&^&xtensa-hifi4-elf-& --disable-option-checking\ --with-target-subdir=xtensa-hifi4-elf --target=xtensa-hifi4-elf --prefix=
Тоесть явно прописал всё что касается моего тулчейна, однако выдаёт ошибку: can not make exe- executables.
При чём тут exe??? Явно указан другой тулчейн, а он мне виндовое подсовывает.
В общем вопрос такой - как в винде запустить ./configure который не для винды, а для указанного тулчейна?
-
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
Для ясности картины поясню:
Либа 1: libcelt. Она должна использовать свои функции из kiff_fft.c : kiss_fft() и kiss_fft_alloc().
Либа 2: libspeex. Она должна использовать свои функции из kiff_fft.c : kiss_fft() и kiss_fft_alloc().Так как внутренности kiss_fft() и kiss_fft_alloc() - разные. И использование только одного для этих двух либ - приводит к нерабочим вариантам (ключ --allow-multiple-definition)
Решение найдено. После построения библиотек, меняем в libspeex имена этой паре проблемных функций:
objcopy --redefine-sym kiss_fft=speex_kiss_fft --redefine-sym kiss_fft_alloc=speex_kiss_fft_alloc libspeexdsp.a
Всё!
Тоесть - меняем не все объекты через префикс (иначе задолбимся править хедеры, при компиляции основного проекта это вылезет!), а только те, на которые линковщик кричит, что они multiple.
Вместо Libspeex, поменять имена функций можно было у libcelt. Разницы нет.
Тот самый случай, когда должны работать оба варианта функций, но в пределах своей библиотеки.
P.S. Что есть статическая либа в C по сути? Это набор объектников. При линковке основной программы, ликовщику фиолетово на библиотеки и принадлежность - он просто подсовывает список объектников и всё. А там уже и обнаруживались пары функций с одинаковыми именами.
Варианты с ограничениями видимостей, как предлагали сделать в другом форуме - не работают.
И
__attribute__((visibility("hidden"))) тоже не работает.
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
❗В обработчиках прерываний, кроме сохранения-восстановления регистров a0 .. a15, нужно также сохранять-восстанавливать вот эти регистры: lbeg, lend, lcount, sar, acclo, acchi, m0 .. m3 .
Пока их не добавил, прерывания нарушали работу софтового кодека для сжатия-разжатия звука.
Для полного счастья ещё надо добавить регистры: aed0 .. aed15 . В ассемблерном листинге моей программы они тоже встречаются, но я пока не нашёл ассемблерных инструкций для load/store этих регистров.
А какие регистры сохраняет FreeRTOS в обработчиках прерываний для HiFi4 DSP?
-
12 hours ago, jcxz said:
namespace?
В C ?
6 hours ago, Arlleex said:Результат быстрогугления дает нечто такое
objcopy --redefine-sym old=new file
А хедеры ручками переправлять?
6 hours ago, Arlleex said:Как обычно, базовые проблемы систем сборки не решены за прошедшие 100 лет.
Не знаю...
Вот тут подсказали ещё пару решений: https://gamedev.ru/code/forum/?id=279603
С виду - эффективные. Попробую - результат напишу
-
Опубликовано · Изменено пользователем repstosw · Пожаловаться
1 hour ago, Forger said:о каком static идет речь?
Имелось в виду что они все в стоставе статической библиотеки. Не о ключевом слове "static" перед именами.
41 minutes ago, arhiv6 said:Но правильнее делать так: библиотеки собирается с ключом компилятора -fvisibility=hidden,
Обе библиотеки собираю с ключом -fvisibility=hidden, очевидно тулчейн игнорирует этот флаг.
Тулчейн: xtensa-hifi4-elf-... Это GCC, собранный с помощью crosstool-ng.
Полный набор опций сборки библиотек:
set TOOLCHAIN=xtensa-hifi4-elf- set OPTIONS=-Ofast -std=c99 -DNDEBUG -DHAVE_CONFIG_H -fmax-errors=1 -ffast-math -fno-math-errno -fno-exceptions -fno-unwind-tables \ -fno-asynchronous-unwind-tables -fomit-frame-pointer -ftree-vectorize -ffunction-sections -fdata-sections -fvisibility=hidden -Wall -Wextra del *.o del *.a :COMPILE %TOOLCHAIN%gcc %OPTIONS% -c bands.c %TOOLCHAIN%gcc %OPTIONS% -c celt.c %TOOLCHAIN%gcc %OPTIONS% -c cwrs.c %TOOLCHAIN%gcc %OPTIONS% -c entcode.c %TOOLCHAIN%gcc %OPTIONS% -c entdec.c %TOOLCHAIN%gcc %OPTIONS% -c entenc.c %TOOLCHAIN%gcc %OPTIONS% -c header.c %TOOLCHAIN%gcc %OPTIONS% -c kiss_fft.c %TOOLCHAIN%gcc %OPTIONS% -c laplace.c %TOOLCHAIN%gcc %OPTIONS% -c mathops.c %TOOLCHAIN%gcc %OPTIONS% -c mdct.c %TOOLCHAIN%gcc %OPTIONS% -c modes.c %TOOLCHAIN%gcc %OPTIONS% -c pitch.c %TOOLCHAIN%gcc %OPTIONS% -c plc.c %TOOLCHAIN%gcc %OPTIONS% -c quant_bands.c %TOOLCHAIN%gcc %OPTIONS% -c rangedec.c %TOOLCHAIN%gcc %OPTIONS% -c rangeenc.c %TOOLCHAIN%gcc %OPTIONS% -c rate.c %TOOLCHAIN%gcc %OPTIONS% -c vq.c :LIBRARY %TOOLCHAIN%ar qc libcelt.a ^ bands.o ^ celt.o ^ cwrs.o ^ entcode.o ^ entdec.o ^ entenc.o ^ header.o ^ kiss_fft.o ^ laplace.o ^ mathops.o ^ mdct.o ^ modes.o ^ pitch.o ^ plc.o ^ quant_bands.o ^ rangedec.o ^ rangeenc.o ^ rate.o ^ vq.o
STM32H743. Тайминги FMC
в STM
Опубликовано · Пожаловаться
Из того же самого.
Зачем некролог поднимаете?
Мне было достаточно этого: