【问题标题】:Where is formatting buffer for printf?printf 的格式化缓冲区在哪里?
【发布时间】:2014-11-28 17:12:04
【问题描述】:

我在一个受限的嵌入式系统上工作。

目前我们使用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 编译器。

【问题讨论】:

  • 它更像是一个 C 库而不是编译器。你有你的 libc 的源代码吗?如果它按字符输出字符,则可能没有缓冲区,但这取决于 libc 实现。

标签: c++ c embedded printf iar


【解决方案1】:

这完全是特定于实现的。 printf 没有义务使用任何缓冲区。当然,它可以使用与FILEprintf 的情况下为stdout)关联的 stdio 缓冲区,但如果程序使用setbuf/setvbuf 关闭缓冲,它可能是零长度。 printf 也有可能有一个内部缓冲区;对于正确的 C 实现,这将需要自动存储(“在堆栈上”),但是没有线程的低质量嵌入式存储可能会使用静态缓冲区。在任何情况下,printf 都被指定为通过重复调用fputc 来工作,而且它当然可以在没有任何缓冲区的情况下以这种方式实现。

【讨论】:

    【解决方案2】:

    它依赖于库而不是编译器,您应该查阅库的文档以及可能的源代码。这(可能已经过时)IAR C Library documentation 说:

    由于一个完整的格式化程序需要大量空间,因此有几个 不同的格式化程序可供选择。有关详细信息,请参阅 请参阅 IAR C 编译器参考指南。

    current IAR compiler reference 讨论了格式化程序的选择,但在大多数情况下,链接器可以自动选择最合适的格式化程序。该文档甚至讨论了重建库时可用的进一步优化(您可能需要源许可证)。

    某些实现(不是专门为 IAR)使用大量堆栈空间。如果您想要完全控制,您可以考虑使用开源实现,例如 Tiny printf。它不是一个完整的 ISO 实现,但适用于许多嵌入式应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多