我的设备 USB 同时启用MSC 可移动磁盘 + CDC 虚拟串口。
MSC 功能完全正常;CDC 上行稳定运行两年无任何问题。
CDC 下行此前没做过完整测试,现在出现大约每 20 个字节就会出现 1 字节错乱。
PC 端用 TeraTerm 串口工具,上行 CDC 一直用来打印调试日志。
按下键盘输入字符时触发 CDC 接收中断;
我有一个简易 FreeRTOS 任务,把收到的数据原样回发输出,就在这里观测到数据错乱。
关闭某些无关 FreeRTOS 任务后,数据损坏直接消失;但这些任务逻辑和 USB 完全无关。因此我怀疑 USB 底层存在未做临界区保护的代码段,FreeRTOS 任务抢占切换破坏了 USB 接收时序 / 缓冲区。
这两个 CDC 接收函数是 CubeMX 标准生成代码里的接口。
但本项目三年前由其他人基于 CubeMX 创建,底层 USB 驱动沿用了自动生成的框架。
|
|