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

标签 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);
  }

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

printf 函数可以使用字符缓冲区进行格式化,例如将整数或 float 转换为文本。

问题:

  1. printf 用于格式化的缓冲区在哪里? (其他 在我进行更改之前,好奇的人想知道。)
  2. 这是编译器(平台)相关问题吗?

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

最佳答案

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

关于c++ - printf 的格式化缓冲区在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26182415/

相关文章:

c - GCC将常量指针和常量整数放入不同的内存区域

c++ - 使用 C++ 解析非常大的 CSV 文件

C++代码分析工具

在 C 中将三个 8 位整数连接为一个 16 位整数

c - 为什么不能使用指针的指针作为参数来声明函数接收数组指针

c - 辛科斯去哪儿了? (海湾合作委员会c)

c++ - 在构造函数初始化列表中转换值 C++

c++ - MPI 代码在超过 2 个节点/进程的最终确定时挂起

c - 在嵌入式环境中全局声明还是静态声明更安全?

c - 嵌入式 C - 函数参数太多(指针)