硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1365|回复: 12
收起左侧

[ThreadX全家桶] norflash+fafts+levelx读速度竟然慢到1k需要300ms

[复制链接]

3

主题

9

回帖

18

积分

新手上路

积分
18
发表于 2024-12-19 15:25:01 | 显示全部楼层 |阅读模式

硬件环境:SPI时钟是80M,使用DMA,2线Dual模式
软件环境:Read函数包括f_open,f_lseek, f_read,f_close4个函数
计时方式:在Read和memset函数打断点,分别记录系统定时器的tick的值(单位ms)


static uint8_t m_TestBuff[1000];
//读取根目录下的文件



Read("1:/test.txt", 0, m_TestBuff, 1000);
memset(m_TestBuff, 0, 1000);
//读取二级目录下的文件
Read("1:/202412/19/test.txt", 0, m_TestBuff, 1000);
memset(m_TestBuff, 0, 1000);





在fafts裸读测试3次,1000字节,lvgl任务中
1:/202412/19/test.txt:3ms,2ms,3ms
1:/test.txt:2ms,1ms,1ms
从上可以看出,多级目录影响还不是很大只是多个1,2个ms

fafts+levelx读测试3次,1000字节,lvgl任务中(在这之前已经进行过多个文件重复写操作了
1:/202412/19/test.txt:358ms,352ms,357ms
1:/test.txt:6ms,6ms,4ms

从上可以看出,多级目录影响巨大,慢的离谱

奇怪是在格式化flash后,使用levelx只写入少量文件时,读的速度和裸读速度差不多,一旦进行过多个文件重复写操作后,读多级目录速度骤降
有没有大哥们分析一下是什么原因,有或者说有比levelx更好的平衡磨损的中间层

回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2024-12-19 16:33:04 | 显示全部楼层
fatfs本来就是直接读写的扇区,再加一个中间层做平衡磨损,这样读写是不是非常影响效率?你加个日志看一下读一个文件最终动了底层多少个扇区?
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2024-12-19 16:38:22 | 显示全部楼层
另外注意一下fatfs和中间层的扇区是否一致?
或者倍数关系
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-12-19 17:04:30 | 显示全部楼层
fxyc87 发表于 2024-12-19 16:33
fatfs本来就是直接读写的扇区,再加一个中间层做平衡磨损,这样读写是不是非常影响效率?你加个日志看一下 ...

没办法,要考虑spi flash的擦除寿命就得加这玩意,项目需要大量读写数据,还要存储几年的数据,加了levelx后仅一次read要调用底层spi_read10多次,levelx里面就是有很多查找判断
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-12-19 17:05:14 | 显示全部楼层
fxyc87 发表于 2024-12-19 16:38
另外注意一下fatfs和中间层的扇区是否一致?
或者倍数关系

肯定不一致了,levex有自己的虚拟扇区号
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-12-19 17:16:53 | 显示全部楼层
fxyc87 发表于 2024-12-19 16:33
fatfs本来就是直接读写的扇区,再加一个中间层做平衡磨损,这样读写是不是非常影响效率?你加个日志看一下 ...

10几次说少了,每次读直接扫描整个flash块,16874次
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-12-19 17:31:07 | 显示全部楼层
金木研 发表于 2024-12-19 17:04
没办法,要考虑spi flash的擦除寿命就得加这玩意,项目需要大量读写数据,还要存储几年的数据,加了level ...

10多次说少了,刚调试了一下,一次read需要调用16874次spi_read
回复

使用道具 举报

3

主题

9

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2024-12-19 20:56:07 | 显示全部楼层
找到问题了,因为LX_NOR_SECTOR_MAPPING_CACHE_SIZE的默认大小是16,读文件的虚拟扇区在表中找不到就会遍历整个block查找,每次读每次都要查找非常耗时
将LX_NOR_SECTOR_MAPPING_CACHE_SIZE改成和LX_NAND_SECTOR_MAPPING_CACHE_SIZE一样大128时读的时候就不用每次遍历了,缺点时多占用一点RAM而已,尽可能的把表开大加快读写速度
回复

使用道具 举报

1

主题

131

回帖

139

积分

初级会员

积分
139
发表于 2024-12-20 07:50:41 | 显示全部楼层
微信截图_20241220074904.png
必须要用文件系统吗?是否可以考虑一下FlashDB呢?
回复

使用道具 举报

5

主题

229

回帖

249

积分

高级会员

积分
249
发表于 2024-12-27 14:47:50 | 显示全部楼层
nnqtdf 发表于 2024-12-20 07:50
必须要用文件系统吗?是否可以考虑一下FlashDB呢?

完全是不一样的东西
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2025-2-28 06:56:15 | 显示全部楼层
金木研 发表于 2024-12-19 20:56
找到问题了,因为LX_NOR_SECTOR_MAPPING_CACHE_SIZE的默认大小是16,读文件的虚拟扇区在表中找不到就会遍历 ...

有测试过分别写入多个不同文件后,突然读不是最近写入的文件,紧接着继续多次读这个文件的速度吗?
我测试发现有个映射表cache 命中的问题,第一次读速度还是很低,后面读速度会上来,接近裸读的速度
有办法优化吗
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2025-3-13 14:25:15 | 显示全部楼层
五花肉 发表于 2025-2-28 06:56
有测试过分别写入多个不同文件后,突然读不是最近写入的文件,紧接着继续多次读这个文件的速度吗?
我测 ...

LX_NOR_SECTOR_MAPPING_CACHE_SIZE 调整这个参数,使之与实际可用sector数量一样,则每次读数据的时候映射都能命中;增加levelx读速度不再受需要寻找映射的影响
回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
发表于 2025-3-14 09:13:01 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 03:45 , Processed in 0.049135 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表