|
printf(), putchar(), fopen(), fclose(), fprintf() и т.д., суть реализации все этого для embedded? |
|
|
|
Aug 8 2009, 21:59
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760

|
Запутался в конец ))). 1) Функции ввода-вывода, работающие со стандартными потоками ввода-вывода( printf, putchar и т.д.) - как они используются для embedded-приложений? Насколько понимаю, поток ввода, например, - это просто буфер, область памяти, обслуживаемая как FIFO? И в случае "Hello, World!" для Windows стандартные потоки ввода-вывода - это буферы, созданные операционной системой, а их размеры и указатели передаются приложению (моему "Helo, World!"). Значит в случае программы для микроконтроллера можно сделать свой поток - выделить область в ОЗУ (буфер), сделать указатели записи-чтения, определить размер буфера и тогда, скажем printf будет писать данные в этот буфер? И потом из этого буфера, скажем, передавать в UART? Я правильно понимаю? Или нет? Как все это правильно делается? У Т.Мартина в книге есть мелкий пример по использованию STDIO, где пишется своя функция putchar. После чего уже можно юзать printf(). Но у меня это вроде как сомнения вызывает... Без таких "доработок" нельзя? 2) Функции, работающие с файловыми потоками... Во-первых, что есть fopen для embedded? Во-вторых, структура FILE? В-третьих, функциями типа frintf, fwrite можно пользоваться для работы с собственными буферами? Если да, то как? Вообщем, как правильно использовать библиотеку STDIO для embedded-приложений? Собственно вот ))). Немного путано получилось... Если кто найдет время мне это все объяснить - буду очень признателен!
|
|
|
|
|
 |
Ответов
|
Aug 8 2009, 22:38
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Student Pupkin @ Aug 9 2009, 03:59)  Значит в случае программы для микроконтроллера можно сделать свой поток - выделить область в ОЗУ (буфер), сделать указатели записи-чтения, определить размер буфера и тогда, скажем printf будет писать данные в этот буфер? Если в буфер, то ничего не надо определять, надо просто использовать sprintf()  Оно как раз для этого. Цитата Вообщем, как правильно использовать библиотеку STDIO для embedded-приложений? Если речь о gcc, то надо написать заглушки (stubs). Вот научно-популярное объяснение, что это такое, вот документация. А в аттаче
stf_syscalls_minimal.rar ( 1.34 килобайт )
Кол-во скачиваний: 211 - пример заглушек из какого-то примера от FreeRtos.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 8 2009, 23:53
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760

|
Цитата(AHTOXA @ Aug 9 2009, 02:38)  Если в буфер, то ничего не надо определять, надо просто использовать sprintf()  Оно как раз для этого. Угумс )))). Да, есть такие sprintf(), sscanf. Про них понятно, суть их так сказать  . В них явно указывается указатель на строку, в которую пишем (вводим) или из которой читаем (выводим). Цитата(AHTOXA @ Aug 9 2009, 02:38)  Если речь о gcc, то надо написать заглушки (stubs). А вот тут я никак )))). Получается, что часть функций библиотеки stdio нормально использовать нельзя? Я имею ввиду обычное программу для микроконтролера, без использования оси (это называется StandAlone- приложение вроде бы?). А зачем же они тогда реализованы? И как они реализованы? Я в смысле, что в соотвествующей lib-е они есть, раз в хэдере прописаны? Что для них есть stdin, stdout? Как функция fopen работает? Не понимаю... Есть конечно сомнительная мысль, что эта часть функций реализована исключительно как ввод-вывод на консоль ИАРа под отладчиком (да кстати  , я тут с иаром вожусь, пытаюсь в хэдерах что-то на эту тему откопать... но пока не очень), возможно и работа с файлами (fopen, fwrite, fread и т.д.) тоже предполагается по житагу через ИАР (ну, по крайней мере знаю от товарищей, которые с TMS320 под CodeComposerStudio, что у них есть такое - по житагу из файла на ПЭВМ в ОЗУ процессора загрузить). А в целом картину я пока так и не понял  .
|
|
|
|
|
Aug 9 2009, 00:38
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Student Pupkin @ Aug 9 2009, 02:53)  Получается, что часть функций библиотеки stdio нормально использовать нельзя? Я имею ввиду обычное программу для микроконтролера, без использования оси (это называется StandAlone- приложение вроде бы?). А зачем же они тогда реализованы? И как они реализованы? А как реализуете, так и будет :-) Цитата(Student Pupkin @ Aug 9 2009, 02:53)  Есть конечно сомнительная мысль, что эта часть функций реализована исключительно как ввод-вывод на консоль ИАРа под отладчиком (да кстати  Как уже говорилось, в простейшем случае переопределяется единственная функция putchar() и тогда printf лупит через неё туда, куда захотел программист. У avr-gcc функции fprintf/vfprintf принимают файловый объект, в котором записаны указатели на соответствующие этим объектам функции вывода и ввода символа, можно определить несколько совершенно разнородных "псевдофайлов" и работать с ними. Для сокращения кода имеются макросы, инициализирующие глобальные файловые переменные во время компиляции. Как-то так: http://electronix.ru/forum/index.php?showt...mp;#entry596833http://electronix.ru/forum/index.php?showt...mp;#entry463352Если очень хочется, можно написать свои fopen под свою систему, заполняющие структуру FILE, как в данных ранее линках в зависимости от переданного аргумента. Ну или как это сделано в NutOS (то, что там OS - несколько ортогонально к применённой системе "файлов", это и в "безосевом" приложении можно было бы сделать).
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
Сообщений в этой теме
Student Pupkin printf(), putchar(), fopen(), fclose(), fprintf() и т.д. Aug 8 2009, 21:59  AHTOXA Цитата(Student Pupkin @ Aug 9 2009, 05:53... Aug 9 2009, 08:04   Student Pupkin Цитата(AHTOXA @ Aug 9 2009, 12:04) Насчёт... Aug 9 2009, 13:28 SasaVitebsk Стандартным выводом вроде как является UART. Но вы... Aug 9 2009, 00:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|