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 等!
谢谢! 假设系统中有三个文件系统:
/ --> 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搞定)。 RT_USING_DFS 这个宏定义是定义设备文件系统的,也就是虚拟文件系统。
虚拟文件系统可以挂载多个具体的文件系统,比如FAT,EXT,YAFFS等。
而RT_USING_DFS_ELMFAT 这个宏定义就是定义具体的FAT文件系统的。
所以你要使用SD卡的话需要同时定义RT_USING_DFS和RT_USING_DFS_ELMFAT。 再说驱动的事:
假设现在存储媒介有: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的块设备驱动。 mark 学习了 学习了,晚上下班回去试试! 回复【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 形式?
谢谢! 是的,mount的时候其目录需要先存在(除非装载到/和/dev这两个目录,后面那个/dev是为以后的设备文件系统预留的)
ELM FatFs支持的文件系统格式是:FAT12/16/32。如果是SD卡,让windows格式化一遍即可。 那是不是说我们只能存储和读取的文件都只是sd 这个文件夹里面的东西呢? 回复【9楼】reynold520
那是不是说我们只能存储和读取的文件都只是sd 这个文件夹里面的东西呢?
-----------------------------------------------------------------------
?装载(mount)的意思是把一个文件系统(类似于Windows一个分区吧)给装载到相应的目录上,所以这个目录下的文件操作就仅局限于相应的文件系统中,而其他的目录则不同,分别属于原来的文件系统。 dfs_mount("sd0", "/sd", "elm", 0, 0); /* 请保证在根目录下sd目录存在 */
是不是可以这样理解,如果我把"/sd", 改成 "/",就可以把这个文件系统装载到整个sd卡内呢? mount 到 /sd上也是把sd卡的整个卡装载上了,没少任何东西 学习 开始学习时,我也有很多的疑问,但一边看源码一边看手册,除了GUI较复杂外,感觉其他的都很好懂。
RTT的代码结构相当好,条理清晰。我喜欢。 回来测试了下,发现时sdcard_initialize 这个初始化不成功,好像是send_cmd(CMD0, 0) 的时候不能返回1 ,导致不能读写文件。。
这个时候应该和我卡是哪种格式化没关系的啊,,查了下好像是说初始化的时序不对。
有用这个板子调试成功过的兄弟没,大概会是哪里不通呢? 楼上的是什么板子? LM3S8962 的板子,现在发现是SVN 代码里面的SDCS 管教定义错误,本来是PORTG 的定义到PORTD 上了,我在看代码的时候没有仔细对引脚,导致Sd初始化不成功。
现在已经可以读写了。。。
太粗心了,汗! 应该是板子配置不同,默认的RT-Thread/LM3S工程不是针对LM3S8962开发板,我们没有这块开发板,TI也不送啊~~ 恩,明白了,
经过网上的修改已经可以读写sd卡内的文件了,下一步就是把文件列表全部列出来并显示驱动以前的27元TFT了,hoho 回复【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);了? 关于文件系统 的读写的问题还要请教下:
read(fd, buffer, size);
read()函数会把参数fd所指的文件传送count个字节到buf指针所指的内存中,但是如果我一次只能开辟512 byte的内存,这样我一次的buffer 只能读512 个byte,那如果我的文件有大于512 个byte 的话,我需要怎么指定他的地址能够连续的把一个文件读完呢?
谢谢! 试了下,是不是只要一直调用read(fd, buffer, size); 函数的值就可以了?
好像只要open 后返回了一个fd 的值,然后一直用read 函数去读取知道read 函数返回0 了就表示文件读取完了 ? 现在文件系统支持nand flash了?是不是要格式化nand flash后,就可以用dfs_mount("mtd0", "/mtd", "elm", 0, 0);了? read返回0一般指示出文件结束。
nand flash的文件系统,会在9月前给出,是带擦写均衡的,首先会应用于STM32 Radio。 大概什么时候会出第二版的radio 套件啊? 回复【24楼】ffxz
read返回0一般指示出文件结束。
nand flash的文件系统,会在9月前给出,是带擦写均衡的,首先会应用于stm32 radio。
-----------------------------------------------------------------------
那就是下个月了。期待ing...... 回复【24楼】ffxz
read返回0一般指示出文件结束。
nand flash的文件系统,会在9月前给出,是带擦写均衡的,首先会应用于stm32 radio。
-----------------------------------------------------------------------
nand flash的文件系统是不是搞出来了? 回复【27楼】gavin_li
nand flash的文件系统是不是搞出来了?
-----------------------------------------------------------------------
-_-,还没有,发觉nand flash 2k页和以前的512页完全不一样,所以以前的代码需要重写,然后未成功。
原本是打算在下一版的STM32 Radio中能够提供相应的擦鞋均衡代码的,不过添加nand flash成本也将显著的增加增加(从发的那个图也可以看得出,是留有nand flash的位置) 没有LM的板子 回复【3楼】ffxz
-----------------------------------------------------------------------
请问如何在根目录("/")下,产生("/SD"),("/SPI0")等等子目录? mark 回复【30楼】gary12kuo
回复【3楼】ffxz
-----------------------------------------------------------------------
请问如何在根目录("/")下,产生("/sd"),("/spi0")等等子目录?
-----------------------------------------------------------------------
mkdir("/sd")
mkdir("/spi0") mark RTT文件系统学习
页:
[1]