Я работаю над ограниченной встроенной системой.
В настоящее время мы используем 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
функция может использовать символьный буфер для форматирования, такой как целое число или число с плавающей точкой для текста.
Вопросы:
printf
использует для форматирования? (ДругойПлатформа: процессор Arm7tdmi, система на чипе (SOC), IAR EW компилятор.
Это зависит от библиотеки, а не зависит от компилятора, и вам следует обратиться к документации библиотеки и, возможно, при наличии исходного кода. Это (возможно, устарело) IAR C Библиотека документации говорит:
Поскольку полный форматировщик требует много места, есть несколько
разные форматеры на выбор. Для получения дополнительной информации см.
см. Справочное руководство по компилятору IAR C.
текущая ссылка на компилятор IAR обсуждает выбор форматера, хотя в большинстве случаев компоновщик может автоматически выбрать наиболее подходящий форматер. В документации даже обсуждается дальнейшая оптимизация, доступная при перестройке библиотеки (для которой вам, вероятно, нужна исходная лицензия).
Некоторые реализации (не специально IAR) используют значительное пространство стека. Если вы хотите получить полный контроль, вы можете рассмотреть возможность использования реализации с открытым исходным кодом, такой как Крошечный принтф. Это не полная реализация ISO, но она подходит для многих встроенных приложений.
Это полностью зависит от реализации. printf
не обязан использовать какой-либо буфер. Конечно, он имеет в своем распоряжении stdio буфер, связанный с FILE
(stdout
в случае printf
) но это может быть нулевой длины, если программа отключила буферизацию с setbuf
/setvbuf
, Также возможно, что printf
имеет внутренний буфер; для правильной реализации C это должно было бы иметь автоматическое хранение («в стеке»), но встроенное низкокачественное без потоков может использовать статический буфер. В любом случае, printf
указано работать как бы при повторных вызовах fputc
и это, безусловно, может быть реализовано таким образом без какого-либо буфера вообще.