at32使用外部flash,通过usb device口虚拟U盘, 按步骤加入虚拟U盘后,PC端,盘符可以显示
但pc一旦向虚拟U盘写入文件就会卡死,文件越大(100K以上),越频繁。
首先项目功能以前测试完毕,线程较多,使用了1个网口,2个spi口,4个串口等等
部分线程如下,(已经删减过线程的,但写入虚拟U盘仍会卡死)
搜索后发现 之前论坛上也有类似问题https://club.rt-thread.org/ask/question/80dc6c3aa4af96d0.html
找来stm32的开发板实际测试,空项目下,单独测试虚拟U盘,没有问题。
此时怀疑是项目内线程过多的问题,删除多余线程,重新测试,终于可以正常读写了
使用bus hound 抓包发现卡死时,几乎都是在 TEST UNIT READY 和 WRITE命令同时发送时产生的,命令长时间无响应,就会复位usb了
单片机端打印usb调试信息
正常写入时
写入卡死时
猜测是rt-thread线程切换需要频繁的开关中断,导致虚拟u盘卡顿甚至卡死。
求教如何在正常的项目中使用好虚拟U盘功能呢?
目的是解决线程少时的卡顿问题,线程多时的卡死问题
搜索中发现的有用资料
USB设备枚举过慢的问题解决
RT-Thread:STM32F407虚拟U盘,无法识别拔出问题解决方案
补充一张 卡死时 bus hound 抓包的图片
后续测试发现rt-thread下stm32的虚拟u盘,仅仅是卡顿,没有出现卡死情况
rt-thread下at32的虚拟U盘,即使时少线程的情况下,反复测试仍会不定时出现卡死的情况。。。
单独烧录AT32F435_437_Firmware_Library_V2.1.2 中的虚拟U盘例程,写入测试不会卡死
最终使用了一个笨办法,调试时发现 在_ep_out_handler函数内增加rt_kprintf会导致卡死几率大大提升
所以猜测应该是_ep_out_handler函数受外部中断影响所致,此函数最终是在rt_usbd_thread_entry线程内被调用的,所以简单修改如下(执行函数_data_notify时,屏蔽中断,此处无法使用调度器上锁,会报错):
此时写入文件仍会有卡顿现象,但不会死机,大文件也可完成写入。
另外测试中尝试提高线程rt_usbd_thread_entry优先级,无效。提高USB中断优先级也是无效的
AT32的flash中我使用了qboot占去了前面的128K,且本身项目占用了近400k,AT32只有前面256k是零等待的flash。后面的运行速度较慢。应该是flash的运行速度,拖累的usb代码的运行
最终此问题的解决 参看这个 AT32F437 USB HOST及device 使用问题总结