硬汉嵌入式论坛

 找回密码
 立即注册
查看: 184|回复: 1
收起左侧

[μCOS-III] zynq7000+UCOSiii+U盘读写出错,等待中断超时

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2025-4-28 16:25:17 | 显示全部楼层 |阅读模式
本帖最后由 xuanyt 于 2025-4-29 10:16 编辑

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的速度。

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

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

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115723
QQ
发表于 2025-4-29 11:52:00 | 显示全部楼层
帮顶。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-14 13:07 , Processed in 0.222542 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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