OpenEdv-开源电子网

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

fatfs使用中碰到的问题

[复制链接]

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-9-4
在线时间
0 小时
发表于 2015-2-26 15:17:03 | 显示全部楼层 |阅读模式
5金钱
公司的的东西换了平台,移植了fatfs 到4g的tf卡上面(fat32格式)。0.09c版本的。能够使用
但是使用中碰到问题:
1.间或出现只读取文件,正确的文件还是变成了错误。表现在:文件名字和内容出现错误。不能被删除。
2.tf卡间或会出现到电脑上无法打开的问题。在win7上面可以格式化,xp还不行。有时所有的电脑系统都不能格式化。只能调用f_mkfs,格式化。

搞的头大,不知道什么原因。
公司这个工程,用了ucos系统,任务比较多。文件读写都没有用临界区做保护。(但是都没有用到全局变量)不知道是不是因为读写过程被打断呢?(感觉在用keil,debug的时候问题出现的比较多)
还有就是使用了如下代码:

[mw_shl_code=c,true]f_status = f_write(&fileHandle, w_data, sizetow, &writtenSize); if(f_status || writtenSize!= sizetow) return 1; f_status = f_close(&fileHandle); if(f_status) return 1;[/mw_shl_code]
我想问,如果write返回错误,是不是也要调用close呢?我这里如果写失败,就不会close了。

还请大神解惑。

最佳答案

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

如果多个任务可能同时访问sd卡的话,会出现莫名奇妙的问题,所以FATFS要加锁才行。 可以参考我们的战舰板综合实验
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-26 15:17:04 | 显示全部楼层
如果多个任务可能同时访问sd卡的话,会出现莫名奇妙的问题,所以FATFS要加锁才行。
可以参考我们的战舰板综合实验
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-9-4
在线时间
0 小时
 楼主| 发表于 2015-2-26 16:34:00 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子大神

请问一下具体是哪个实验的,哪个部分?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-26 17:56:11 | 显示全部楼层
实验58...
diskio.c
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-9-4
在线时间
0 小时
 楼主| 发表于 2015-2-27 09:48:00 | 显示全部楼层
 回复【4楼】 正点原子 :
---------------------------------
是这里的么?
http://www.openedv.com/posts/list/13912.htm

应该下载图中哪一个的资料啊?

回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-9-4
在线时间
0 小时
 楼主| 发表于 2015-2-27 10:23:33 | 显示全部楼层
 回复【4楼】 正点原子 :
---------------------------------

是这一段么?

[mw_shl_code=c,true]///////////////////////////////////////////////////////////////////////////////////// OS_CPU_SR cpu_sr=0; void ff_enter(void) { OS_ENTER_CRITICAL();//进入临界区(无法被中断打断) } void ff_leave(void) { OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断) } ///////////////////////////////////////////////////////////////////////////////////// //动态分配内存 void *ff_memalloc (UINT size) { return (void*)mymalloc(SRAMIN,size); } //释放内存 void ff_memfree (void* mf) { myfree(SRAMIN,mf); }[/mw_shl_code]



这几个函数不需要实现么?
我是在标准例程-V3.5库函数版本:实验56 战舰STM32开发板综合实验 里面查找的。
[mw_shl_code=c,true] /* Sync functions */ #if _FS_REENTRANT int ff_cre_syncobj (BYTE, _SYNC_t*);/* Create a sync object */ int ff_req_grant (_SYNC_t); /* Lock sync object */ void ff_rel_grant (_SYNC_t); /* Unlock sync object */ int ff_del_syncobj (_SYNC_t); /* Delete a sync object */ #endif[/mw_shl_code]

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-9-4
在线时间
0 小时
 楼主| 发表于 2015-2-28 11:03:52 | 显示全部楼层
 回复【8楼】 正点原子 :
---------------------------------
我增加下面函数的实现
[mw_shl_code=c,true]#if _FS_REENTRANT int ff_cre_syncobj (BYTE vol, _SYNC_t* sobj); /* Create a sync object */ int ff_req_grant (_SYNC_t sobj); /* Lock sync object */ void ff_rel_grant (_SYNC_t sobj); /* Unlock sync object */ int ff_del_syncobj (_SYNC_t sobj); /* Delete a sync object */ #endif[/mw_shl_code]

