Где находится буфер форматирования для 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 компилятор.

4

Решение

Это зависит от библиотеки, а не зависит от компилятора, и вам следует обратиться к документации библиотеки и, возможно, при наличии исходного кода. Это (возможно, устарело) IAR C Библиотека документации говорит:

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

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

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

1

Другие решения

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

13

По вопросам рекламы [email protected]