C++ printf的格式化缓冲区在哪里?
我在一个受限的嵌入式系统上工作 目前,我们将C++ printf的格式化缓冲区在哪里?,c++,c,embedded,printf,iar,C++,C,Embedded,Printf,Iar,我在一个受限的嵌入式系统上工作 目前,我们将snprintf用于缓冲区,然后使用另一条语句将缓冲区打印到串行端口: char temp_buffer[256]; int bytes_written = snprintf(temp_buffer, sizeof(temp_buffer), "Solar system has %d planets\n", 10); if (bytes_written
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编译器 这是完全特定于实现的
printf
没有义务使用任何缓冲区。当然,它有与文件相关联的stdio缓冲区(在printf
的情况下是stdout
),但如果程序使用setbuf
/关闭缓冲,则长度可能为零。printf
也可能有一个内部缓冲区;对于正确的C实现,这需要有自动存储(“在堆栈上”),但没有线程的低质量嵌入式存储可能会使用静态缓冲区。在任何情况下,printf
被指定为通过重复调用fputc
来工作,并且它肯定可以在没有任何缓冲区的情况下以这种方式实现。它是依赖于库而不是编译器的,您应该查阅库的文档以及可能的源代码。这句话(可能已经过时)说:
因为一个完整的格式化程序需要大量的空间,所以有几个
不同的格式化程序可供选择。有关更多信息,请参阅
请参阅IAR C编译器参考指南
虽然在大多数情况下链接器可以自动选择最合适的格式化程序,但讨论了格式化程序的选择。该文档甚至讨论了在重建库(您可能需要源许可证)时的进一步优化
一些实现(不特别是IAR)使用大量堆栈空间。如果需要完全控制,可以考虑使用诸如.NET的开源实现。它不是一个完整的ISO实现,但适用于许多嵌入式应用程序。与其说它是一个编译器,不如说它是一个C库。你有libc的来源吗?如果一个字符一个字符地输出,可能没有缓冲区,但这取决于libc实现。