Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ printf的格式化缓冲区在哪里?_C++_C_Embedded_Printf_Iar - Fatal编程技术网

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实现。