找回密码
 立即注册
楼主: 晓飛飛

USB_CDC 使用Printf遇到丢数问题

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-11-18 16:52:14 | 显示全部楼层
Debu*** 发表于 2024-11-18 16:14
发数据之前需要检查上一个包发完了没有,如果没发完,等待上一个包发完 ...

所以,我在发送前加了一句 while(bUsbInBusy) ,亲测有效,看来Printf发送还是挺慢的,比USB_SendData慢得多的多。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-18 17:04:03 | 显示全部楼层
bkeu*** 发表于 2024-11-18 16:41
printf是不可重入函数,一般在主循环调用,中断里不要调用了
你这情况只有调用printf前关中断救才行 ...

是的,我觉得也是printf重入问题
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-11-18 17:06:12 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-18 18:11:30 | 显示全部楼层
现写了个测试程序
使用一箭双雕测试,按住P32按键发数据

没有while(bUsbInBusy);也不会出错
截图202411181719523865.jpg

截图202411181720036159.jpg

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

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

截图202411181732483184.jpg

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

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

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

截图202411181806419954.jpg

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

USB_CDC.zip (36.17 KB, 下载次数: 35)

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-18 18:18:32 | 显示全部楼层

这12个合成一个就好了
截图202411181818059077.jpg

点评

我试过,搞多了直接乱码,不得不拆开的。  详情 回复 发表于 2024-11-18 21:56
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-11-18 21:56:47 | 显示全部楼层
Debu*** 发表于 2024-11-18 18:18
这12个合成一个就好了

首先,非常感谢做了这么详细的测试!

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

点评

很简单呀, 重写了可重入的 Printf 函恋数, 不就解决了吗  详情 回复 发表于 2024-11-26 03:26
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-11-26 03:26:47 | 显示全部楼层
晓*** 发表于 2024-11-18 21:56
首先,非常感谢做了这么详细的测试!

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

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

点评

嗯,已经解决了  详情 回复 发表于 2024-11-26 07:52
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-11-26 07:52:24 来自手机 | 显示全部楼层
LAOXU 发表于 2024-11-26 03:26
很简单呀, 重写个可重入的 Printf 函数, 不就解决了吗

嗯,已经解决了
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 08:49 , Processed in 0.146510 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表