【发布时间】: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