OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6223|回复: 2

关于 stm32 + FATFS文件系统 f_write()耗时问题???

[复制链接]

48

主题

135

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2017-8-29
在线时间
89 小时
发表于 2021-1-18 17:21:55 | 显示全部楼层 |阅读模式
1金钱
现在需要定时向TF卡中写入固定大小的数据, 所以需要测试数据写入的时间。

现在简单编写了一个测试代码,定时器1s调用一次下面函数,每次写入40K的数据量。

现象:通过打印的时间显示,每间隔一段时间,数据写入的时间明显增加(有规律性)。
如果是随着被写入的文件变大,时间随之递增倒是好理解;但是打印出的时间是隔一段时间来个“波峰”随之平稳。

测试代码:
void TEST_WirteData(void)
{
        //DWORD clmt[SZ_TBL]; //
        static ULONG ulVal = 256;

        ULONG ulByteCnt = 0;

        ULONG i = 0;

        ULONG ulTickStart = 0;

        FRESULT FatRes = FR_OK;
        FIL fil;
        UINT pw;
       
        /* 装测试数据 , 全局变量随意装数据, 可以忽略*/
        for (i = 0; i < (40 * 1024); i++)
        {
                g_TestDataBuffer = (i % ulVal);
        }
        if ((ulVal -= 2) == 0) ulVal = 256;

        ulTickStart = HAL_GetTick();

        /* 打开文件,不存在则新建,追加 */
        FatRes = f_open(&fil, "0:/pylon/lb_test.txt", FA_WRITE | FA_OPEN_ALWAYS | FA_OPEN_APPEND);
        if (FatRes != FR_OK)
        {
                printf("\r\nCreate Or Open File Fail.");
                return;
        }
        {
                /* 写入测试数据 */
                FatRes = f_write(&fil, g_TestDataBuffer, (40 * 1024), &pw);
                if (FatRes != FR_OK)
                {
                        printf("\r\nWrite File Fail.");
                        return;
                }
        }

        /* 关闭文件 */
        f_close(&fil);

        printf("\r\nTotalTime: %dms", (HAL_GetTick() - ulTickStart));

        return;
}


打印现象:
[17:04:14]TotalTime: 378ms
[17:04:16]TotalTime: 365ms
[17:04:18]TotalTime: 374ms
[17:04:20]TotalTime: 365ms
[17:04:22]TotalTime: 363ms
[17:04:24]TotalTime: 360ms
[17:04:26]TotalTime: 377ms
[17:04:28]TotalTime: 369ms
[17:04:30]TotalTime: 361ms
[17:04:32]TotalTime: 381ms
[17:04:35]TotalTime: 363ms
[17:04:36]TotalTime: 1002ms
[17:04:38]TotalTime: 368ms
[17:04:40]TotalTime: 381ms
[17:04:42]TotalTime: 364ms
[17:04:44]TotalTime: 374ms
[17:04:46]TotalTime: 364ms
[17:04:48]TotalTime: 379ms
[17:04:50]TotalTime: 367ms
[17:04:52]TotalTime: 367ms
[17:04:54]TotalTime: 382ms
[17:04:56]TotalTime: 377ms
[17:04:58]TotalTime: 358ms
[17:05:00]TotalTime: 794ms
[17:05:02]TotalTime: 386ms
[17:05:04]TotalTime: 370ms
[17:05:06]TotalTime: 361ms
[17:05:08]TotalTime: 373ms
[17:05:10]TotalTime: 379ms
[17:05:12]TotalTime: 364ms
[17:05:14]TotalTime: 374ms
[17:05:16]TotalTime: 372ms
[17:05:18]TotalTime: 374ms
[17:05:20]TotalTime: 371ms
[17:05:22]TotalTime: 391ms
[17:05:25]TotalTime: 364ms
[17:05:26]TotalTime: 1002ms
[17:05:28]TotalTime: 375ms
[17:05:30]TotalTime: 365ms
[17:05:32]TotalTime: 388ms
[17:05:34]TotalTime: 386ms
[17:05:36]TotalTime: 366ms
[17:05:38]TotalTime: 370ms
[17:05:40]TotalTime: 380ms
[17:05:42]TotalTime: 363ms
[17:05:44]TotalTime: 391ms
[17:05:46]TotalTime: 367ms
[17:05:48]TotalTime: 366ms
[17:05:51]TotalTime: 367ms
[17:05:52]TotalTime: 1017ms
[17:05:54]TotalTime: 393ms
[17:05:56]TotalTime: 367ms
[17:05:58]TotalTime: 361ms
[17:06:00]TotalTime: 395ms
[17:06:02]TotalTime: 378ms
[17:06:04]TotalTime: 392ms
[17:06:06]TotalTime: 376ms
[17:06:08]TotalTime: 374ms



请教:
1、这中现象正常吗? 是否与我底层驱动有关系?(FF_MAX_SS = FF_MIN_SS = 512)写入长度都是512Bytes的整数倍
2、如何使每次写入的时间平稳?至少不会突变。
3、请老师们指教。谢谢!!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2021-1-18 19:01:19 | 显示全部楼层
写的时候关中断减少延时
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-3-15
在线时间
15 小时
发表于 2021-4-28 20:43:01 | 显示全部楼层
hello,楼主解决了吗,会不会是有时候sd卡处于长时间write busy的状态?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 16:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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