请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

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

[FatFs] 测试对比FatFS和FlashFS对一个文件定期写入数据问题

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
发表于 2016-10-4 15:32:02 | 显示全部楼层 |阅读模式
STM32-V5开发板
FatFS 0.09b  
==================================
每次写入512的数据,挂载好SD卡后,不再重复卸载
以此调用函数

f_open
f_write
f_close
==================================
QQ截图20161004153143.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2016-10-4 15:54:44 | 显示全部楼层
STM32-V5开发板
FatFS 0.09b  
==================================
每次写入512的数据,挂载好SD卡后,不再重复卸载
以此调用函数
f_open --- 此函数调用一次
f_write
f_sync
f_fclose ---- 此函数不使用
==================================
【2 - CreateNewFile】
count = 41
f_open = 0us
f_write = 1980us
f_sync = 1385us

【2 - CreateNewFile】
count = 42
f_open = 0us
f_write = 44854us
f_sync = 1379us

【2 - CreateNewFile】
count = 43
f_open = 0us
f_write = 1999us
f_sync = 1381us

【2 - CreateNewFile】
count = 44
f_open = 0us
f_write = 2005us
f_sync = 1379us

【2 - CreateNewFile】
count = 64
f_open = 0us
f_write = 2034us
f_sync = 5129us


【2 - CreateNewFile】
count = 65
f_open = 0us
f_write = 2301us
f_sync = 177020us


【2 - CreateNewFile】
count = 105
f_open = 0us
f_write = 1974us
f_sync = 1380us

【2 - CreateNewFile】
count = 106
f_open = 0us
f_write = 44844us
f_sync = 1377us

【2 - CreateNewFile】
count = 107
f_open = 0us
f_write = 1993us
f_sync = 1379us

【2 - CreateNewFile】
count = 127
f_open = 0us
f_write = 2022us
f_sync = 1381us

【2 - CreateNewFile】
count = 128
f_open = 0us
f_write = 2029us
f_sync = 1379us


【2 - CreateNewFile】
count = 129
f_open = 0us
f_write = 2297us
f_sync = 177057us
=========================================
总结这种方式,基本是每写过一个簇大小32KB,函数f_sync的写入时间就会有一个飙升,将每次的写入大小
修改为2048字节测试,也是写过一个大小32KB,会有一个比较长的调整时间。修改大小位4KB,也是同样的问题。
将SD卡进行过一次低格后,这个比较长的时间会缩短不少,原因应该是进行簇擦除了,所以导致时间比较长。

【2 - CreateNewFile】-----首次打开是比较慢的,我们在一楼已经验证过了。
count = 1
f_open = 133760us
f_write = 53558us
f_sync = 134374us

【2 - CreateNewFile】
count = 2
f_open = 0us
f_write = 2121us
f_sync = 1733us


【2 - CreateNewFile】
count = 16
f_open = 0us
f_write = 2234us
f_sync = 1379us

【2 - CreateNewFile】
count = 17
f_open = 0us
f_write = 2344us
f_sync = 177110us

===================================================
下面是调整为4KB扇区大小并进行了低格。

【2 - CreateNewFile】
count = 1
f_open = 30us
f_write = 562030us
f_sync = 97660us


【2 - CreateNewFile】
count = 2
f_open = 0us
f_write = 3942us
f_sync = 3554us


【2 - CreateNewFile】
count = 3
f_open = 0us
f_write = 5143us
f_sync = 9423us


【2 - CreateNewFile】
count = 4
f_open = 0us
f_write = 3972us
f_sync = 3611us


【2 - CreateNewFile】
count = 5
f_open = 0us
f_write = 4540us
f_sync = 9184us


【2 - CreateNewFile】
count = 6
f_open = 0us
f_write = 3948us
f_sync = 3538us


【2 - CreateNewFile】
count = 7
f_open = 0us
f_write = 5159us
f_sync = 9439us
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2016-10-4 16:09:54 | 显示全部楼层
STM32-V5开发板
FatFS 0.09b  
==================================
每次写入512的数据,挂载好SD卡后,不再重复卸载
以此调用函数
f_open --- 此函数每10此循环调用一次
f_write
f_sync
f_fclose ---- 此函数每10次循环调用一次
==================================

这个主要是验证调用了f_sync后,再调用f_fclose时候消耗时间,实际测试使用f_sync就够了
f_close基本已经不消耗时间了。
【2 - CreateNewFile】
count = 8
f_open = 0us
f_write = 2233us
f_sync = 1380us

【2 - CreateNewFile】  ------关闭后
count = 9
f_open = 0us
f_write = 2090us
f_sync = 1379us
f_close = 1us


【2 - CreateNewFile】-----重新打开
count = 10
f_open = 90836us
f_write = 44570us
f_sync = 134171us



