OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 80|回复: 1

zynq7000+UCOSiii+U盘读写出错,等待中断超时

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2025-4-27
在线时间
2 小时
发表于 2025-4-28 16:15:23 | 显示全部楼层 |阅读模式
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应该是一对一的,但此时中断返回结果比等待端少,从而造成了等待超时。

微信图片_20250428163527.png


如果读写的是eMMC或者SD卡时没有出现等待中断超时的现象。
只在读写U盘的时候出现,并且在zynq7021B开发板上不但有等待usb中断超时现象,还有读写U盘特别慢的现象,感觉usbhost远远没有达到usb2.0的速度。

不知道是哪里的问题,为什么异步传输的操作,中断态没有返回正确结果。不知道这个中断是丢失了,还是被别的中断冲掉了。这个问题困扰了几个星期了。

哪位兄弟也遇到过类似的情况吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 昨天 22:18 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 19:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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