完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
按照THEWON 使用了 yaffs2_rtt_mtd_device 的代码。也按照用例替换了mtd_nand.c/h 。现在能格式化并且挂载上。命令行mkdir能创建文件夹。也能创建文件。但是重新上电会消失。
代码里创建文件夹却失败。显示错误,返回值-28. 求助大佬。NAND Flash型号是MT29F64G08AFAAAWP。STM32f407。 |
|
相关推荐
1个回答
|
|
|
我们遇到了两个问题: 1. 使用命令行(如mkdir)可以创建文件夹和文件,但掉电后消失。 2. 在代码中创建文件夹失败,返回-28(ENOSPC,表示设备没有空间)。 首先,掉电后数据消失,说明数据没有被正确写入NAND Flash。可能的原因包括: - 文件系统没有正确同步(sync)或卸载(unmount)。 - 写入操作可能只写入了缓存,而没有实际写入到NAND Flash。 - 文件系统挂载参数或配置不正确。 其次,在代码中创建文件夹返回-28错误,这通常表示磁盘空间不足。但是,我们刚刚格式化过,不应该空间不足。可能的原因有: - 文件系统内部结构(如inode)使用完了。 - 文件系统初始化时分配的空间不足。 - 文件系统挂载时出现了错误,导致无法分配新的节点。 由于我们使用了yaffs2_rtt_mtd_device,并且替换了mtd_nand.c/h,我们需要检查以下几点: 1. **MTD层实现是否正确**:确保读写擦除操作都正确,特别是写操作是否真正写入了数据。在写操作中,需要确保在写完数据后,有进行校验或者确认写入成功。 2. **yaffs2的配置**:检查yaffs2的配置参数,比如YAFFS_YAFFS2、YAFFS_USE_NANDECC等。另外,需要确认是否启用了yaffs direct interface(通过定义YAFFS_DIRECT)以及我们提供的mtd接口是否正确。 3. **挂载选项**:在挂载文件系统时,我们使用的挂载参数。比如,是否以可读可写方式挂载?是否在挂载时进行了格式化? 4. **文件系统同步**:在掉电前,确保文件系统同步。在RT-Thread中,可以调用sync()函数来同步文件系统。 5. **代码中创建目录失败**:返回-28(ENOSPC)错误。我们需要检查: - 文件系统是否已经挂载成功? - 创建目录的路径是否正确? - 文件系统的剩余空间和inode数量。 具体步骤: 步骤1:检查MTD设备操作 确保mtd_nand.c中的读写擦除函数正确实现,特别是写函数。对于NAND Flash,写操作需要按照页写入,并且要处理坏块。另外,擦除操作是以块为单位。 步骤2:检查yaffs2的配置 在rtconfig.h中,确保以下配置: ``` #define RT_USING_MTD_NAND #define RT_YAFFS_YAFFS2 #define RT_YAFFS_USE_NANDECC // 如果使用NAND的ECC,需要定义 #define RT_YAFFS_DIRECT // 使用直接接口 #define RT_YAFFS_MALLOC rt_malloc #define RT_YAFFS_FREE rt_free ``` 步骤3:挂载文件系统 在挂载文件系统时,确保使用正确的参数。例如: ``` struct rt_mtd_nand_device *mtd = RT_MTD_NAND_DEVICE(rt_device_find("nand0")); struct yaffs_dev *dev = yaffs2_rtt_mtd_device("yaffs", mtd); if (dfs_mount("yaffs", "/", "yaffs", 0, dev) == 0) { rt_kprintf("YAFFS mounted.n"); } else { rt_kprintf("YAFFS mount failed.n"); } ``` 步骤4:在代码中创建目录失败 在代码中创建目录时,确保路径正确,并且文件系统已经挂载。另外,检查文件系统的空间和inode使用情况。可以通过`df`命令查看。 步骤5:掉电数据丢失 在掉电前,确保文件系统同步。可以尝试在创建文件或目录后调用`sync()`或者`umount`(然后再挂载)来确保数据写入。 但是,在嵌入式系统中,我们无法保证每次都能正常卸载。因此,我们需要确保文件系统在挂载时能够正确处理掉电恢复(yaffs2应该支持)。另外,检查是否启用了yaffs2的写缓存(yaffs2默认有缓存),并且缓存是否在适当的时候刷新。 可能的原因:yaffs2的缓存没有及时写回。可以尝试在挂载时设置挂载参数为禁用缓存(但一般不推荐,因为性能会下降),或者确保在重要操作后调用`sync`。 步骤6:检查坏块管理 在NAND Flash中,坏块管理非常重要。确保MTD层能够正确识别坏块,并且在yaffs2中能够跳过坏块。 步骤7:调试信息 启用yaffs2的调试信息,在rtconfig.h中定义: ``` #define RT_YAFFS_DEBUG ``` 然后重新编译,观察在创建文件和目录时的输出。 步骤8:检查代码中创建目录的代码 例如: ``` int ret = mkdir("/test_dir", 0); if (ret < 0) { rt_kprintf("mkdir error: %dn", rt_get_errno()); } ``` 错误码-28对应ENOSPC。我们需要查看文件系统的空间和inode使用情况。 在shell中使用`df`命令,例如: ``` df ``` 或者更详细的: ``` df -h ``` 步骤9:考虑文件系统初始化 如果每次挂载都重新格式化,那么之前的数据会丢失。所以,我们不应该在每次挂载时都格式化。只有在挂载失败(比如第一次使用)时才格式化。 步骤10:检查yaffs2_rtt_mtd_device的实现 确保在创建yaffs_dev时,传入的mtd设备是有效的,并且mtd设备的块大小、页大小等参数正确。 由于问题比较复杂,我们需要逐步排查。首先,请确认MTD层的读写擦除操作是否正确,特别是写操作。然后,确保yaffs2的配置和挂载正确。最后,检查空间不足的问题。 另外,在代码中创建目录失败,可能是由于文件系统已经损坏或者空间不足。而命令行能够成功,可能是因为命令行操作时文件系统还没有满,而代码操作时文件系统已经满了(比如之前创建了很多文件没有删除)。但是掉电后消失,说明实际上没有写入成功,所以可能空间不足是假象。 建议:先解决掉电数据丢失的问题,再解决代码中创建目录失败的问题。 我们可以尝试以下测试: 1. 在命令行中创建目录和文件,然后调用`sync`命令,再掉电重启,看数据是否还在。 2. 如果数据在sync后仍然丢失,那么可能是底层写入有问题。 如果底层写入有问题,需要重点检查MTD的写函数。对于MT29F64G08AFAAAWP,它是一个8位总线的NAND Flash,页大小8KB(8192字节),块大小256页(即2MB)。确保在写操作时,按照页大小写入,并且地址计算正确。 另外,注意ECC的处理。yaffs2可以自己计算ECC,也可以使用硬件ECC。在mtd_nand.c中,我们可能需要提供硬件ECC计算函数,或者让yaffs2使用软件ECC。 请检查mtd_nand.c中的`write_page`函数,确保它能够正确写入数据,并且处理OOB(包括ECC)。在yaffs2中,如果定义了RT_YAFFS_USE_NANDECC,则yaffs2会使用MTD提供的ECC函数;否则,yaffs2会使用自己的ECC。 如果问题仍然存在,请提供更多信息,例如: - mtd_nand.c中的关键函数(如读写擦除)的实现。 - 挂载文件系统的具体代码。 - 在代码中创建目录的代码。 - 文件系统的使用情况(df命令输出)。 希望这些步骤能帮助你定位问题。 根据您的描述,yaffs2文件系统在STM32F407上挂载成功但掉电数据丢失,同时代码中创建目录失败(返回-28错误),以下是可能的原因和解决方案: 问题根源分析
解决方案1. 确保MTD驱动正确性(关键步骤)2. 配置YAFFS2参数在 3. 文件系统初始化代码修正4. 解决ENOSPC错误(内存池配置)在文件系统初始化前添加: 5. 确保数据持久化在关键操作后强制同步: 调试建议
硬件注意事项针对 MT29F64G08AFAAAWP:
通过以上步骤应能解决数据掉电丢失和ENOSPC错误问题,重点关注MTD驱动的ECC/OOB处理是否正确以及YAFFS内存池配置。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
184个成员聚集在这个小组
加入小组rtstudio是否可像keil加载ini解决虚拟串口与mcu串口通讯?
1212 浏览 0 评论
【Vision Board创客营连载体验】基于RA8D1-Vision Board的自动路径规划小车
1776 浏览 1 评论
【Vision Board创客营连载体验】基于Vision Board的垃圾分类
2156 浏览 0 评论
【Vision Board创客营连载体验】使用 Vision Board 做一个 UVC Camera
1777 浏览 0 评论
【Vision Board创客营连载体验】TinyMaix进行手写数字识别
2006 浏览 0 评论
1465浏览 5评论
在RT-Thread Studio中新建的stm32f407-atk-explorer工程运行qemu失败,是什么原因引起的?
1767浏览 3评论
为什么rt_device_read()只能读取到两个字节数据?
364浏览 3评论
连得上热点,但是ping baidu.com出现timeout,请问跟什么有关?
422浏览 3评论
421浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 04:40 , Processed in 0.754056 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3095
