OpenEdv-开源电子网

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

读取U盘文件时,USBH_MSC_Read10()始终返回USBH_MSC_BUSY

[复制链接]

52

主题

147

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2019-4-1
在线时间
118 小时
发表于 2019-6-17 15:50:07 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 jshzp 于 2019-6-17 17:14 编辑

使用阿波罗开发板,f429芯片,读取U盘上文件“test0.bin”:
[mw_shl_code=c,true]            UCHAR buffer[3149];
            res=f_open(fsrc,"3:/test0.bin", FA_OPEN_EXISTING | FA_READ);
            res=f_read(fsrc,buffer,sizeof(buffer),&br);[/mw_shl_code]
执行上述代码中的f_open()函数时死机,经查找原因,该函数内调用
[mw_shl_code=c,true]res=USBH_MSC_Read10(&USB_OTG_Core,buf,sector,512*cnt);[/mw_shl_code]
时始终返回USBH_MSC_BUSY,结果导致进入死循环的。
进一步检查发现,如果buffer长度不超过3148时,就可以正常读出,超过后就会出现上述现象。另外,test0.bin文件长度约30KB,远大于buffer长度。

继续调试发现,如果改成下面的代码:
[mw_shl_code=c,true]UCHAR buffer0[3149],buffer[3149];
res=f_open(fsrc,"3:/DF8B.txt", FA_OPEN_EXISTING | FA_READ);
res=f_read(fsrc,buffer,sizeof(buffer),&br);
res=f_read(fsrc,buffer0,sizeof(buffer0),&br);//运行到这里死机[/mw_shl_code]
则可以正常运行,到第二次f_read()时死机。似乎这个问题和开数组有关系,网上有人说这个现象可能和编译器版本相关,我使用的是mdk514。求高手指教,非常感谢!





最佳答案

查看完整内容[请看2#楼]

局部变量太大了!! 局部变量不要超过100个字节。 超过就用全局,或者内存申请。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-6-17 15:50:08 | 显示全部楼层
jshzp 发表于 2019-6-18 16:14
今天继续折腾。。。。
经反复调试,注意到一些规律性的现象:
数组buffer不能开得太大,数组长度大于某个 ...

局部变量太大了!!
局部变量不要超过100个字节。
超过就用全局,或者内存申请。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-6-17 18:28:18 | 显示全部楼层
帮顶~~
回复

使用道具 举报

52

主题

147

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2019-4-1
在线时间
118 小时
 楼主| 发表于 2019-6-18 16:14:41 | 显示全部楼层
本帖最后由 jshzp 于 2019-6-18 16:20 编辑

今天继续折腾。。。。
经反复调试,注意到一些规律性的现象:
数组buffer不能开得太大,数组长度大于某个数值后就会出现上述问题。且不同代码写法情况下,这个数值不是固定的,例如用下面的代码:
[mw_shl_code=c,true]UCHAR buffer[2604];
res=f_open(fsrc,"3:/DF8B.txt", FA_OPEN_EXISTING | FA_READ);
for(;;)
{
       res=f_read(fsrc,buffer,sizeof(buffer),&br);
       if(res||br<sizeof(buffer))
             break;
}
f_close(fsrc);[/mw_shl_code]
则数组buffer长度不超过2604时,可以正常读出文件内容。
直觉判断:这个现象和硬件时序有关,也就是和晶振有关。当晶振精度越高时,buffer长度就可以比较长。目前我做实验的这张阿波罗板子上面的这颗晶振精度,上面两种代码写法情况下,buffer长度分别能达到3148和2604。
好了,勉强够用了,我打算实际用较短的512长度,且批量生产时,专门检测这个指标,也就是用2000长度去测试板子,正式代码则只用512。
但是,这个办法显然治标不治本。如果能找到具体出问题的时序,并通过修改相应代码,例如加个延时什么的,才能彻底解决这个问题。可惜这应该需要研究U盘时序,超出我的能力了。希望有高手能做下这方面的事情,彻底解决这个问题;或者有谁知道解决办法,请指教,非常感谢!
回复

使用道具 举报

52

主题

147

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
316
金钱
316
注册时间
2019-4-1
在线时间
118 小时
 楼主| 发表于 2019-6-19 13:03:12 | 显示全部楼层
正点原子 发表于 2019-6-19 00:54
局部变量太大了!!
局部变量不要超过100个字节。
超过就用全局,或者内存申请。

改成全局变量就没问题了,谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 01:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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