【2 - CreateNewFile】
count = 11
f_open = 0us
f_write = 2122us
f_sync = 1741us
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2016-10-4 17:02:14 | 显示全部楼层
STM32-V6开发板
FlashFS 4.74
==================================
每次写入512的数据,挂载好SD卡后,不再重复卸载
以此调用函数
fopen
fwrite
fclose
==================================
QQ截图20161004170145.png


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2016-10-4 17:28:12 | 显示全部楼层
STM32-V6开发板
FlashFS 4.74
==================================
每次写入512的数据,挂载好SD卡后,不再重复卸载
以此调用函数
fopen --- 此函数每200次调用一次
fwrite
fflush
ffclose --此函数每200次调用一次
==================================

【3 - CreateNewFile】
------------------------------------------------------------------
count = 1
fopen = 5018us
fwrite = 309us
flush = 3us


【3 - CreateNewFile】
------------------------------------------------------------------
count = 16
fopen = 0us
fwrite = 15us
flush = 3us


【3 - CreateNewFile】------------------------------------------------------------------
count = 17
fopen = 0us
fwrite = 1740us
flush = 3us
【3 - CreateNewFile】
------------------------------------------------------------------
count = 32
fopen = 0us
fwrite = 15us
flush = 3us


【3 - CreateNewFile】
------------------------------------------------------------------
count = 33
fopen = 0us
fwrite = 675309
usflush = 3us

【3 - CreateNewFile】------------------------------------------------------------------
count = 48fopen = 0us
fwrite = 15usflush = 3us

【3 - CreateNewFile】
------------------------------------------------------------------
count = 49
fopen = 0us
fwrite = 1564us
flush = 3us

【3 - CreateNewFile】------------------------------------------------------------------
count = 64
fopen = 0us
fwrite = 15us
flush = 3us

【3 - CreateNewFile】------------------------------------------------------------------

count = 65
fopen = 0us
fwrite = 907us
flush = 3us

【3 - CreateNewFile】------------------------------------------------------------------

count = 81
fopen = 0us
fwrite = 904us
flush = 3us
=========================================
总结这种方式,基本是每写够缓冲大小的时候才会有一个世界上的飙升,其中有一个时间较长的,估计是做擦除操作了。
或者是写入阶段做了调整。
修改每次写入大,同样情况,达到设置的缓冲大小时会有一个飙升。其中也有这么一个时间较长的600ms,专门测试1000次
中间没有再出现这个。个人猜测估计是簇擦除问题。
下面是每次写入2048字节:

【3 - CreateNewFile】
------------------------------------------------------------------
count = 1
fopen = 8010us
fwrite = 94us
flush = 3us

【3 - CreateNewFile】
------------------------------------------------------------------
count = 2
fopen = 0us
fwrite = 31us
flush = 3us

【3 - CreateNewFile】
------------------------------------------------------------------
count = 3
fopen = 0us
fwrite = 31us
flush = 3us

【3 - CreateNewFile】
------------------------------------------------------------------
count = 4
fopen = 0us
fwrite = 31us
flush = 3us

【3 - CreateNewFile】
------------------------------------------------------------------
count = 5
fopen = 0us
fwrite = 1758us
flush = 3us

【3 - CreateNewFile】
------------------------------------------------------------------
count = 6
fopen = 0us
fwrite = 31us
flush = 3us
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2016-10-4 17:37:24 | 显示全部楼层
STM32-V6开发板
FlashFS 4.74
==================================
每次写入2048的数据,挂载好SD卡后,不再重复卸载
以此调用函数
fopen --- 此函数每100次调用一次
fwrite
fflush  ---不使用了
ffclose --此函数每100次调用一次
==================================

测试跟上面是一样的,发现函数fflush函数基本都是多余的,这个函数作用就是将缓冲
里面的数据写入到SD卡,不使用这个函数的话,一直调用fwrite,这个函数也会在缓冲、
满了的时候写入一次,初步推测是这个样子的。


实际应用中推荐使用fwrite进行周期写入几个,适当时候调用下fclose保证写入。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2021-7-1 08:51:25 | 显示全部楼层
eric2013 发表于 2016-10-4 17:28
STM32-V6开发板
FlashFS 4.74
==================================

遇到了同样的问题,fatfs进行压力测试时发现write或者sync的耗时有个别时候会增加几十倍。
后来发现,这个可能和存储介质有关,也就是SD卡的写函数耗时相关(SD卡磨损均衡)。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105942
QQ
 楼主| 发表于 2021-7-1 10:46:52 | 显示全部楼层
neorun 发表于 2021-7-1 08:51
遇到了同样的问题,fatfs进行压力测试时发现write或者sync的耗时有个别时候会增加几十倍。
后来发现,这 ...

对,是这样的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 19:04 , Processed in 0.200828 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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