reynold520 发表于 2010-7-19 21:57:52

RT thread 文件系统学习 疑问?

在使用RT thread   文件系统时遇到点问题,
按我理解,如果我要用到文件系统,需要把 RT_USING_DFS 这个宏定义打开,如果我还要用到ELM 的话需要在把 RT_USING_DFS_ELMFAT 这个打开就好了,
不用到的话就不需要打开了。

问题是:
如果我不用到ELM ,那我打开读取一个文件的话是不是就用open() read() 函数就好了,而用ELM 的话就是用 dfs_elm_open() dfs_elm_read,

在ff.c 里还有f_openf_read   这三种我要怎么选择呢?

现在我在用LM 3s8962 的代码调试miniSD 卡文件读写的时候,按照编程指南里面的写法

        fd = open(TEST_FN, O_WRONLY|O_CREAT,0);
        if (fd >= 0)
        {
                size=write(fd, s, sizeof(buffer));
                close(fd);
        }

        rt_thread_delay(100);

       
        fd = open(TEST_FN, O_RDONLY, 0);
        if (fd >= 0)
        {
                size=read(fd, buffer, sizeof(buffer));
                close(fd);
        }

发现在OPEN 的时候返回给fd 的值为0xFFFFFF,打不开文件,会是什么问题呢?

我打开的宏只有 RT_USING_DFS还有对于miniSd 卡是否需要先格式化成什么规定的格式呢? 比方说NTF 或者FAT 等!

谢谢!

ffxz 发表于 2010-7-19 22:49:38

假设系统中有三个文件系统:
/    --> romfs
/sd--> ELM FatFs
/nfs --> network file system v3

应用想打开并读取三个文件:
/readme.txt
/sd/readme.txt
/nfs/readme.txt

那么调用的接口是:
fd = open("/readme.txt", O_RDONLY, 0);
read(fd, buffer, size);

fd = open("/sd/readme.txt", O_RDONLY, 0);
read(fd, buffer, size);

fd = open("/nfs/readme.txt", O_RDONLY, 0);
read(fd, buffer, size);

...
OK,上层应用搞定,收工(后面的事情RT-Thread搞定)。

shaolin 发表于 2010-7-19 22:53:07

RT_USING_DFS 这个宏定义是定义设备文件系统的,也就是虚拟文件系统。
虚拟文件系统可以挂载多个具体的文件系统,比如FAT,EXT,YAFFS等。
而RT_USING_DFS_ELMFAT 这个宏定义就是定义具体的FAT文件系统的。
所以你要使用SD卡的话需要同时定义RT_USING_DFS和RT_USING_DFS_ELMFAT。

ffxz 发表于 2010-7-19 22:54:33

再说驱动的事:
假设现在存储媒介有:SD卡,spi flash,nand flash

分别需要在上面装载文件系统,那么需要调用:
dfs_mount("sd0", "/sd", "elm", 0, 0);   /* 请保证在根目录下sd目录存在 */
dfs_mount("spi0", "/spi", "elm", 0, 0); /* 请保证在根目录下spi目录存在 */
dfs_mount("mtd0", "/mtd", "elm", 0, 0); /* 请保证在根目录下mtd目录存在 */

然后就可以开始读写上面的文件了(在使用前请保证上面存在文件系统,否则RT-Thread如何知道上面的格式是否正确,文件需要到哪里去取)。

sd0、spi0、mtd0都必须要实现成RT-Thread的块设备驱动。

fengzi2003 发表于 2010-7-19 23:27:59

mark

cat_li 发表于 2010-7-20 08:22:13

学习了

reynold520 发表于 2010-7-20 08:34:39

学习了,晚上下班回去试试!

reynold520 发表于 2010-7-20 12:46:47

