Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
[求助]关于elmfat文件的挂载[已解决_第2页]
发布于 2013-03-26 14:53:17 浏览:5018
订阅该版
以前用V0.3的时候fat的挂载完全没问题,现在把操作系统升级到V1.1.0版,忽然fat就出现了问题,对比下发现是在如下函数中出现了问题: ``` int dfs_elm_mount(struct dfs_filesystem *fs, unsigned long rwflag, const void *data) { FATFS *fat; FRESULT result; BYTE index; /* handle RT-Thread device routine */ for (index = 0; index < _VOLUMES; index ++) { if (disk[index] == RT_NULL) { break; } } if (index == _VOLUMES) return -DFS_STATUS_ENOSPC; /* get device */ disk[index] = fs->dev_id; fat = (FATFS *)rt_malloc(sizeof(FATFS)); if (fat == RT_NULL) { return -1; } /* mount fatfs, always 0 logic driver */ result = f_mount(index, fat); if (result == FR_OK) { char drive[8]; DIR * dir; rt_snprintf(drive, sizeof(drive), "%d:/", index); dir = (DIR *)rt_malloc(sizeof(DIR)); if (dir == RT_NULL) return -DFS_STATUS_ENOMEM; /* open the root directory to test whether the fatfs is valid */ result = f_opendir(dir, drive); if (result != FR_OK) { rt_free(dir); return elm_result_to_dfs(result); } rt_free(dir); fs->data = fat; } else { rt_free(fat); return elm_result_to_dfs(result); } return 0; }``` 主要是多了f_opendir这个函数,然后进行向下调用chk_mounted,然后继续调用fmt = check_fs(fs, bsect = 0);最终是在0xAA55那边return了。之前的fat是mount后直接赋值的所以我想把f_opendir这部分注释掉骗过去,结果……呵呵。这个错误卡了好几天了求助啊求助。
查看更多
12
个回答
默认排序
按发布时间排序
doushinide
2013-03-26
这家伙很懒,什么也没写!
我挂载了2个文件系统,fat在根目录,uffs在/dev,现在uffs过了,fat出现问题了。 ``` void rt_init_thread_entry(void *parameter) { int fd; rt_uint8_t i,buf_size, spare_buf_size; rt_uint8_t reg_read,reg_write; unsigned int index; rt_components_init(); #ifdef RT_USING_DFS { rt_kprintf("
Init... "); /* init the device filesystem */ if(dfs_mount("nor", "/", "elm", 0, 0)==0) { rt_kprintf("
Nor FS initialized! "); rt_kprintf("
...........................[PASS] "); } else { rt_kprintf("
Nor FS init failed! "); rt_kprintf("
...........................[FAULT] "); } if (dfs_mount("nand", "/dev", "uffs", 0, 0) == 0) { rt_kprintf("
Nand FS initialized! "); rt_kprintf("
...........................[PASS] "); } else { rt_kprintf("
Nand FS init failed! "); rt_kprintf("
...........................[FAULT] "); } rt_kprintf("---------------------------------------- "); …… ``` 配置宏文件如下: ``` #define RT_USING_DFS_ELMFAT #define RT_DFS_ELM_WORD_ACCESS #define RT_DFS_ELM_DRIVES 2 #define RT_DFS_ELM_USE_LFN 1 #define RT_DFS_ELM_MAX_LFN 255 #define RT_DFS_ELM_MAX_SECTOR_SIZE 2048 /* SECTION: DFS options */ /* the max number of mounted filesystem */ #define DFS_FILESYSTEMS_MAX 2 /* the max number of opened files */ #define DFS_FD_MAX 12 /* the max number of cached sector */ #define DFS_CACHE_MAX_NUM 2 ```
aozima
2013-03-26
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
磁盘需要预先格式化,以前并没有做这个检查,所以不管磁盘是否有问题都可以挂载成功,只是不能访问。
doushinide
2013-03-26
这家伙很懒,什么也没写!
>磁盘需要预先格式化,以前并没有做这个检查,所以不管磁盘是否有问题都可以挂载成功,只是不能访问。 --- 请问是要在mount elm之前插一句nor_format功能的函数吗?我在github中下载了prife更新的mkfs without format 的几个文件,但是没有在mount前加入格式化,还是没有挂载成功。唉
aozima
2013-03-26
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
如果在挂载之前加入格式化,那数据丢了算谁的呢? 所以肯定是由用户自己按需要去格式化,一般都是人工手动格式化(mkfs)。
doushinide
2013-03-26
这家伙很懒,什么也没写!
>如果在挂载之前加入格式化,那数据丢了算谁的呢? >所以肯定是由用户自己按需要去格式化,一般都是人工手动格式化(mkfs)。 --- 我把程序下进去,然后进行手动格式化,复位重启,依然挂载不上。 mkfs在V1.1.0里面已经变成了dfs_elm_mkfs,而且f_mkfs变了一个参数呢,我在程序里直接调用的dfs_elm_mkfs,我看到要使用mkfs貌似需要finsh我没有添加这个组件,所以直接用dfs_elm_mkfs也可以吧? 又是一天 [s:183] [s:183] [s:183] 现在开始怀疑nor驱动程序了 照着数据手册一点点对照ing……
haitao52198
2013-03-26
这家伙很懒,什么也没写!
调用dfs_mkfs吧,如果你之前初始化过文件系统。。。。 格式化之前需要先mount一下,mount的时候会把文件系统与设备驱动关联起来。
prife
2013-03-26
这家伙很懒,什么也没写!
需要保证SD卡或者spi flash等设备中已经正确格式化。否则就挂载就会失败。 原来0.3.0里就算是一张空白的SD卡也会显示挂载成功了。这是不合理的。所以1.1.0里解决了这个问题。 所以如果现在挂在失败,那么执行 mkfs("elm", "sd0") 格式化fatfs,然后应该就可以正确挂载了。
doushinide
2013-03-27
这家伙很懒,什么也没写!
谢谢各位,请问有V1.1.0版本的FAT挂载的例子吗?
prife
2013-03-27
这家伙很懒,什么也没写!
>谢谢各位,请问有V1.1.0版本的FAT挂载的例子吗? --- 挂载还需要什么例子么? 挂载代码没什么变化。你之所以挂在失败,是因为没有SD卡/Flash上没有有效的FAT分区,格式化即可!!! bsp/simulator里就有Fat挂载的例子。 示意图: ``` | / - RT - Thread Operating System / | 1.2.0 build Mar 26 2013 2006 - 2012 Copyright by rt-thread team fatfs initialization failed! finsh /> ``` 看到没有,Fatfs挂在失败。那么接下来格式化SD卡(或者把卡插在PC机上格式化也是一样的) ``` | / - RT - Thread Operating System / | 1.2.0 build Mar 26 2013 2006 - 2012 Copyright by rt-thread team fatfs initialization failed! finsh />mkfs("elm", "sd0") 0, 0x00000000 finsh /> ``` 然后复位系统 ``` | / - RT - Thread Operating System / | 1.2.0 build Mar 26 2013 2006 - 2012 Copyright by rt-thread team fatfs initialized! finsh /> ```
doushinide
2013-03-29
这家伙很懒,什么也没写!
经过反复查找终于找到了原因,如下: V0.3.2 的 dfs_elm.c文件中,以下函数传入底层驱动函数的值与V1.1.0中的不同,由于本人驱动程序没变直接升级操作系统版本,结果杯具了~ ``` DRESULT disk_read (BYTE drv, BYTE *buff, DWORD sector, BYTE count) { rt_size_t result; rt_device_t device = disk[drv]; #if _MAX_SS != 512 rt_size_t s_size = fs_tab[drv]->s_size; #else rt_size_t s_size = 512; #endif result = rt_device_read(device, sector * s_size, buff, count * s_size); if (result == count * s_size) { return RES_OK; } return RES_ERROR; } /* Write Sector(s) */ DRESULT disk_write (BYTE drv, const BYTE *buff, DWORD sector, BYTE count) { rt_size_t result; rt_device_t device = disk[drv]; #if _MAX_SS != 512 rt_size_t s_size = fs_tab[drv]->s_size; #else rt_size_t s_size = 512; #endif result = rt_device_write(device, sector * s_size, buff, count * s_size); if (result == count * s_size) { return RES_OK; } return RES_ERROR; } ``` V1.1.0的dfs_elm.c文件中: ``` /* Read Sector(s) */ DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, BYTE count) { rt_size_t result; rt_device_t device = disk[drv]; result = rt_device_read(device, sector, buff, count); if (result == count) { return RES_OK; } return RES_ERROR; } /* Write Sector(s) */ DRESULT disk_write(BYTE drv, const BYTE *buff, DWORD sector, BYTE count) { rt_size_t result; rt_device_t device = disk[drv]; result = rt_device_write(device, sector, buff, count); if (result == count) { return RES_OK; } return RES_ERROR; } ``` 由于rt_device_read/write的参数发生了改变,所以发生mkfs OK却挂不上去的情况. 参照realtouch例程中的spi_flash_w25qxx.c 文件的 w25qxx_flash_read/write函数修改代码,pos*2048,size*2048,问题解决。 ``` static rt_size_t w25qxx_flash_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) { flash_lock((struct spi_flash_device *)dev); w25qxx_read(pos*spi_flash_device.geometry.bytes_per_sector, buffer, size*spi_flash_device.geometry.bytes_per_sector); flash_unlock((struct spi_flash_device *)dev); return size; } static rt_size_t w25qxx_flash_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) { flash_lock((struct spi_flash_device *)dev); w25qxx_page_write(pos*spi_flash_device.geometry.bytes_per_sector, buffer, size*spi_flash_device.geometry.bytes_per_sector); flash_unlock((struct spi_flash_device *)dev); return size; } ```
撰写答案
登录
注册新账号
关注者
0
被浏览
5k
关于作者
doushinide
这家伙很懒,什么也没写!
提问
7
回答
32
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
env中添加lvgl软件包后,keil编译包--c99错误
2
【NXP-MCXA153】 定时器驱动移植
3
GD32F450 看门狗驱动适配
4
【NXP-MCXA153】看门狗驱动移植
5
RT-Thread Studio V2.2.9 Release Note
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
红枫
5
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
10
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部