|
newlib stdio, перенаправление ввода/вывода |
|
|
|
Nov 2 2010, 15:14
|

Участник

Группа: Участник
Сообщений: 71
Регистрация: 24-02-08
Из: Москва
Пользователь №: 35 348

|
Добрый вечер. Разбираюсь с newlib; сейчас попытался перенаправить стандартный вывод, и столкнулся с такой проблемой: переопределил функции: Код _ssize_t _read_r(struct _reent *r, int file, void *ptr, size_t len); _ssize_t _write_r(struct _reent *r, int file, const void *ptr, size_t len); (и прочие низкоуровневые вызовы для newlib) и вызвал printf(), после чего обнаружил, что _write_r не вызывается. Попробовал так же вместо указанных функций переопределять лишь Код int _read (int file, char *ptr, int len); int _write(int file,char *ptr,int len); результат тот же. Ключи линкера: Код LIBS = -lstdc++ -lc -lgcc -lm LDFLAGS = -nostartfiles -Wl,-Map=$(TARGET).map,--cref $(LIBS) -T$(TARGET).ld В качестве референса использовал этот проект: http://www.siwawi.arubi.uni-kl.de/avr_proj...ects/#gcc_stdioToolchain из последней сборки yagarto. Итак, вопрос: как переопределить стандартный ввод/вывод, и что я делаю не так? upd: версия newlib: 1.18
Сообщение отредактировал Spym - Nov 2 2010, 19:25
|
|
|
|
|
 |
Ответов
|
Nov 3 2010, 14:53
|

Участник

Группа: Участник
Сообщений: 71
Регистрация: 24-02-08
Из: Москва
Пользователь №: 35 348

|
Я прозрел; как выяснилось, вывод корректно работает даже в Yagarto. Из первого вызова printf вызывается __sinit, где происходит инициализация stdout/stdin/stderr. После этого stdout->_write указывает на __swrite, откуда как раз и происходит вызов _write_r, а отсюда, в свою очередь, вызывется пользовательский _write; но и _write_r можно переопределить. Моя проблема заключалась в том, что вызов printf, где строка формата не содержит управляющих последовательностей: Код printf("Something string"); в newlib не приводит к выводу этой строки в stdout; после замены на: Код printf("%s", "Just string\r\n"); все ВНЕЗАПНО заработало. Почему так? Ведь в этом случае в stdout должно было уйти "Something string".
|
|
|
|
|
Nov 6 2010, 20:36
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(Spym @ Nov 3 2010, 19:53)  Из первого вызова printf вызывается __sinit, где происходит инициализация stdout/stdin/stderr. Вот этот момент мне не очень понятен. Чем инициализируется stdout? Иными словами, куда, на какое устройство будут выводиться данные, отправляемые в stdout? У меня типичная инициализация происходит так (упрощенный пример - сервер, принимающий tcp соединения): Код ..... int s = socket(.....); listen(s, .....); ..... int sd = accept(s); // получили дескриптор нового tcp соединения stdin = stdout = stderr = fdopen(sd, "w+"); ............. printf("Hello!\n"); В результате вызова printf() я получаю вызов _write(int, char*, int), первым аргументом которого будет значение sd, указанное при вызове fdopen(). А что я получу в качестве первого аргумента _write, если не сделаю fdopen? Как в этом случае _write должна решить, куда отправлять данные, на которые указывает второй аргумент?...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
Сообщений в этой теме
Spym newlib stdio Nov 2 2010, 15:14 Spym Попробую издалека:
Поднимите руки, кто использует ... Nov 2 2010, 19:24 AHTOXA Цитата(Spym @ Nov 2 2010, 20:14) Ключи ли... Nov 2 2010, 19:52 Spym Цитата(AHTOXA @ Nov 2 2010, 22:52) Покажи... Nov 2 2010, 19:55  AHTOXA Хм. Не вижу криминала.
Вспоминаю, что читал что-то... Nov 2 2010, 20:18 Spym Цитата(AHTOXA @ Nov 2 2010, 23:18) Так чт... Nov 2 2010, 20:29 Spym Прикрутил вместо yagarto/arm-none-eabi сборку kgp-... Nov 2 2010, 22:40 klen Цитата(Spym @ Nov 3 2010, 01:40) Прикрути... Nov 3 2010, 19:00  Spym Цитата(r301 @ Nov 3 2010, 21:37) обычная ... Nov 4 2010, 11:51   Сергей Борщ Цитата(Spym @ Nov 4 2010, 14:51) Интересн... Nov 4 2010, 12:39   Petka Цитата(Spym @ Nov 4 2010, 14:51) ...
И по... Nov 4 2010, 13:00 alx2 Меня немного смущает слово "перенаправляется... Nov 3 2010, 05:55 AHTOXA Цитата(Spym @ Nov 3 2010, 01:29) ЦитатаAl... Nov 3 2010, 10:09 Spym Цитата(alx2 @ Nov 3 2010, 08:55) ...перен... Nov 3 2010, 13:22 AHTOXA Цитата(Spym @ Nov 3 2010, 19:53) Я прозре... Nov 3 2010, 18:01 r301 Цитата(Spym @ Nov 3 2010, 17:53) Почему т... Nov 3 2010, 18:37  Spym Цитата(alx2 @ Nov 6 2010, 23:36) Вот этот... Nov 7 2010, 04:55   alx2 Цитата(Spym @ Nov 7 2010, 09:55) Как я уж... Nov 7 2010, 20:53    Spym Цитата(alx2 @ Nov 7 2010, 23:53) Не могу ... Nov 8 2010, 08:03     alx2 А, понял. Вы говорите о __sinit из newlib/libc/mac... Nov 9 2010, 07:14      Spym Вы не ответили, какую версию newlib используете.
... Nov 9 2010, 09:17       alx2 Цитата(Spym @ Nov 9 2010, 14:17) Вы не от... Nov 10 2010, 06:24        Spym Цитата(alx2 @ Nov 10 2010, 09:24) А Вы не... Nov 10 2010, 10:00 Spym Цитата(Сергей Борщ @ Nov 4 2010, 15:39) П... Nov 4 2010, 13:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|