回复【3楼】ffxz
再说驱动的事:
假设现在存储媒介有:sd卡,spi flash,nand flash
分别需要在上面装载文件系统,那么需要调用:
dfs_mount("sd0", "/sd", "elm", 0, 0);   /* 请保证在根目录下sd目录存在 */
dfs_mount("spi0", "/spi", "elm", 0, 0); /* 请保证在根目录下spi目录存在 */
dfs_mount("mtd0", "/mtd", "elm", 0, 0); /* 请保证在根目录下mtd目录存在 */
然后就可以开始读写上面的文件了(在使用前请保证上面存在文件系统,否则rt-thread如何知道上面的格式是否正确,文件需要到哪里去取)。
sd0、spi0、mtd0都必须要实现成rt-thread的块设备驱动。
-----------------------------------------------------------------------

关于这些还有点疑问:
是不是说我先要在根目录先建立一个sd 的文件夹?

(在使用前请保证上面存在文件系统,否则rt-thread如何知道上面的格式是否正确,文件需要到哪里去取)。
存在文件系统是? 格式化成FAT32 形式?

谢谢!

ffxz 发表于 2010-7-20 12:50:52

是的,mount的时候其目录需要先存在(除非装载到/和/dev这两个目录,后面那个/dev是为以后的设备文件系统预留的)

ELM FatFs支持的文件系统格式是:FAT12/16/32。如果是SD卡,让windows格式化一遍即可。

reynold520 发表于 2010-7-20 14:30:20

那是不是说我们只能存储和读取的文件都只是sd 这个文件夹里面的东西呢?

ffxz 发表于 2010-7-20 17:21:06

回复【9楼】reynold520
那是不是说我们只能存储和读取的文件都只是sd 这个文件夹里面的东西呢?
-----------------------------------------------------------------------

?装载(mount)的意思是把一个文件系统(类似于Windows一个分区吧)给装载到相应的目录上,所以这个目录下的文件操作就仅局限于相应的文件系统中,而其他的目录则不同,分别属于原来的文件系统。

reynold520 发表于 2010-7-20 18:34:18

dfs_mount("sd0", "/sd", "elm", 0, 0);   /* 请保证在根目录下sd目录存在 */

是不是可以这样理解,如果我把"/sd", 改成 "/",就可以把这个文件系统装载到整个sd卡内呢?

ffxz 发表于 2010-7-20 21:49:27

mount 到 /sd上也是把sd卡的整个卡装载上了,没少任何东西

eworker 发表于 2010-7-20 21:55:11

学习

cyxavr 发表于 2010-7-20 22:37:00

开始学习时,我也有很多的疑问,但一边看源码一边看手册,除了GUI较复杂外,感觉其他的都很好懂。
RTT的代码结构相当好,条理清晰。我喜欢。

reynold520 发表于 2010-7-20 22:51:37

回来测试了下,发现时sdcard_initialize 这个初始化不成功,好像是send_cmd(CMD0, 0) 的时候不能返回1 ,导致不能读写文件。。

这个时候应该和我卡是哪种格式化没关系的啊,,查了下好像是说初始化的时序不对。

有用这个板子调试成功过的兄弟没,大概会是哪里不通呢?

aozima 发表于 2010-7-20 22:53:38

楼上的是什么板子?

reynold520 发表于 2010-7-20 23:17:56

LM3S8962 的板子,现在发现是SVN 代码里面的SDCS 管教定义错误,本来是PORTG 的定义到PORTD 上了,我在看代码的时候没有仔细对引脚,导致Sd初始化不成功。

现在已经可以读写了。。。

太粗心了,汗!

ffxz 发表于 2010-7-21 08:03:01

应该是板子配置不同,默认的RT-Thread/LM3S工程不是针对LM3S8962开发板,我们没有这块开发板,TI也不送啊~~

reynold520 发表于 2010-7-21 08:21:44

恩,明白了,

经过网上的修改已经可以读写sd卡内的文件了,下一步就是把文件列表全部列出来并显示驱动以前的27元TFT了,hoho

gavin_li 发表于 2010-7-21 14:40:54

