-
- Так получилось в итоге? - RxTx(27.07.2023 20:04)
- Немного по поискам, может кому-то облегчит их и сократит путь. И о
причинах. Главное - хотелось как и задумано пользоваться printf() как стандартной и всем понятой функцией просто подключив <stdio.h>. У меня - не получилось. Потому что не "просто вывести на
консоль", а консоль это stdout, который есть файл, который есть устройство, ... в доме который
построил Джек. В моём случае FILE (в т.ч. stdout) содержит поле _write с Dingo(524 знак., 15.04.2023 18:05, ссылка)
- Через подмену _write не получилось, даже не вызывается. Разобрал до
__sflush_r просмотром lss, там из неё ничего не вызывается. - Dingo(16.04.2023 18:51)
- Тож стало интересно. В MounRiverStudio это так решается. Оно так во
всех примерах из коробки работает. Т.е. у меня наоборот получилось,
оно работало и только после задался вопросом, а как это устроено? petrd(1247 знак., 27.07.2023 19:29 - 19:43)
- Что такое MoonRiverStudio - RxTx(27.07.2023 19:33)
- ЯТД, что это китайская IDE для китайских микроконтроллеров :-) reZident(1 знак., 27.07.2023 19:35, ссылка)
- Именно. Основная IDE в которой идут все примеры для работы с контроллерами WCH. - petrd(27.07.2023 19:38)
- ЯТД, что это китайская IDE для китайских микроконтроллеров :-) reZident(1 знак., 27.07.2023 19:35, ссылка)
- Что такое MoonRiverStudio - RxTx(27.07.2023 19:33)
- Тож стало интересно. В MounRiverStudio это так решается. Оно так во
всех примерах из коробки работает. Т.е. у меня наоборот получилось,
оно работало и только после задался вопросом, а как это устроено? petrd(1247 знак., 27.07.2023 19:29 - 19:43)
- Через подмену _write не получилось, даже не вызывается. Разобрал до
__sflush_r просмотром lss, там из неё ничего не вызывается. - Dingo(16.04.2023 18:51)
- Конкретно printf() в конце концов вызывает write(), и тебе надо переопределить write() так, как тебе надо. VVB(315 знак., 14.04.2023 06:38)
- Эта штука компиляторазависимая, для ИАР нужно переопределить
putchar() для stdout, для вывода по дескриптору переопределить
fputc() IBAH(2256 знак., 13.04.2023 19:22)
- Эта штука не компиляторозависимая, а библиотекозависимая. VVB(1168 знак., 14.04.2023 06:41, ссылка)
- Для IAR первое что нужно сделать это прочитать doc/EWARM_DevelopmentGuide.ENU.pdf. А потом сделать как там рекомендуется, чтобы не заниматься "закатом Солнца вручную". - ЫЫyкпy(14.04.2023 00:36)
- gcc :-( Что-то всё больше склоняюсь к "своему" printf() - Dingo(13.04.2023 20:30)
- если свой - бери xprintf и там меняй вывод в своё удовольствие - POV(14.04.2023 00:49)
- В песках что-то такое было давным-давно >>> SciFi(1 знак., 13.04.2023 15:49, ссылка)
- В эклипсе в проекте убрал --specs=rdimon.specs поставил Use newlib-nano( --specs=nano.specs ) При Do not use syscalls( --specs=nosys.specs ) происходит что
описал ниже; при отключенной ругается на отсутствие _sbrk _write_r _close _lseek_r _read_r' _getpid_r _getpid
_fstat_r _fstat ; в подобном проекте видел заглушки на неиспользуемые и вызов из write() своего __io_putchar(). Вопрос по прежнему актуален: 1)где внятное описание этого всего Dingo(98 знак., 13.04.2023 16:38)
- А вот и в syscalls.c в исходниках с левого гитхаба newlib\libc\sys\arm\ с атрибутом weak Dingo(705 знак., 13.04.2023 17:42)
- Вот тут что-то есть: SciFi(1 знак., 13.04.2023 19:25, ссылка)
- Спасибо. Там ещё вариант просматривается, но надо разобраться ещё с
какими ключами либа в проекте используется: там и буфера есть, и
флаги, и... А для консоли достаточно *flush* реализовать, который
дёргается только когда в буфере место закончилось( его в свой
переписать и в фоне выводить в uart). С одной стороны понятно
обусловленность сложности: куча архитектур, платформ от железок до
вполне ОС, поддержка всего зоопарка. Разной сложности форматы
строк, расурсы и возможности Dingo(216 знак., 13.04.2023 20:27)
- У меня была ситуация, когда newlib съедал слишком много флеша. Я надёргал стандартных функций из dietlibc, там всё обезжиренное, в том числе семейство *printf. С тех пор так всегда и делаю. И внутри там всё довольно просто устроено, перенаправить printf куда надо можно довольно тривиально. - SciFi(13.04.2023 20:34)
- Спасибо. Там ещё вариант просматривается, но надо разобраться ещё с
какими ключами либа в проекте используется: там и буфера есть, и
флаги, и... А для консоли достаточно *flush* реализовать, который
дёргается только когда в буфере место закончилось( его в свой
переписать и в фоне выводить в uart). С одной стороны понятно
обусловленность сложности: куча архитектур, платформ от железок до
вполне ОС, поддержка всего зоопарка. Разной сложности форматы
строк, расурсы и возможности Dingo(216 знак., 13.04.2023 20:27)
- Вот тут что-то есть: SciFi(1 знак., 13.04.2023 19:25, ссылка)
- А вот и в syscalls.c в исходниках с левого гитхаба newlib\libc\sys\arm\ с атрибутом weak Dingo(705 знак., 13.04.2023 17:42)
- В эклипсе в проекте убрал --specs=rdimon.specs поставил Use newlib-nano( --specs=nano.specs ) При Do not use syscalls( --specs=nosys.specs ) происходит что
описал ниже; при отключенной ругается на отсутствие _sbrk _write_r _close _lseek_r _read_r' _getpid_r _getpid
_fstat_r _fstat ; в подобном проекте видел заглушки на неиспользуемые и вызов из write() своего __io_putchar(). Вопрос по прежнему актуален: 1)где внятное описание этого всего Dingo(98 знак., 13.04.2023 16:38)
- Переопределяешь функции передачи символов. Чтобы перебить
библиотечные... что-то типа Putchar ... POV(90 знак., 13.04.2023 15:38, ссылка, ссылка)
- Вы же догадываетесь по приведённым опциям что я не с нуля спросил?
Меня больше дерево вызовов интересует, какую базовую
функцию(несколько?) надо переопределить и как компилятору сказать,
что "вот это использовать". printf() -> fprintf() ->
fputc() ? Или же printf() -> putchar() -> fputc() ?
Третий, ни один из этих? - Dingo(13.04.2023 15:48)
- Открой STDIO.H - погляди что там рядышком printf. Это и перебей. POV(1 знак., 13.04.2023 16:02, картинка)
- Щас насоветуешь. Просто скажи "не знаю", а лучше промолчи :-) - SciFi(13.04.2023 16:05)
- Не веришь ты в людей ( POV(1 знак., 13.04.2023 16:27, картинка)
- Щас насоветуешь. Просто скажи "не знаю", а лучше промолчи :-) - SciFi(13.04.2023 16:05)
- гнусный компилятор - это от слова "гнусный". Эта скотиняка в
зависимости от аргументов для printf() делает разные "деревья
вызовов". Но по идее любое дерево упирается в один "корень" - вот
его и надо "замещать". в моём случае (частный) это outbyte(ch) - Zoro(13.04.2023 15:55)
- Печать символьной строки без форматирования через % вызывает puts_r [opennet: int _puts_r(void *reent, const char *s); ] которая дёргает swbuf_r() [ int _EXFUN(__swbuf_r, (struct _reent *, int, FILE *)); ] А вот кто и как потом с этим буфером работает - загадка... Сам __swbuf_r инициализирует внутри, __swsetup_r . _write_r ещё есть в listing lss с вызовом _write с таким дизассемблером Dingo(624 знак., 13.04.2023 16:48)
- Там newlib (пусть даже nano), и printf тянет за собой ещё и malloc/free. Не такой уж и "нано", как выясняется. - SciFi(13.04.2023 16:01)
- Открой STDIO.H - погляди что там рядышком printf. Это и перебей. POV(1 знак., 13.04.2023 16:02, картинка)
- Вы же догадываетесь по приведённым опциям что я не с нуля спросил?
Меня больше дерево вызовов интересует, какую базовую
функцию(несколько?) надо переопределить и как компилятору сказать,
что "вот это использовать". printf() -> fprintf() ->
fputc() ? Или же printf() -> putchar() -> fputc() ?
Третий, ни один из этих? - Dingo(13.04.2023 15:48)