printf的格式化缓冲区在哪里?

Tho*_*ews 4 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 > 0)
  {
    Serial_Port_Output(temp_buffer, bytes_written);
  }
Run Code Online (Sandbox Code Playgroud)

我想切换到printf直接写入串口.根据我们的编译器文档,我拦截了函数调用以输出数据以使用串行端口.(接口使用块写入:地址和字符数).

printf函数可以使用字符缓冲区进行格式化,例如整数或浮点到文本.

问题:

  1. printf用于格式化的缓冲区在哪里?(在我做出改变之前,其他有探究的人都想知道.)
  2. 这是编译器(平台)依赖的问题吗?

平台:Arm7tdmi处理器,片上系统(SOC),IAR EW编译器.

R..*_*R.. 13

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