回复【3楼】ffxz
再说驱动的事:
假设现在存储媒介有:sd卡,spi flash,nand flash
分别需要在上面装载文件系统,那么需要调用:
dfs_mount("sd0", "/sd", "elm", 0, 0);   /* 请保证在根目录下sd目录存在 */
dfs_mount("spi0", "/spi", "elm", 0, 0); /* 请保证在根目录下spi目录存在 */
dfs_mount("mtd0", "/mtd", "elm", 0, 0); /* 请保证在根目录下mtd目录存在 */
然后就可以开始读写上面的文件了(在使用前请保证上面存在文件系统,否则rt-thread如何知道上面的格式是否正确,文件需要到哪里去取)。
sd0、spi0、mtd0都必须要实现成rt-thread的块设备驱动。
-----------------------------------------------------------------------

现在文件系统支持nand flash了?是不是要格式化nand flash后,就可以用dfs_mount("mtd0", "/mtd", "elm", 0, 0);了?

reynold520 发表于 2010-7-21 22:20:05

关于文件系统 的读写的问题还要请教下:

read(fd, buffer, size);

read()函数会把参数fd所指的文件传送count个字节到buf指针所指的内存中,但是如果我一次只能开辟512 byte的内存,这样我一次的buffer 只能读512 个byte,那如果我的文件有大于512 个byte 的话,我需要怎么指定他的地址能够连续的把一个文件读完呢?

谢谢!

reynold520 发表于 2010-7-21 22:32:45

试了下,是不是只要一直调用read(fd, buffer, size); 函数的值就可以了?

好像只要open 后返回了一个fd 的值,然后一直用read 函数去读取知道read 函数返回0 了就表示文件读取完了 ?

gavin_li 发表于 2010-7-23 10:03:54

现在文件系统支持nand flash了?是不是要格式化nand flash后,就可以用dfs_mount("mtd0", "/mtd", "elm", 0, 0);了?

ffxz 发表于 2010-7-23 10:42:09

read返回0一般指示出文件结束。

nand flash的文件系统,会在9月前给出,是带擦写均衡的,首先会应用于STM32 Radio。

reynold520 发表于 2010-7-23 12:58:33

大概什么时候会出第二版的radio 套件啊?

gavin_li 发表于 2010-7-23 13:51:44

回复【24楼】ffxz
read返回0一般指示出文件结束。
nand flash的文件系统,会在9月前给出,是带擦写均衡的,首先会应用于stm32 radio。
-----------------------------------------------------------------------

那就是下个月了。期待ing......

gavin_li 发表于 2010-8-30 11:16:56

回复【24楼】ffxz
read返回0一般指示出文件结束。
nand flash的文件系统,会在9月前给出,是带擦写均衡的,首先会应用于stm32 radio。
-----------------------------------------------------------------------
nand flash的文件系统是不是搞出来了?

ffxz 发表于 2010-8-30 22:32:59

回复【27楼】gavin_li
nand flash的文件系统是不是搞出来了?
-----------------------------------------------------------------------

-_-,还没有,发觉nand flash 2k页和以前的512页完全不一样,所以以前的代码需要重写,然后未成功。

原本是打算在下一版的STM32 Radio中能够提供相应的擦鞋均衡代码的,不过添加nand flash成本也将显著的增加增加(从发的那个图也可以看得出,是留有nand flash的位置)

neilxiang 发表于 2010-9-1 09:39:23

没有LM的板子

gary12kuo 发表于 2010-11-22 00:22:08

回复【3楼】ffxz
-----------------------------------------------------------------------

请问如何在根目录("/")下,产生("/SD"),("/SPI0")等等子目录?

rocket432 发表于 2010-12-2 15:02:50

mark

ffxz 发表于 2010-12-3 19:35:21

回复【30楼】gary12kuo
回复【3楼】ffxz
-----------------------------------------------------------------------
请问如何在根目录("/")下,产生("/sd"),("/spi0")等等子目录?
-----------------------------------------------------------------------

mkdir("/sd")
mkdir("/spi0")

阿莫张 发表于 2012-11-14 18:46:03

mark            

linuxxulin 发表于 2012-11-16 21:22:22

RTT文件系统学习
页: [1]
查看完整版本: RT thread 文件系统学习 疑问?