linminghui 发表于 2022-6-1 17:12:26

FileX+LevelX 挂载nor flash失败

在格式化完OSPI_FLASH(四线制)后,挂载文件系统的话正常,但是如果重启后如果我不格式化直接挂载文件系统的话,会出现FX_BUFFER_ERROR(错误码0x21)

linminghui 发表于 2022-6-1 17:58:05

如果我把缓冲区设置的很大,那么错误就变成了FX_FAT_READ_ERROR

eric2013 发表于 2022-6-2 11:46:19

linminghui 发表于 2022-6-1 17:58
如果我把缓冲区设置的很大,那么错误就变成了FX_FAT_READ_ERROR

楼主的意思是每次上电都要重新格式化? 那这个应该是哪里的配置项或者驱动还有点问题。

ihavedone 发表于 2022-8-4 15:57:18

我这里也遇到了这个问题,是 FMC 的 NORFlash。
格式化后新建的文件系统是可以打开的,接下来重启设备打开文件系统就会失败,报的错和断点定位的原因都跟你截图一模一样。

我又仔细跟了几遍,发现是 levelx 层找到的 logic sector 0 的地址不对,文件系统的信息并不储存在找到的地址上。
这时候如果不再格式化,断电重启程序,仍然是一样的问题。
如果不断电,不格式化flash,复位程序再 open 一次,就正确了。
一旦正确后,接下来每次不断电复位和断电重启都会正确。

重新格式化flash,然后建立文件系统,重启第一次又不正确了。
接下来在第一次 open 后面再加一次 open,那么第一次 open 失败,第二次成功。
成功后复位程序,第一次就会成功。。。。

我单独测试 levelx 按 logic sector 来读写,都可以正确读回写入的数据。
但是加上 filex,就会有楼主的这个问题。
原因就是 filex 调用levelx 读取 logic sector 0 的时候,读的实际物理位置不对,但是 open 失败后,再 open 一次,logic sector 0 的实际物理地址就对了,跟第一次 open 的地址确实不一样。
但为什么会这样我还没找到原因。

ihavedone 发表于 2022-8-4 17:04:57

eric2013 发表于 2022-6-2 11:46
楼主的意思是每次上电都要重新格式化? 那这个应该是哪里的配置项或者驱动还有点问题。


ihavedone 发表于 2022-8-5 11:50:52

下面是我的打开文件系统的流程:
1、尝试打开,如果成功直接返回。
2、如果不成功则全片擦除。
3、建立文件系统,之后再次打开。



为了模拟文件系统损坏的情况,我在调用这个函数之前主动整片擦除一次,则第一步打开文件系统肯定会失败,然后走下面的流程。
建立新文件系统后,再次打开是成功的。
然后复位程序,在进入这个函数前不再整片擦除,第一步打开文件系统会失败。
但是如果把接下来的再打开一次的代码块使能,则再次打开会成功。
再次打开成功后,以后每次复位,则第一次打开就会成功。


第二个情况,那就是把图中的 “2、打开失败则全片擦除 ” 这段代码注释掉。
在进入函数前主动整片擦除,第一步打开文件系统会失败,然后重新建立文件系统,并打开。
然后复位程序,则第一步打开文件系统会成功。


第三个情况,如果把第一步打开文件系统注释掉,直接进行第二步整片擦除,然后重建文件系统并打开。
然后重新把第一步打开文件系统代码使能,重新下载并运行,则第一步打开文件系统就会成功。


感觉就是已经操作了一次文件系统,levelx 就会从 flash 读取数据并建立数据结构。
这时候如果把 flash 格式化了,就会有问题。。。
但也有个疑问就是格式化了之后,又会 调用 levelx 重新再打开一次,按道理应该按最新的内容再次建立数据结构才对。


这个问题查了一个星期,没找到根本原因,也只能到这一步了,没时间继续查了:(

ihavedone 发表于 2022-8-5 13:55:43

我的问题找到原因了,楼主的是不是同样的原因?


JasonGu 发表于 2023-7-7 01:09:37

ihavedone 发表于 2022-8-5 13:55
我的问题找到原因了,楼主的是不是同样的原因?

我也遇到了这个问题,所以解决方案是把 current_driver->initialized = FX_FALSE; 添加到DRIVERI_UNINIT这里就可以了吗?
页: [1]
查看完整版本: FileX+LevelX 挂载nor flash失败