OpenEdv-开源电子网

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

FATfs文件系统的多扇区读写

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-6-5
在线时间
0 小时
发表于 2012-6-6 09:46:09 | 显示全部楼层 |阅读模式
看FATfs文件系统的资料中提到,FATfs支持多扇区读写,底层代码需要支持一次读写多个扇区和一次读一个扇区两种情况,但是即使底层支持多扇区读写,在实际操作的时候还是一个扇区一个扇区的写。本来以为这个源代码只需要改diskio.c里的disk_read几个函数即可。现在看来,查找所有引用发现引用disk_read和disk_write的全是指定扇区个数为 1,所以想要支持多扇区读写是不是得把 ff.c 里面引用 disk_read 和 disk_write的扇区个数改成多个扇区数 即可??
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-6 11:03:08 | 显示全部楼层
回复【楼主位】luorixiehui:
---------------------------------
哪里要改ff.c??
只需要修改diskio.c即可!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-6-5
在线时间
0 小时
 楼主| 发表于 2012-6-6 11:17:23 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢正点原子。
你的意思是说 ff.c 中已经支持了多扇区读写吗?

拿diskio.c 中的disk_read来说,
DRESULT disk_read (   BYTE drv, BYTE *buff,  DWORD sector,   BYTE count ),在ff.c里调用disk_read的时候count =1,那下面读多扇区也没用啊?
在f_read中唯一调用disk_read count值不为1的地方是:
cc = btr / SS(fp->fs); /* When remaining bytes >= sector size, */
if (cc) { /* Read maximum contiguous sectors directly */
if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ 
cc = fp->fs->csize - fp->csect;
if (disk_read(fp->fs->drive, rbuff, sect, (BYTE)cc) != RES_OK)
ABORT(fp->fs, FR_DISK_ERR);
可是我单步进去发现 (BYTE)cc) 还是1,虽然if (cc)处cc不为1,但是每次还是只读1个。

什么情况呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-6 11:46:12 | 显示全部楼层
回复【3楼】luorixiehui:
---------------------------------
不要以偏概全.
你设置个printf,每次读写的时候输出count的值,再看看吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-6-5
在线时间
0 小时
 楼主| 发表于 2012-6-6 14:10:59 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
好,谢谢.
我打印了,真的全是1,。。。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-6-5
在线时间
0 小时
 楼主| 发表于 2012-6-6 14:37:15 | 显示全部楼层
回复【4楼】正点原子:
--------------------------------
好吧,是这样的。

如果 ffconf.h中
#define _MAX_SS 512
那么在实现读写的时候,我打印了,是8个扇区。

我之前的设置是#define _MAX_SS 4096
打印的时候是1个扇区。

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-6 14:49:32 | 显示全部楼层
哦哦...
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-6-5
在线时间
0 小时
 楼主| 发表于 2012-6-6 16:00:22 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原来是因为FAT32的分区大小和簇大小有对应关系,小于8GB的分区,每个簇的空间大小为4K,所以如果单个扇区大小设置为512的话,单个簇的扇区个数为8,可以读写8个扇区;如果单个扇区大小设置为4096的话,单个簇的扇区个数为1,就是读写1个扇区了。

那 你说,如果在这种情况下我希望提高读写速度,是不是只能手动将 ff.c 里读写的count 做更改了呢? 你可以给点意见吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-6 16:17:19 | 显示全部楼层
回复【8楼】luorixiehui:
---------------------------------
建议换sdio,会比较靠谱.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 04:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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