新手入门
- 积分
- 1
- 金钱
- 1
- 注册时间
- 2025-4-27
- 在线时间
- 2 小时
|
2金钱
本帖最后由 xuanyt 于 2025-4-29 10:26 编辑
zynq7020的板子,UCOSiii操作系统,文件系统uc/fs+uc/usbh(USBHOST),读写U盘出现超时现象。
参考 在Zynq平台上使用uCOS [原创www.cnblogs.com/helesheng] - helesheng - 博客园,地址:https://www.cnblogs.com/helesheng/p/17369210.html#_label0,下载mirium的压缩包ucos_v1_45.7z,是UCOS的1.45版本针对Xilinx Zynq平台的定制版。这个版本可能包含了源码、配置文件、文档、示例工程以及必要的库文件,用于开发者在Zynq平台上快速集成和使用UCOS。
按照帖子中的方法,最终创建了自己的工程。在板级支持包(BSP)工程的配置文件system.mss中选择添加了ucos_usbh。
此时工程中在U盘上创建文件,读写文件都正常,但是对文件频繁读写时会出现U盘不被识别的现象,串口打印提示“FSDev_MSC_Open(): Could not rd MSC dev w/USB err: 1402.”
正常流程:
在读写U盘时 USBH_BulkRx()->USBH_SyncXfer()发出异步传输操作,然后在 USBH_OS_SemWait() 中 OSSemPend()等待usb的中断返回结果,然后进行下次传输。
中断处理函数EHCI_ISR()收到中断状态,并处理结果,然后调用EHCI_QHDone()->USBH_URB_Done()中的 “(void)USBH_OS_SemPost(USBH_URB_Sem)”把中断结果返回给发起传输的 USBH_BulkRx()函数。
OSSemPend()在收到USBH_OS_SemPost()后,继续接下来的操作。
出错现象:
跟踪调试代码,在usbh_os.c652行("return (USBH_ERR_OS_TIMEOUT);")加上断点,发现在程序运行一段时间后出现OSSemPend()函数等待(usb中断返回结果)超时。
在OSSemPend()和EHCI_ISR()分别加上计数后发现,正常的USBH_OS_SemWait和USBH_OS_SemPost应该是一对一的,但此时中断返回结果比等待端少,从而造成了等待超时。
如果读写的是eMMC或者SD卡时没有出现等待中断超时的现象。
只在读写U盘的时候出现,并且在zynq7021B开发板上不但有等待usb中断超时现象,还有读写U盘特别慢的现象,感觉usbhost远远没有达到usb2.0的速度。
不知道是哪里的问题,为什么异步传输的操作,中断态没有返回正确结果。不知道这个中断是丢失了,还是被别的中断冲掉了。这个问题困扰了几个星期了。
哪位兄弟也遇到过类似的情况吗? |
|