发数据之前需要检查上一个包发完了没有,如果没发完,等待上一个包发完 ...
所以,我在发送前加了一句 while(bUsbInBusy) ,亲测有效,看来Printf发送还是挺慢的,比USB_SendData慢得多的多。 bkeuqoaq 发表于 2024-11-18 16:41
printf是不可重入函数,一般在主循环调用,中断里不要调用了
你这情况只有调用printf前关中断救才行 ...
是的,我觉得也是printf重入问题
深圳国芯人工智能有限公司-核心功能实验板 (stcai.com)
现写了个测试程序
使用一箭双雕测试,按住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内都处理完毕,否则会拖慢速度
这12个合成一个就好了
DebugLab 发表于 2024-11-18 18:18
这12个合成一个就好了
首先,非常感谢做了这么详细的测试!
一个Printf我试过输出多个参数,搞多了直接乱码,不得不拆开的。
我这里面有好多是32位的类型,处理速度比%bx慢了好多。
晓飛飛 发表于 2024-11-18 21:56
首先,非常感谢做了这么详细的测试!
一个Printf我试过输出多个参数,搞多了直接乱码,不得不拆开的。
很简单呀, 重写个可重入的 Printf 函数, 不就解决了吗 LAOXU 发表于 2024-11-26 03:26
很简单呀, 重写个可重入的 Printf 函数, 不就解决了吗
嗯,已经解决了
页:
1
[2]