我在一个受限的嵌入式系统上工作。
目前,我们将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处理器,片上系统,IAR编译器。
发布于 2014-10-03 21:26:31
它是库而不是编译器依赖的,您应该查阅库的文档,并可能参考源代码。这个(也许是过时的) IAR C图书馆文献说:
由于一个完整的格式化程序需要很大的空间,所以有几个不同的格式化程序可供选择。有关更多信息,请参见IAR编译器参考指南。
当前IAR编译器引用讨论格式化程序选择,尽管在大多数情况下,链接器可以自动选择最合适的格式化程序。这些文档甚至还讨论了如果重新构建库(您可能需要一个源许可证),还可以进一步优化。
有些实现(特别是IAR)使用重要的堆栈空间。如果您想要完全控制,可以考虑使用开源实现(如微型印刷机 )。它不是一个完整的ISO实现,但适用于许多嵌入式应用程序。
发布于 2014-10-03 16:03:03
这是完全特定于实现的。printf没有义务使用任何缓冲区。当然,它拥有与FILE相关联的stdio缓冲区(在printf的情况下是stdout),但是如果程序关闭了setbuf/setvbuf的缓冲,这可能是零长度。printf也有可能有一个内部缓冲区;对于适当的C实现,这需要自动存储(“在堆栈上”),但是没有线程的低质量嵌入式存储可能使用静态缓冲区。在任何情况下,printf都被指定为工作方式,就像通过对fputc的重复调用一样,而且它当然可以在没有任何缓冲区的情况下以这种方式实现。
https://stackoverflow.com/questions/26182415
复制相似问题