C:有没有办法降低printf-outputs的速度

时间:2018-02-09 09:06:32

标签: c printf microcontroller

如标题中所述,有没有办法降低C中printf输出的速度?就像看着特别打印的每个角色一样(它不必太慢,只是让你理解我的意思)。

我问的原因是:

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

这样做
//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;

其中LINFLEX_0.BDRL.B.DATA0表示发送寄存器。我认为我现在的问题是什么:printfs只是快速覆盖寄存器,所以它没有时间再次发送任何存储在其中的字符。当从数组中通过char发送char时,我等到设置了data-transmission-flag:

Sub foo()
Dim c As Range
For Each c In ActiveSheet.Range("A1:A1000")
    If IsDate(c) Then
        c.Value = Format(c, "dd.mm.yyyy")
    End If
Next
End Sub

因此,想法是减慢printfs处理每个角色的速度,但如果有人有其他想法,可以随意评论。

1 个答案:

答案 0 :(得分:2)

问题不在于printf,而在于底层的UART驱动程序。这就是你必须调整的内容。如果您正在使用Codewarrior for MPC56,您实际上可以查看所有这些的源代码:相当可怕的代码。弄乱它只会变坏 - 显然它一开始似乎并不好用。

在这些嵌入式应用程序中使用printf总体上是一个非常糟糕的主意,因为该功能几乎不适用于任何目的,尤其是UART通信。 printf的出现实际上是一个项目已经出现严重错误的指标,很可能已被PC程序员劫持。这不是一个编程问题,而是一个经理问题。

从技术上讲,这里唯一明智的做法就是抛弃你项目中的所有垃圾。这意味着一切都与stdio.h类似。而是根据可用的飞思卡尔示例编写自己的UART驱动程序。使其适用于字节。这也使您能够添加自定义功能,例如" echo",其中MCU必须等待来自接收器的回复。或者你可以用DMA实现它,如果你只想将数据写入缓冲区然后忘掉它的全部内容。