Недавно занялся процессорами stm32, и вот, хочу поспрашивать про библиотеку LibC.
Портирую проект с OrangePI(клон Raspberry), который ранее работал очень медленно и на AVR.
В предыдущих версиях проектов я работал с TFT дисплеем, малельким дисплейчиком, устройствами i2c, uart и консолью через файлы.
На Linux работать с файлами элементарно, и на AVR библиотека LIBC тоже это позволяла без проблем.
А на stm32 этот момент как то плохо описан, максимум попадается "прибитие гвоздями" uart к printf.
Хочется перенести код типа такого:
Спойлер
Код: Выделить всё
//создаются файлы для работы с устройствами
FILE *uart_stream;
FILE *log_stream;
FILE *lcd_info_stream;
FILE *tft_console_stream;
...
//есть фунукции работы с железом
extern int uart0_putchar(char c, FILE *stream __attribute__ ((__unused__)) );
extern int tft_putchar(char c, FILE *stream __attribute__ ((__unused__)) );
extern int tft_console_putchar(char c, FILE *stream __attribute__ ((__unused__)) );
...
//связываем файловые потоки с "железом" (это пример для AVR, а на linux открываем с помощью fopen файлы устройств)
uart_stream = fdevopen(uart0_putchar, uart0_getcharL); //send , receive functions
tft_stream = fdevopen(tft_putchar, NULL); //send , receive functions
tft_console_stream = fdevopen(tft_console_putchar, keyboard_getchar); //send , receive functions
...
//далее работаем с разными устройствами. для примера, пусть будет libc.printf
fprintf(log_stream,"some var=%6u",v);
fprintf(tft_console_stream,"\e[31mText..");
//при работе с файлами на AVR приходится дополнительно связать структуру stdio.FILE со структурой "FILE" из библиотеки для работы с SD картой. На Lunux лишние действия не требуются.
И не обнаружил примеров работающих с stdio.FILE.
(Кроме примеров как жестко "повесить" printf на Uart через переопределение функции _write/putchar)
А вот примеров создания нескольких потоков FILE для ввода/вывода не нашел.
Да, можно сделать ветвление в функции _write, но точно я не буду мешать все устройства и файловые операции придачу в одной функции.
Писать костыли под такую LIBC как то нет желания. Как бы не легче было другую libc прикрутить.
Надеюсь, я просто чего то не заметил. Или эта задача делается на stm32 иначе.
Подскажите как правильно делаются потоки ввода вывода на stm32.


