fsmcu 发表于 2010-4-16 16:44:27

请教RT_USING_DFS的初始化问题

在startup.c调用dfs_init();elm_init();初始化文件系统,系统运行起来会出现swi_handler异常,如果参照网路收音机程序,在一个线程中调用这2个初始化函数,系统运行就没有问题,调试发现跟dlock互斥资源有关,请教一下dfs_init();elm_init();是不是一定要在线程中初始化才行呢?

ffxz 发表于 2010-4-16 19:14:49

是的,需要在任务中初始化文件系统。

dlock是一个mutex,在线程还未启动时是不能持有mutex的。mutex有所有权属性,持有者必须是一个线程。

fsmcu 发表于 2010-4-16 22:16:57

我的系统里面只用到SD卡,调用dfs_mount("sd0", "/SD", "elm", 0, 0),执行到        fs = dfs_filesystem_lookup(fullpath);fs为空直接返回DFS_STATUS_ENOENT;导致mount SD卡失败,调试发现如果将SD卡mount为一个root director就没有问题,请问是不是一定要先mount一个root directory,然后才能在root dirctory下面mount其他分区呢?

aozima 发表于 2010-4-16 22:42:40

"/SD" 必须存在. 你只有一个所以,不能.
如果有两个,"/" 也必须在前面.
且"/"里面要有"/SD".如果原"/SD"里面有内容,则看不见了(实际上还在).

fsmcu 发表于 2010-4-17 10:15:46

你的意思是,我系统里面只用到SD卡设备,是可以这样用dfs_mount("sd0", "/SD", "elm", 0, 0)来mount一个SD盘

aozima 发表于 2010-4-17 11:19:36

回复【4楼】fsmcu
你的意思是,我系统里面只用到SD卡设备,是可以这样用dfs_mount("sd0", "/SD", "elm", 0, 0)来mount一个SD盘
-----------------------------------------------------------------------
不能,你只能 dfs_mount("sd0", "/", "elm", 0, 0) 来挂载到根目录.

如果你还有一个SD卡可以,则可以挂载到前一个SD卡的SD这个子目录.
dfs_mount("sd1", "/SD", "elm", 0, 0)

ffxz 发表于 2010-4-17 13:21:33

除了根目录外,你mount的目标目录必须存在,否则mount失败。

fsmcu 发表于 2010-4-17 14:00:49

哦,了解,比如系统里面有SD卡设备,SPI Flash设备,nand flash设备,还有SDRam划分出一部分空间做文件系统,按照使用电脑习惯分区理解的话可以分成4个分区C,D,E,F,在RT里面就应该是先一个根目录区(比如SDRam),然后其他几个分区/SD /SPI /NAND,这样就会理解成SDRam和其余3个分区是属于包含关系,相当于是目录和子目录的关系

fsmcu 发表于 2010-4-21 15:59:46

回复【6楼】ffxz
除了根目录外,你mount的目标目录必须存在,否则mount失败。
-----------------------------------------------------------------------
我现在的系统里面有SD卡,2个U盘,所以mount这3个分区如下

dfs_mount("sd", "/", "elm", 0, 0)
dfs_mount("usb0", "/usb0", "elm", 0, 0)
dfs_mount("usb1", "/usb1", "elm", 0, 0)
mount /usb0 和 /usb1失败,

对比网络收音机:
dfs_mount("spi0", "/", "elm", 0, 0)
dfs_mount("sd0", "/SD", "elm", 0, 0)
filesystem_table初始化时都是清0,也没有做什么特别的动作,

应该要如何解决这个问题呢?

softwind 发表于 2010-4-22 08:48:45

我的理解,你的SD卡上应该有/usb0,和/usb1两个目录才可以;另外你需要注册“usb0”和“usb1”两个设备。不过你的系统是怎么接U盘的呢?STM32的USB口只是device,你的系统是有自己的USB Host接口吗?

fsmcu 发表于 2010-4-22 09:34:19

我用的不是STM32,CPU上面有USB HOST功能,按照楼上的理解,那网络收音机里面就变的SPI flash里面应该已经创建好了SD这个目录文件夹,可是我看程序
dfs_mount("spi0", "/", "elm", 0, 0)
dfs_mount("sd0", "/SD", "elm", 0, 0)
连续做2个mount动作,而不是说先mount了spi0,然后再创建SD目录,最后去mount sd0

ffxz 发表于 2010-4-22 09:37:48

根目录不需要创建即可mount,因为它是第一装载点

/SD目录不可能每次都在代码中创建出来,所以需要在finsh shell中执行命令
mkdir("/SD")

以后运行就都会装载成功。或者另一个方法,在装载之前先判断目录是否存在,不存在主动创建它,然后再装载。
页: [1]
查看完整版本: 请教RT_USING_DFS的初始化问题