【问题标题】:C: Is there a way to lower the speed of printf-outputsC: 有没有办法降低 printf-outputs 的速度
【发布时间】:2018-02-09 09:06:32
【问题描述】:

如标题中所述,有没有办法降低 C 中 printf 输出的速度?就像看每个字符都被特别打印出来(它不必那么慢,只要你明白我的意思)。

我问的原因是:

我需要对一个小型微控制器进行编程。但是在其上执行的每个“printf”都应该被发送回主机的 com1 端口。一切正常,我已经缓冲了我的 printf,因此所有内容都将存储在具有有限大小的 char 数组中,并且该数组将按字符发送回 com1 char。但是因为我不知道会有多少个 printfs,并且由于 μC 的内存有限,所以限制大小的数组并不是最好的解决方案。所以我的新尝试是直接写入μC的发送寄存器,它一次只能包含一个字符,直到它被发送。我这样做是通过

setvbuf(stdout, LINFLEX_0.BDRL.B.DATA0, _IOFBF, 1);

其中 LINFLEX_0.BDRL.B.DATA0 代表发送寄存器。我认为我现在的问题是:printfs 只是将寄存器覆盖为快速,因此在再次更改之前没有时间发送存储在其中的任何字符。当从数组中逐个字符发送时,我等到设置了数据传输标志:

//write character to transmit buffer
LINFLEX_0.BDRL.B.DATA0 = buffer[j];
// Wait for data transmission completed flag
while (1 != LINFLEX_0.UARTSR.B.DTF) {}  
// Clear DTF Flag
LINFLEX_0.UARTSR.R = 0x0002;

所以想法是减慢 printfs 处理每个字符的速度,但如果有人有其他想法,请随时发表评论。

【问题讨论】:

  • 你的缓冲技术是如何工作的?不能在这里重复一下逻辑吗?
  • Printf 使用 putchar 函数,所以如果您编写自己的 putchar 函数,就可以了
  • 你用的是什么uC?有 DMA 吗?
  • @JonnySchubert 我已经编写了自己的 printf 并且只是用上面描述的寄存器写入替换了屏幕的输出。问题是我不能用我自己的 printf 函数覆盖 C 中的标准 printf。对 DMA:是的,32 个 eDMA 通道。我正在使用 MPC5646c 板
  • 标准 printf 函数通常使用抽象函数来传输单个字符。此功能可由用户改写。该名称取决于平台。这是STM electronics.stackexchange.com/questions/206113/…的示例

标签: c printf microcontroller


【解决方案1】:

问题不在于 printf 本身,而在于底层 UART 驱动程序。这就是你必须调整的。如果您使用的是 MPC56 的 Codewarrior,您实际上可以查看所有源代码:非常糟糕的代码。弄乱它只会变坏——而且显然它一开始似乎效果不佳。

在这类嵌入式应用程序中使用 printf 总体上是一个非常糟糕的主意,因为该函数几乎不适合任何用途,尤其是 UART 通信。 printf 的存在实际上表明项目出现了严重错误,很可能它已被 PC 程序员劫持。这不是真正的编程问题,而是经理问题。

从技术上讲,这里唯一明智的做法就是扔掉项目中的所有垃圾。这意味着一切都与 stdio.h 很相似。相反,请根据可用的飞思卡尔示例编写您自己的 UART 驱动程序。让它在字节上工作。这也使您能够添加自定义功能,例如“回声”,其中 MCU 必须等待接收器的回复。或者,如果您只想将数据写入缓冲区然后忘记它,您可以使用 DMA 来实现它。

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2022-08-06
    • 2015-09-16
    相关资源
    最近更新 更多