搜索
bottom↓
回复: 34

RT thread 文件系统学习 疑问?

[复制链接]

出0入0汤圆

发表于 2010-7-19 21:57:52 | 显示全部楼层 |阅读模式
在使用RT thread   文件系统时遇到点问题,
按我理解,如果我要用到文件系统,需要把 RT_USING_DFS 这个宏定义打开,如果我还要用到ELM 的话需要在把 RT_USING_DFS_ELMFAT 这个打开就好了,
不用到的话就不需要打开了。

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

在ff.c 里还有f_open  f_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 等!

谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 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搞定)。

出0入0汤圆

发表于 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。

出0入0汤圆

发表于 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的块设备驱动。

出0入0汤圆

发表于 2010-7-19 23:27:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-20 08:22:13 | 显示全部楼层
学习了

出0入0汤圆

 楼主| 发表于 2010-7-20 08:34:39 | 显示全部楼层
学习了,晚上下班回去试试!

出0入0汤圆

 楼主| 发表于 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 形式?

谢谢!

出0入0汤圆

发表于 2010-7-20 12:50:52 | 显示全部楼层
是的,mount的时候其目录需要先存在(除非装载到/和/dev这两个目录,后面那个/dev是为以后的设备文件系统预留的)

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

出0入0汤圆

 楼主| 发表于 2010-7-20 14:30:20 | 显示全部楼层
那是不是说我们只能存储和读取的文件都只是sd 这个文件夹里面的东西呢?

出0入0汤圆

发表于 2010-7-20 17:21:06 | 显示全部楼层
回复【9楼】reynold520  
那是不是说我们只能存储和读取的文件都只是sd 这个文件夹里面的东西呢?
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2010-7-20 18:34:18 | 显示全部楼层
dfs_mount("sd0", "/sd", "elm", 0, 0);   /* 请保证在根目录下sd目录存在 */

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

出0入0汤圆

发表于 2010-7-20 21:49:27 | 显示全部楼层
mount 到 /sd上也是把sd卡的整个卡装载上了,没少任何东西

出0入0汤圆

发表于 2010-7-20 21:55:11 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-7-20 22:37:00 | 显示全部楼层
开始学习时,我也有很多的疑问,但一边看源码一边看手册,除了GUI较复杂外,感觉其他的都很好懂。
RTT的代码结构相当好,条理清晰。我喜欢。

出0入0汤圆

 楼主| 发表于 2010-7-20 22:51:37 | 显示全部楼层
回来测试了下,发现时sdcard_initialize 这个初始化不成功,好像是send_cmd(CMD0, 0) 的时候不能返回1 ,导致不能读写文件。。

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

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

出0入0汤圆

发表于 2010-7-20 22:53:38 | 显示全部楼层
楼上的是什么板子?

出0入0汤圆

 楼主| 发表于 2010-7-20 23:17:56 | 显示全部楼层
LM3S8962 的板子,现在发现是SVN 代码里面的SDCS 管教定义错误,本来是PORTG 的定义到PORTD 上了,我在看代码的时候没有仔细对引脚,导致Sd初始化不成功。

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

太粗心了,汗!

出0入0汤圆

发表于 2010-7-21 08:03:01 | 显示全部楼层
应该是板子配置不同,默认的RT-Thread/LM3S工程不是针对LM3S8962开发板,我们没有这块开发板,TI也不送啊~~

出0入0汤圆

 楼主| 发表于 2010-7-21 08:21:44 | 显示全部楼层
恩,明白了,

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

出0入0汤圆

发表于 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);了?

出0入0汤圆

 楼主| 发表于 2010-7-21 22:20:05 | 显示全部楼层
关于文件系统 的读写的问题还要请教下:

read(fd, buffer, size);

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

谢谢!

出0入0汤圆

 楼主| 发表于 2010-7-21 22:32:45 | 显示全部楼层
试了下,是不是只要一直调用read(fd, buffer, size); 函数的值就可以了?

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

出0入0汤圆

发表于 2010-7-23 10:03:54 | 显示全部楼层
现在文件系统支持nand flash了?是不是要格式化nand flash后,就可以用dfs_mount("mtd0", "/mtd", "elm", 0, 0);了?

出0入0汤圆

发表于 2010-7-23 10:42:09 | 显示全部楼层
read返回0一般指示出文件结束。

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

出0入0汤圆

 楼主| 发表于 2010-7-23 12:58:33 | 显示全部楼层
大概什么时候会出第二版的radio 套件啊?

出0入0汤圆

发表于 2010-7-23 13:51:44 | 显示全部楼层
回复【24楼】ffxz  
read返回0一般指示出文件结束。
nand flash的文件系统,会在9月前给出,是带擦写均衡的,首先会应用于stm32 radio。
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-8-30 11:16:56 | 显示全部楼层
回复【24楼】ffxz  
read返回0一般指示出文件结束。
nand flash的文件系统,会在9月前给出,是带擦写均衡的,首先会应用于stm32 radio。
-----------------------------------------------------------------------
nand flash的文件系统是不是搞出来了?

出0入0汤圆

发表于 2010-8-30 22:32:59 | 显示全部楼层
回复【27楼】gavin_li  
nand flash的文件系统是不是搞出来了?
-----------------------------------------------------------------------

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

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

出0入0汤圆

发表于 2010-9-1 09:39:23 | 显示全部楼层
没有LM的板子

出0入0汤圆

发表于 2010-11-22 00:22:08 | 显示全部楼层
回复【3楼】ffxz  
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-12-2 15:02:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-3 19:35:21 | 显示全部楼层
回复【30楼】gary12kuo  
回复【3楼】ffxz  
-----------------------------------------------------------------------
请问如何在根目录("/")下,产生("/sd"),("/spi0")等等子目录?
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2012-11-14 18:46:03 | 显示全部楼层
mark            

出0入0汤圆

发表于 2012-11-16 21:22:22 | 显示全部楼层
RTT文件系统学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 09:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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