晓飛飛 发表于 2024-11-18 16:52:14

DebugLab 发表于 2024-11-18 16:14
发数据之前需要检查上一个包发完了没有,如果没发完,等待上一个包发完 ...

所以,我在发送前加了一句 while(bUsbInBusy) ,亲测有效,看来Printf发送还是挺慢的,比USB_SendData慢得多的多。

DebugLab 发表于 2024-11-18 17:04:03

bkeuqoaq 发表于 2024-11-18 16:41
printf是不可重入函数,一般在主循环调用,中断里不要调用了
你这情况只有调用printf前关中断救才行 ...

是的,我觉得也是printf重入问题

神农鼎 发表于 2024-11-18 17:06:12



深圳国芯人工智能有限公司-核心功能实验板 (stcai.com)

DebugLab 发表于 2024-11-18 18:11:30

现写了个测试程序
使用一箭双雕测试,按住P32按键发数据

没有while(bUsbInBusy);也不会出错




为了观察是否有while(bUsbInBusy);阶段,使用IO口输出状态,接LED发现有低电平点亮


接逻辑分析仪观察,大约几K的频率,等待时间约8%~43%,不固定
既然存在重入问题,while(bUsbInBusy);还是有必要的



尝试每个时间周期内只执行1次printf,确保每个printf间隔50ms


还是反复进入while(bUsbInBusy);等待过程,但是等待时间变短了
继续减慢发送频率到1Hz


10个参数的CDC_Printf发送256次需要224ms
改为100Hz,10个参数的CDC_Printf只发送1次,
LED不亮,波形也是直线,说明没有等待阶段




这就说明Printf是不能瞬间调用多次的,两个Printf之间必须要有延时
只能在一个Printf内都处理完毕,否则会拖慢速度



DebugLab 发表于 2024-11-18 18:18:32


这12个合成一个就好了

晓飛飛 发表于 2024-11-18 21:56:47

DebugLab 发表于 2024-11-18 18:18
这12个合成一个就好了
首先,非常感谢做了这么详细的测试!

一个Printf我试过输出多个参数,搞多了直接乱码,不得不拆开的。
我这里面有好多是32位的类型,处理速度比%bx慢了好多。

LAOXU 发表于 2024-11-26 03:26:47

晓飛飛 发表于 2024-11-18 21:56
首先,非常感谢做了这么详细的测试!

一个Printf我试过输出多个参数,搞多了直接乱码,不得不拆开的。

很简单呀, 重写个可重入的 Printf 函数, 不就解决了吗

晓飛飛 发表于 2024-11-26 07:52:24

LAOXU 发表于 2024-11-26 03:26
很简单呀, 重写个可重入的 Printf 函数, 不就解决了吗

嗯,已经解决了
页: 1 [2]
查看完整版本: USB_CDC 使用Printf遇到丢数问题