OpenEdv-开源电子网

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

请问原子的F4的U盘读写程序,综合例程与单独例程为啥不同?

[复制链接]

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-9-16
在线时间
0 小时
发表于 2015-6-22 11:25:30 | 显示全部楼层 |阅读模式
5金钱
我用F107的USB OTG做U盘HOST,并且加上文件系统FATFS,运行正常,能够读写U盘文件了。但是,加上UCOS后,总是死机,仿真跟踪,发现总是死在DRESULT disk_read ( BYTE drv,BYTE *buff,DWORD sector,BYTE count ) 这个函数里,此函数里读U盘状态总是处于忙状态,死循环了。我也仿照原子的综合例程,加入了临界保护和8字节对齐,但还是不行。
于是我打开了原子的F4的实验53和综合例程,对比了一下有无UCOS时的代码,如下: 
首先是实验53的disk_read子程序,原子改名为如下:
u8 USBH_UDISK_Read(u8* buf,u32 sector,u32 cnt)
{
 u8 res=1;
 if(HCD_IsDeviceConnected(&USB_OTG_Core)&&AppState==USH_USR_FS_TEST)//??????????,????APP????×???
 {       
  do
  {
   res=USBH_MSC_Read10(&USB_OTG_Core,buf,sector,512*cnt);
   USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host);       
   if(!HCD_IsDeviceConnected(&USB_OTG_Core))
   {
    res=1;//?????í?ó
    break;
   };  
  }while(res==USBH_MSC_BUSY);
 }else res=1;   
 if(res==USBH_MSC_OK)res=0; 
 return res;
}
然后是综合例程的代码:
u8 USBH_UDISK_Read(u8* buf,u32 sector,u32 cnt)
{
 u8 res=1;
 u32 retry=0;
 if(HCD_IsDeviceConnected(&USB_OTG_Core_dev)&&AppState==USH_USR_FS_TEST)//??????????,????APP????×???
 {       
  do
  {
   res=USBH_MSC_Read10(&USB_OTG_Core_dev,buf,sector,512*cnt);
   USBH_MSC_HandleBOTXfer(&USB_OTG_Core_dev ,&USB_Host);       
   if(!HCD_IsDeviceConnected(&USB_OTG_Core_dev))
   {
    res=1;//?????í?ó
    break;
   };
   retry++;
  }while(res==USBH_MSC_BUSY&&retry<0X7FFFFFF);
  if(retry==0X7FFFFFF)res=1;
 }else res=1;   
 if(res==USBH_MSC_OK)res=0; 
 return res;
}

比较一下,有两点不同。一是USB句柄名称由USB_OTG_Core改为USB_OTG_Core_dev,这个估计不是问题,只是个名字;二是原子在综合例程里对检测U盘状态的次数做了限制,使用了局部变量retry。而我恰巧就死在这里,总是检测U盘忙,也就是res==USBH_MSC_BUSY总是为真,因此就死循环了。那么原子为啥在综合例程里加上retry<0X7FFFFFF以便对循环次数做限制呢?  我试验了一下,在我的程序里也对循环次数做限制了,retry<3,则就不死循环了,但也无法读U盘内容了,直接跳过去了。
我想问的是,为啥裸奔都挺好的,完全正常,而加上UCOS后,虽然U盘枚举都正常,并且也能初始化文件系统了,if ( f_mount( 0, &fatfs ) != FR_OK ) 执行很正常,而且还读到了U盘容量,但只要一开始读U盘里的文件内容,使用到了DRESULT disk_read函数(原子改名为USBH_UDISK_Read),则立刻死在里面了。莫名其妙啊!弄了好几天了,请大侠帮忙,谢谢啦!

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

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-9-16
在线时间
0 小时
 楼主| 发表于 2015-6-22 11:36:50 | 显示全部楼层
