LINUX.ORG.RU

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


0

0

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

★★★★

Ответ на: комментарий от I3rain

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

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

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

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

anonymous
()
Ответ на: комментарий от anonymous

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

krum
()
Ответ на: комментарий от anonymous

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

krum
()
Ответ на: комментарий от anonymous

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

krum
()
Ответ на: комментарий от anonymous

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

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

alexru ★★★★
() автор топика
Ответ на: комментарий от Davidov

/dev/ttyS0 откуда возьмется ? :)

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

alexru ★★★★
() автор топика
Ответ на: комментарий от Davidov

Да нет там ОС вообще:) И тем более /dev/ttyS0 :)

krum
()

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

Zmacs
()
Ответ на: комментарий от Zmacs

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

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

dn2010 ★★★★★
()
Ответ на: комментарий от Davidov

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

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

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

powerpc

alexru ★★★★
() автор топика

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

Можно:

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

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

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

sS ★★★★★
()

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

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

execve
()
Ответ на: комментарий от execve

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

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

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