首页 文章

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

提问于
浏览
0

如 Headers 中所述,有没有办法降低C中printf-outputs的速度?就像看着特别打印的每个角色一样(它不一定非常慢,只是让你理解我的意思) .

我问的原因是:

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

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

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

//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处理每个角色的速度,但如果有人有其他想法,可以随意发表评论 .

1 回答

  • 2

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

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

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

相关问题