2014-10-03 3 views
4

Я работаю над ограниченной встроенной системой.Где буфер форматирования для printf?

В настоящее время мы используем snprintf в буфер, а затем с другим утверждением, печать буфера последовательного порта:

char temp_buffer[256]; 
    int bytes_written = snprintf(temp_buffer, sizeof(temp_buffer), 
         "Solar system has %d planets\n", 
         10); 
    if (bytes_written > 0) 
    { 
    Serial_Port_Output(temp_buffer, bytes_written); 
    } 

Я хочу, чтобы переключиться на printf писать непосредственно к последовательному порту. В документации нашего компилятора я перехватил вызов функции для вывода данных для использования последовательного порта. (Интерфейс использует запись блока: адрес и количество символов).

Функция printf может использовать буфер символов для форматирования, такой как целочисленный или с плавающей точкой в ​​текст.

Вопросы:

  1. Где это буфер, который printf использует для форматирования? (Другие запрашивающие умы хотят знать, прежде чем вносить изменения.)
  2. Является ли это компилятором (платформой), зависящим от проблемы?

Платформа: процессор Arm7tdmi, система на чипе (SOC), компилятор IAR EW.

+2

Это скорее библиотека C, чем компилятор. У вас есть источник для вашего libc? Может быть, нет буфера, если он выводит char по char, но это зависит от реализации libc. –

ответ

1

Это библиотека, а не зависимая от компилятора, и вы должны ознакомиться с документацией библиотеки и, возможно, там, где это возможно, исходным кодом. Это (возможно, устаревший) IAR C Library documentation говорит:

Поскольку полный форматировщик требует много места есть несколько различных форматтеров на выбор между ними. Для получения дополнительной информации см. в Справочном руководстве по компилятору IAR C.

current IAR compiler reference обсуждает выбор форматирования, хотя в большинстве случаев компоновщик может автоматически выбрать наиболее подходящий форматтер. В документации даже обсуждается дальнейшая оптимизация, доступная при перестройке библиотеки (для которой вам, по-видимому, нужна исходная лицензия).

Некоторые реализации (а не IAR) используют значительное пространство стека. Если вам нужен полный контроль, вы можете использовать возможность использования с открытым исходным кодом, например Tiny printf. Это не полная реализация ISO, но подходит для многих встроенных приложений.

13

Это полностью специфичный для реализации. printf не обязан использовать какой-либо буфер. Разумеется, он имеет в своем распоряжении буфер stdio, связанный с FILE (stdout в случае printf), но это может быть нулевой длины, если программа выключена буферизацией с setbuf/setvbuf. Также возможно, что printf имеет внутренний буфер; для правильной реализации C это должно иметь автоматическое хранилище («в стеке»), но низкокачественный встроенный без потоков может использовать статический буфер. В любом случае printf задается для работы как бы путем повторных вызовов fputc, и это, безусловно, может быть реализовано таким образом без какого-либо буфера.

Смежные вопросы