ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
11 июля
365128 Топик полностью
fk0, легенда (30.10.2012 14:20, просмотров: 161) ответил Apтём на На пиках (с GNU) - описанное тобой можно сделать (хотя бы на 24ых или 32-ых)? Или нет?
Сделать что, printf работающий? Давно уже сделано. Суть вопроса не понятна, в инструкции на компилятор написано как это сделать. Приводить же 100% листинги смысла нет наверное. Только через функции _GNU_ libc? Тоже можно, но это ни разу не на пике -- там нет GNU libc, там библиотека фирмы Dinkumware. На PC запросто, пример перенаправления stdin, stdout и stderr через функции reader и writer, при этом если их file descriptor соответствует COM-порту, то происходит не вызов read/write функций, а специфических функций uart_read и uart_write. Зачем и почему так -- объяснять не буду, там слишком многоэтажная архитектура. Работает только для GNU libc: ssize_t __read(int fd, void *buf, size_t count); ssize_t __write(int fd, const void *buf, size_t count); ssize_t read(int fd, void *buf, size_t count) { if (fd>=UART_FILENO_MIN && fd<=UART_FILENO_MAX) return uart_read(fd, buf, count); else return __read(fd, buf, count); } ssize_t write(int fd, const void *buf, size_t count) { if (fd>=UART_FILENO_MIN && fd<=UART_FILENO_MAX) return uart_write(fd, buf, count); else return __write(fd, buf, count); } static ssize_t reader(void *cookie, char *buf, size_t size) { return read((int)cookie, buf, size); } static ssize_t writer(void *cookie, const char *buf, size_t size) { return write((int)cookie, buf, size); } static ssize_t seeker(void *cookie, off64_t *pos, int whence) { off_t retval; retval=lseek((int)cookie, *pos, whence); if (retval==(off_t)-1) return -1; *pos=retval; return 0; } static int cleaner(void *cookie) { return close((int)cookie); } cookie_io_functions_t uart_io = { .read = reader, .write = writer, .seek = seeker, .close = cleaner }; void xxx_init(void) { int stdin2, stdout2, stderr2; stdin2=dup(STDIN_FILENO); stdout2=dup(STDOUT_FILENO); stderr2=dup(STDERR_FILENO); fclose(stdin), fclose(stdout), fclose(stderr); dup2(stdin2, STDIN_FILENO); dup2(stdout2, STDOUT_FILENO); dup2(stderr2, STDERR_FILENO); close(stdin2), close(stdout2), close(stderr2); stdin = fopencookie((void*)STDIN_FILENO, "r", uart_io); setvbuf(stdin, NULL, _IONBF, 0); stdout = fopencookie((void*)STDOUT_FILENO, "a", uart_io); setvbuf(stdout, NULL, _IONBF, 0); stderr = fopencookie((void*)STDERR_FILENO, "a", uart_io); setvbuf(stderr, NULL, _IONBF, 0); } /* в программе везде вместо fdopen используется эта FDOPEN */ FILE *FDOPEN(int fd, const char *mode) { FILE *retval; /* retval=fdopen(fd, "a"); */ retval=fopencookie((void*)(uintptr_t)fd, mode, uart_io); assert(retval!=NULL); setvbuf(retval, NULL, _IONBF, 0); return retval; }
[ZX]