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

repstosw

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

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

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

    2

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


  1. 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 - облом.

    Куда копать дальше?

    image.thumb.png.9012ae8bf714e3274873635aef2ad83c.png

  2. 48 minutes ago, dimka76 said:

    Где вы взяли эту картинку ?

    C даташита на  STM32.

    48 minutes ago, dimka76 said:

    И судя по ней, данные на выходе удерживаются также в течении одного такта, как и для SRAM.

    Главное, что эти данные на выходе удерживаются в моих устройствах столько тактов, сколько нужно. И всё работает. И битовое поле в регистре есть соответствующее для записи числа тактов.

     

  3. У японца в его тулчейне тоже нет libnosys : https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/releases/tag/Toolchains :biggrin:

    Конфиг использовал такой:

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

  4. 1 hour ago, sasamy said:

    непонятно - вы не в crosstool-ng собираете тулзы ? libnosys.a собирается из коробки

    tools/xtensa-t113-elf/xtensa-t113-elf/lib/libnosys.a

    У меня нету там libnosys.a.  Собралось без него. Вот что собралось:

    image.thumb.png.fec535a6902829fce143bae6f874fa38.pngimage.png.1d4092368785176d9c6f138a8f138e64.png

     

    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 не собирает как надо?  Нет никакого "просто из коробки".

    image.thumb.png.6c46b7d7b8ebb9f61e7b7c79bdc2ba67.png

  5. 4 minutes ago, Arlleex said:

    Почему нельзя просто в отдельный сишник retarget.c запихнуть эти функции и не заморачиваться с библиотекой?

    Потом, ИМХО, сами споткнетесь об эту библиотеку))

    Потому что поставлена цель формализовать библиотеки.  Раз стандарт предусматривает хранение заглушек в libnosys, значит ему надо следовать. А не плодить сторонние библиотеки с аналогичным содержанием.

    Как я писал выше, ранее написал свои заглушки, которые были в startup_c.c.

  6. Подключил к своим проектам библиотеку libnosys.a

    Она позволяет не писать самому те самые функции, которые не находятся при линковке:

    Spoiler
    void *_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 всё остальное

    Иначе, будут ошибки.

     

     

  7. 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. :biggrin: JTAG пользовал в далёком 2008 году от Segger. Часто глючил и отваливался. Не понравилось.

    Если что-то надо отладить в реальном времени, то использую IAR и его C-RUN.   CRUN выводит код ошибки(опять же - через UART 🙂 ), по нему нахожу строку кода где произошла ошибка. Для memory-corrupt'ы всякие этого хватает. Что-то наподобие, как asan и ubsan  в Линуксе.

    ГДБ от ГНУ как-то не смог запустить.

  8. 39 minutes ago, sasamy said:

    это какой-то специфичный кодек для распечатывания звуков - printf ему зачем ?

    Рука-лицо...  честное слово!  "Если звёзды зажигают - значит это кому-то нужно!"

    Для отладки!

  9. 2 minutes ago, mantech said:

    флоат - да, дабл - нет, т.к. не представляю, где его использовать)))

    Там, где нужна точность больше, чем 6 знаков после запятой 🙂

    Например, в эмуляторах звуковых чипов.

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

    double даёт точность больше: 15 знаков после запятой

  10. 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;
    }

     

  11. 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

  12. 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 не приводили к зависаниям, а программисту - не переправлять тонны исходников.

  13. Сделал замену функции 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

     

  14. 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

    image.thumb.png.63e3a1e2dd3353b28c946f78bc9689bd.png

    И всё-же - как это переварить С ? Интересно...🤣

  15. 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 байт).

  16. 12 minutes ago, Arlleex said:

    В прототипах функций что в Си, что в C++ могут отсутствовать имена параметров, компилятору они не нужны.

    В моём случае это не прототипы.  А функции с телами.  Надо попробовать -std=gnu99.

     

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

  17. Собрал наконец-то самостоятельно полностью 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

    Компилятору не понравилось, что параметру функции не задали имя, а указали всего-лишь его тип.  И там таких ошибок много.

    image.thumb.png.b23053fbdcf12e4c8da41b2e3e7ecccc.png

    Непонятно, как эти треды затесались в билд, при построении использовал флаг - без тредов(об этом ниже) .

    И не понятно как они С-компилятор заставили это компилить.  Какой ключ у Си есть чтобы это компилировать без ошибки?

     

     Пришлось скомпилировать этот исходник С++, который переваривает параметры без имён, не забыв добавить в начало:

    #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. А мульти-байты напротив - не нужны.

    В итоге вылепил - конфету. :biggrin: Чему я собственно и рад! :sun_bespectacled:

     

    P.S.  Ещё попутно нарвался на то, что если обработчик прерывания написан на С++, а используется в сишном или ассемблерном сорце,  то используется дефолтный обработчик -функция с атрибутом weak.  Тоесть - другой обработчик, который пустой )))   Добавил к С++ функции обработчика exten "C" и оно заработало как надо по вполне очевидным причинам (манглирование имён в С++).

  18. Воистину кривой MSYS под винду, который на базе MinGW !

    Сделал Makefile в Линуксе - вообще без проблем. Просто  перекинул тулчейн через PATH и всё.  Собрал в Линуксе. Собралось довольно быстро.

    Ради эксперимента попробовал собрать в Винде - MSYS нормально обработал Makefile. Построение библиотеки также успешно.  Только медленее раза в 4. 

    Ну и собственно вопрос - неужели так сложно в винде проэмулировать все особенности Линукса, чтобы родить мэйк-файл для сторонней платформы? 

    Выходит, MSYS намертво прибит гвоздями к MinGW и винде.

    P.S. Мне всёравно где собирать библиотеку под таргет, отличный от ПК:  тулчейны одинаковые - что в винде, что в Линуксе: скомпиленные статические либы понимают :)

  19. Не могу сообразить, как построить 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 который не для винды, а для указанного тулчейна?

  20. Для ясности картины поясню:

    Либа 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"))) тоже не работает.

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

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

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

     

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

  22. 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

    С виду - эффективные. Попробую - результат напишу

  23. 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

     

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