用的是fatfs的syscall.c
[mw_shl_code=c,true]#include <stdlib.h> /* ANSI memory controls */ #include "../ff.h" #if _FS_REENTRANT /* This function is called in f_mount function to create a new / synchronization object, such as semaphore and mutex. When a zero is / returned, the f_mount function fails with FR_INT_ERR. */ int ff_cre_syncobj ( /* TRUE:Function succeeded, FALSE:Could not create due to any error */ BYTE vol, /* Corresponding logical drive being processed */ _SYNC_t *sobj /* Pointer to return the created sync object */ ) { int ret; u8 err; *sobj = OSMutexCreate(0, &err); /* uC/OS-II */ ret = (err == OS_ERR_NONE); return ret; } /*------------------------------------------------------------------------*/ /* Delete a Synchronization Object */ /*------------------------------------------------------------------------*/ /* This function is called in f_mount function to delete a synchronization / object that created with ff_cre_syncobj function. When a zero is / returned, the f_mount function fails with FR_INT_ERR. */ int ff_del_syncobj ( /* TRUE:Function succeeded, FALSE:Could not delete due to any error */ _SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ ) { int ret; u8 err; OSMutexDel(sobj, OS_DEL_ALWAYS, &err); /* uC/OS-II */ ret = (err == OS_ERR_NONE); return ret; } /*------------------------------------------------------------------------*/ /* Request Grant to Access the Volume */ /*------------------------------------------------------------------------*/ /* This function is called on entering file functions to lock the volume. / When a zero is returned, the file function fails with FR_TIMEOUT. */ int ff_req_grant ( /* TRUE:Got a grant to access the volume, FALSE:Could not get a grant */ _SYNC_t sobj /* Sync object to wait */ ) { int ret; u8 err; OSMutexPend(sobj, _FS_TIMEOUT, &err); /* uC/OS-II */ ret = (err == OS_ERR_NONE); return ret; } /*------------------------------------------------------------------------*/ /* Release Grant to Access the Volume */ /*------------------------------------------------------------------------*/ /* This function is called on leaving file functions to unlock the volume. */ void ff_rel_grant ( _SYNC_t sobj /* Sync object to be signaled */ ) { OSMutexPost(sobj); /* uC/OS-II */ } #endif[/mw_shl_code]

并且按照原子的例子增加了

[mw_shl_code=c,true]extern void ff_enter(void); extern void ff_leave(void); #define ENTER_FF(fs) {ff_enter();}//{OS_ENTER_CRITICAL();}//进入FATFS,关闭中断,防止相互干扰 #define LEAVE_FF(fs, res) {ff_leave();return res;}//{OS_EXIT_CRITICAL();return res;}//离开FATFS,开启中断,任务继续执行[/mw_shl_code]
[mw_shl_code=c,true]OS_CPU_SR cpu_sr=0; void ff_enter(void) { OS_ENTER_CRITICAL();//进入临界区(无法被中断打断) } void ff_leave(void) { OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断) }[/mw_shl_code]

不知道为什么f_mount都失败了。之前是可以的。导致tf卡都不能用,还请指教啊。



回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-9-4
在线时间
0 小时
 楼主| 发表于 2015-2-28 11:37:35 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子大神不好意思,我吧OSInit放到f_mount后面了。所以出错。调整了之后,至少可以使用了。
但是运行了一会,就发生了,文件夹损坏,不能读取的问题。。。。有些数据也没有写进去。。。
也不能删除,只能在电脑上把卡格式化了。

不知道能不能发一个原子板子工程例子的下载地址参考一下啊?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-28 22:23:17 | 显示全部楼层
回复【10楼】caiwei_cs:
---------------------------------
论坛置顶帖
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-9-4
在线时间
0 小时
 楼主| 发表于 2015-3-2 10:58:33 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
请问 是 下面的哪一个啊?
2)战舰STM32F103ZET6开发板资料
战舰STM32开发板A盘资料源码等+小部分视频,压缩包):http://pan.baidu.com/s/1c0xVmlM
战舰STM32开发板B盘资料视频教程在这里,压缩包):http://pan.baidu.com/s/1nt8wTD3
ALIENTEK 战舰STM32开发板A盘资料(文件夹形式):http://pan.baidu.com/s/1jG63i0e
ALIENTEK 战舰STM32开发板B盘资料(文件夹形式):http://pan.baidu.com/s/1hqh4LTE
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-3 23:15:29 | 显示全部楼层
回复【12楼】caiwei_cs:
---------------------------------
战舰板A盘,程序源码,解压寄存器版本例程,见:实验56, 综合实验
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2015-12-3 16:31:26 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
原子哥,这样用开关中断的方式是不是不太好阿
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2014-4-18
在线时间
25 小时
发表于 2016-1-13 10:35:13 | 显示全部楼层
会影响任务调度的吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 18:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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