跟USB中断是否有关系?    USB的中断只有一个,我也加上UCOS的进入退出中断的函数啦。而且若中断有问题,则USB枚举和读U盘容量都不会成功吧,而我都成功了,只是在读U盘内容时死循环了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-23 20:24:47 | 显示全部楼层
防止死机用的。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1370
金钱
1370
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-6-23 21:18:29 | 显示全部楼层
STM的USB是用状态机制实现的,所以一定要让底层(USB事务处理函数)处理完数据再操作应用层(文件系统),要不然丢数据死机是很正常的。
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1370
金钱
1370
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-6-23 21:22:38 | 显示全部楼层
回复【2楼】清风明月逍遥云:
---------------------------------
USb中断作用在检测USB设备,枚举数据传输都不在中断里。换句话说STM的USB通讯的实现本来就是裸奔的,就算加上操作系统,对于USB这部分还是单机的。。。
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2015-12-3 16:39:04 | 显示全部楼层
回复【5楼】solo:
---------------------------------
也就是说,在UCOS上,想实现SD卡连上电脑模拟U盘的同时MCU向SD卡读写数据,这个功能不可能实现么。。。
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1370
金钱
1370
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-12-4 08:27:32 | 显示全部楼层
回复【6楼】void:
---------------------------------
没说不能。例如,我现在的读写U盘的工作模式:USB处理是一个线程,数据操作是一个线程,两个线程通过队列通讯。而所有的文件操作都放在ST的“USBH_USR_MSC_Application”函数里,也就是说外边是没有文件操作的,数据只通过队列才能传进来。USB处理线程里是检测和处理,但是从头到尾不管是检测还是处理调的都是一个函数“USBH_Process”。如果你想文件操作一次导出一个大文件,而只执行一次“USBH_Process”的话,结果丢数。我是每512字节执行一次“USBH_Process”,写成线程时为了方便实现后台USB也能工作。不知道有没有更好的做法,如果USB部分能完全嵌入到操作系统的话谁管啥时候要执行一下“USBH_Process”。
回复

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2067
金钱
2067
注册时间
2012-5-26
在线时间
292 小时
发表于 2015-12-4 08:48:05 | 显示全部楼层
虽然做过stm32 flash模拟u盘和usb模拟串口,但是使用官方的例程简单移植一下就可以了,对usb底层的具体流程还是不是很清晰了解
以后可能还会用到USB HOST,mark一下,方便以后理解。
活着才是王道!健康是一切的前提!
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2015-12-4 09:02:19 | 显示全部楼层
回复【7楼】solo:
---------------------------------
谢谢。
我想实现的功能就是把板子通过USB线连上电脑,让电脑把SD卡识别成U盘,可以通过电脑来读取文件,复制粘贴文件。同时,MCU给SD卡挂载Fatfs文件系统进行读写。

可是发现每次一连上电脑,板子上的fatfs就挂载失败,更别提读写了。
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1370
金钱
1370
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-12-4 09:07:50 | 显示全部楼层
回复【9楼】void:
---------------------------------
这个不就是USB读卡器嘛,搜一搜有做的
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2015-12-4 09:17:09 | 显示全部楼层
回复【10楼】solo:
---------------------------------
读卡器这个功能已经实现了。问题就是读卡器和MCU读写SD卡这两个功能不能同时工作。

单独MCU挂载fatfs读写SD卡文件没问题,然后单独把SD卡模拟成U盘也没问题。

但是把两个功能合起来,让SD卡模拟成U盘的同时MCU读写SD卡就不行。
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1370
金钱
1370
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-12-4 09:37:54 | 显示全部楼层
回复【11楼】void:
---------------------------------
这个没鼓捣过,不过你这个应该是从机吧
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2015-12-4 09:50:41 | 显示全部楼层
回复【12楼】solo:
---------------------------------
对,板子这部分是从机,电脑是主机
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1370
金钱
1370
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-12-4 09:55:06 | 显示全部楼层
回复【13楼】void:
---------------------------------
我说的都是单片机做主机。。。
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2015-12-4 10:42:46 | 显示全部楼层
回复【14楼】solo:
---------------------------------
好吧,不过感觉你对USB的理解比我强多了
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2017-4-11
在线时间
31 小时
发表于 2017-5-2 15:53:59 | 显示全部楼层
能给个例程吗,244748015@qq.com
我USB加上ucosiii,上电调度是成功的,一插上USB就死机,我认为是中断延时问题,不能实现调度,所以求下代码
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-21 20:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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