repstosw 18 8 октября, 2023 Опубликовано 8 октября, 2023 (изменено) · Жалоба 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; } Изменено 8 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 8 октября, 2023 Опубликовано 8 октября, 2023 · Жалоба 3 минуты назад, repstosw сказал: аша реализация printf поддерживает вывод float, double, флоат - да, дабл - нет, т.к. не представляю, где его использовать))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 8 октября, 2023 Опубликовано 8 октября, 2023 (изменено) · Жалоба 2 minutes ago, mantech said: флоат - да, дабл - нет, т.к. не представляю, где его использовать))) Там, где нужна точность больше, чем 6 знаков после запятой 🙂 Например, в эмуляторах звуковых чипов. У float набегает сильно большая погрешность со временем, что сказывается на точности эмуляции (просчёт звуковых волн). double даёт точность больше: 15 знаков после запятой Изменено 8 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 8 октября, 2023 Опубликовано 8 октября, 2023 (изменено) · Жалоба On 10/8/2023 at 3:03 PM, repstosw said: Например, в эмуляторах звуковых чипов. это какой-то специфичный кодек для распечатывания звуков - printf ему зачем ? типа aalib https://en.wikipedia.org/wiki/AAlib Изменено 8 октября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 8 октября, 2023 Опубликовано 8 октября, 2023 · Жалоба 39 minutes ago, sasamy said: это какой-то специфичный кодек для распечатывания звуков - printf ему зачем ? Рука-лицо... честное слово! "Если звёзды зажигают - значит это кому-то нужно!" Для отладки! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 8 октября, 2023 Опубликовано 8 октября, 2023 · Жалоба 13 minutes ago, repstosw said: Для отладки! Некоторые индивидуумы без jtag не представляют себе отладку (я jtag в массе изделий и не вывожу). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 8 октября, 2023 Опубликовано 8 октября, 2023 · Жалоба On 10/8/2023 at 3:50 PM, repstosw said: Для отладки! я так и думал, а для отладки нельзя собирать проект с либой которая на 61 кб больше чем релизная и в ней есть нужный printf ? у процессора же 128 мегабайт DDR - мне показалось должно хватить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 8 октября, 2023 Опубликовано 8 октября, 2023 (изменено) · Жалоба 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 в Линуксе. ГДБ от ГНУ как-то не смог запустить. Изменено 8 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 8 октября, 2023 Опубликовано 8 октября, 2023 · Жалоба 1 час назад, repstosw сказал: Там, где нужна точность больше, чем 6 знаков после запятой 🙂 Я в курсе, просто мне не нужна такая точная плавучка.. 39 минут назад, GenaSPB сказал: (я jtag в массе изделий и не вывожу). Я тоже)) printf вполне хватает, ну и соображалка чтоб работала)))))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 9 октября, 2023 Опубликовано 9 октября, 2023 (изменено) · Жалоба Подключил к своим проектам библиотеку 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 всё остальное Иначе, будут ошибки. Изменено 9 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 9 октября, 2023 Опубликовано 9 октября, 2023 · Жалоба 32 минуты назад, repstosw сказал: Подключил к своим проектам библиотеку libnosys.a Она позволяет не писать самому те самые функции, которые не находятся при линковке: Почему нельзя просто в отдельный сишник retarget.c запихнуть эти функции и не заморачиваться с библиотекой? Потом, ИМХО, сами споткнетесь об эту библиотеку)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 9 октября, 2023 Опубликовано 9 октября, 2023 (изменено) · Жалоба 4 minutes ago, Arlleex said: Почему нельзя просто в отдельный сишник retarget.c запихнуть эти функции и не заморачиваться с библиотекой? Потом, ИМХО, сами споткнетесь об эту библиотеку)) Потому что поставлена цель формализовать библиотеки. Раз стандарт предусматривает хранение заглушек в libnosys, значит ему надо следовать. А не плодить сторонние библиотеки с аналогичным содержанием. Как я писал выше, ранее написал свои заглушки, которые были в startup_c.c. Изменено 9 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 9 октября, 2023 Опубликовано 9 октября, 2023 · Жалоба On 10/9/2023 at 8:11 AM, repstosw said: Библиотеку собирал вместе с newlib: https://github.com/espressif/newlib-esp32/tree/esp_based_on_4_1_0/libgloss/libnosys Правда пришлось этот libnosys обработать напильником, потому что при линковке выдаются искуственные противные ворнинги, сообщающие о заглушках: непонятно - вы не в crosstool-ng собираете тулзы ? libnosys.a собирается из коробки tools/xtensa-t113-elf/xtensa-t113-elf/lib/libnosys.a в тойже директории есть файл nosys.specs - его надо указывать компилятору(линкеру) если собираете для бареметала через параметр --specs=nosys.specs не встречал чтобы надо было что-то править напильноиком On 10/9/2023 at 8:11 AM, repstosw said: Правильная последовательность библиотек при сборке (смешанный проект: C++ / C / ASM ) -lstdc++ -lc -lnosys -l всё остальное Иначе, будут ошибки. -lnosys не надо вручную указывать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 9 октября, 2023 Опубликовано 9 октября, 2023 (изменено) · Жалоба 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 не собирает как надо? Нет никакого "просто из коробки". Изменено 9 октября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 9 октября, 2023 Опубликовано 9 октября, 2023 (изменено) · Жалоба On 10/9/2023 at 12:57 PM, repstosw said: Вы во внутрь nosys.specs смотрели? Посмотрите. Будете удивлены. я то смотрел, вы удивляйтесь 🙂 Quote %rename link_gcc_c_sequence nosys_link_gcc_c_sequence *nosys_libgloss: -lnosys *nosys_libc: %{!specs=nano.specs:-lc} %{specs=nano.specs:-lc_nano} *link_gcc_c_sequence: %(nosys_link_gcc_c_sequence) --start-group %G %(nosys_libc) %(nosys_libgloss) --end-group On 10/9/2023 at 12:57 PM, repstosw said: у espressif есть свой форк crosstool-ng - кроме прочего (свои форки gcc, binutils) там есть поддержка вплоть до gcc 13 https://github.com/espressif/crosstool-NG/tree/esp-1.25.x On 10/9/2023 at 12:57 PM, repstosw said: Там только GCC 11 нет, там как раз 13 есть. Конфиг я китайский больше не использую - беру их, у них опции с понимаем включены и исходники из форков для xtensa, но оверлей указываю от т113. Попробую собрать для венды и написать пошагово. Изменено 9 октября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться