LINUX.ORG.RU

Перенаправить вывод printf


0

0

Можно-ли перенаправить вывод printf, подсунув ему свою функцию типа putc(). Вариант с sprintf и последующим выводом полученной строки известен, но похож на костыль.

★★★★

Re: Перенаправить вывод printf

Мая твая чукча не понимает. 
Признавайся по пьяне писал или трава забористая?

I3rain ()
Ответ на: Re: Перенаправить вывод printf от I3rain

Re: Перенаправить вывод printf

Не по пьяни. Есть железка вообще без ОС. У нее есть ком-порт. Нужно вывод libc-шного printf-а перенаправить в этот ком. Для него есть функция __putc() которая все выводит. Как ее подсунуть printf-у?

alexru ★★★★ ()
Ответ на: Re: Перенаправить вывод printf от alexru

Re: Перенаправить вывод printf

Указатель на самостоятельно инициализированную структуру FILE. GLIBC пока нет возможности посмотреть, я гляжу в CYGWIN-е, так вот, в нем в структуре FILE есть пара интересных указателей на функции _read и _write - это соотвественно указатели на функции низкоуровнего (т.е. в нашем случае небуферизированного) чтения/записи. Вопрос в том, есть ли поддержка в вашей embedded библиотеке функций типа fprintf, fopen, fread и т.д.

Ну и на худой конец, если уже библиотека этого не позволяет, и лень связываться с кривым методом "sprintf", можно попробовать самостоятельно определить функцию printf, благо исходников её реализации полно.

anonymous ()
Ответ на: Re: Перенаправить вывод printf от anonymous

Re: Перенаправить вывод printf

а как ты сможешь в принципе запихнуть туда glibc? Имхо, проще взять исходники printf и их немного переделать. А что за железка, если не секрет? Потом посмотри, как это сделано в avrlib. К тому же уверен на 99% что есть ограничение по объёму кода, так что в любом случае придёться делать свою реализацию printf.

krum ()
Ответ на: Re: Перенаправить вывод printf от anonymous

Re: Перенаправить вывод printf

опять же они жирные для тех же 8-ми и 16-ти битных МК, на которых чаще всего не используют ОС.

krum ()
Ответ на: Re: Перенаправить вывод printf от anonymous

Re: Перенаправить вывод printf

опять же они жирные для тех же 8-ми и 16-ти битных МК, на которых чаще всего не используют ОС.

krum ()
Ответ на: Re: Перенаправить вывод printf от anonymous

Re: Перенаправить вывод printf

Glibc полная. Железка достаточно мощная. Но не хватает ее производительности на ОС и программу.

За намек на FILE спасибо. Посмотрел сейчас исходники glibc и ужаснулся :))

alexru ★★★★ ()

Re: Перенаправить вывод printf

Переписать системный вызов write в libc, чтобы он писал по нужному адресу, и из printf вызывать этот модифицированный вызов. Как взаимодействует libc с железом? Есть же прослойка какая-нить?

Zmacs ()
Ответ на: Re: Перенаправить вывод printf от Zmacs

Re: Перенаправить вывод printf

>Как взаимодействует libc с железом? Есть же прослойка какая-нить?

Эта прослойка называется ядро.

dn2010 ★★★★★ ()
Ответ на: Re: Перенаправить вывод printf от Davidov

Re: Перенаправить вывод printf

> Ух ты, я не знал, что libc может работать без ОС..

Вроде препятствий особых не вижу. Только у меня не получается слинковаться с libc статически. Как это правильно делать?

> Речь идёт про arm-*-none?

powerpc

alexru ★★★★ ()

Re: Перенаправить вывод printf

>Можно-ли перенаправить вывод printf, подсунув ему свою функцию типа putc(). Вариант с sprintf и последующим выводом полученной строки известен, но похож на костыль.

Можно:

1) перегрузить printf() через LD_PRELOAD

2) таки разобраться кто на ком стоял и сделать всё по уму.

PS: тот же putc() принимает в качестве аргумента поток FILE* ... или там какой то особо извращённый putc() ?

sS ★★★★★ ()

Re: Перенаправить вывод printf

IMHO вариант с s[n]printf как раз будет самым прямым.

ЗЫ: А ещё можно перейти на C++. Там создание своего потока - штатная фича. :D

execve ()
Ответ на: Re: Перенаправить вывод printf от execve

Re: Перенаправить вывод printf

>ЗЫ: А ещё можно перейти на C++. Там создание своего потока - штатная фича. :D

Для embedded системы это может быть не самая удачная идея...

sS ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.