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

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

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

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


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

3 минуты назад, repstosw сказал:

аша реализация printf поддерживает вывод float, double,

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

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


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

2 minutes ago, mantech said:

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

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

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

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

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

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

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


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

On 10/8/2023 at 3:03 PM, repstosw said:

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

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

типа aalib

https://en.wikipedia.org/wiki/AAlib

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

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


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

39 minutes ago, sasamy said:

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

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

Для отладки!

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


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

13 minutes ago, repstosw said:

Для отладки!

Некоторые индивидуумы без jtag не представляют себе отладку (я jtag в массе изделий и не вывожу).

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


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

On 10/8/2023 at 3:50 PM, repstosw said:

Для отладки!

я так и думал, а  для отладки нельзя собирать проект с либой которая на 61 кб больше чем релизная и в ней есть нужный printf ? у процессора же 128 мегабайт DDR - мне показалось должно хватить

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


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

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  в Линуксе.

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

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

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


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

1 час назад, repstosw сказал:

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

Я в курсе, просто мне не нужна такая точная плавучка..

39 минут назад, GenaSPB сказал:

(я jtag в массе изделий и не вывожу).

Я тоже)) printf вполне хватает, ну и соображалка чтоб работала))))))))

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


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

Подключил к своим проектам библиотеку 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 всё остальное

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

 

 

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

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


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

32 минуты назад, repstosw сказал:

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

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

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

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

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


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

4 minutes ago, Arlleex said:

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

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

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

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

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

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


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

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 не надо вручную указывать

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


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

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

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

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


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

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.  Попробую собрать для венды и написать пошагово.

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

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


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

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

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

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

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

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

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

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

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

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