【实测】使用STM32H7板子FatFS文件系统每秒读写2MB文件,实时写入7450个文件不出错,写满16GB SD卡

【测试平台】

STM32-V7开发板

 

【测试例子】

https://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

V7-025_FatFS文件系统例子(SD卡 V1.2)


【测试条件和校验】

运行例子里面的命令6,命令6是个测速函数,每次写入2MB文件,同时读取出来校验,保证写入的没问题。

/*
*********************************************************************************************************
*        函 数 名: WriteFileTest
*        功能说明: 测试文件读写速度
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
static void WriteFileTest(void)
{
        FRESULT result;
        char path[64]; 
        uint32_t bw;
        uint32_t i,k;
        uint32_t runtime1,runtime2,timelen;
        uint8_t err = 0;
        static uint32_t s_ucTestSn = 0;
 
         
        for (i = 0; i < sizeof(g_TestBuf); i++)
        {
                g_TestBuf[i] = (i / 512) + '0';
        }
 
          /* 挂载文件系统 */
        result = f_mount(&fs, DiskPath, 0);                        /* Mount a logical drive */
        if (result != FR_OK)
        {
                printf("挂载文件系统失败 (%s)\r\n", FR_Table[result]);
        }
 
        /* 打开文件 */
        sprintf(path, "%sS%05d.txt", DiskPath, s_ucTestSn++); /* 每写1次,序号递增 */       
        result = f_open(&file, path, FA_CREATE_ALWAYS | FA_WRITE);
 
        /* 写一串数据 */
        printf("开始写文件%s %dKB ...\r\n", path, TEST_FILE_LEN / 1024);
         
        runtime1 = bsp_GetRunTime();        /* 读取系统运行时间 */
        for (i = 0; i < TEST_FILE_LEN / BUF_SIZE; i++)
        {
                result = f_write(&file, g_TestBuf, sizeof(g_TestBuf), &bw);
                if (result == FR_OK)
                {
                        if (((i + 1) % 8) == 0)
                        {
                                printf(".");
                        }
                }
                else
                {
                        err = 1;
                        printf("%s文件写失败\r\n", path);
                        break;
                }
        }
        runtime2 = bsp_GetRunTime();        /* 读取系统运行时间 */
         
        if (err == 0)
        {
                timelen = (runtime2 - runtime1);
                printf("\r\n  写耗时 : %dms   平均写速度 : %dB/S (%dKB/S)\r\n",
                        timelen,
                        (TEST_FILE_LEN * 1000) / timelen,
                        ((TEST_FILE_LEN / 1024) * 1000) / timelen);
        }
 
        f_close(&file);                /* 关闭文件*/
 
 
        /* 开始读文件测试 */
        result = f_open(&file, path, FA_OPEN_EXISTING | FA_READ);
        if (result !=  FR_OK)
        {
                printf("没有找到文件: %s\r\n", path);
                return;
        }
 
        printf("开始读文件 %dKB ...\r\n", TEST_FILE_LEN / 1024);
         
        runtime1 = bsp_GetRunTime();        /* 读取系统运行时间 */
        for (i = 0; i < TEST_FILE_LEN / BUF_SIZE; i++)
        {
                result = f_read(&file, g_TestBuf, sizeof(g_TestBuf), &bw);
                if (result == FR_OK)
                {
                        if (((i + 1) % 8) == 0)
                        {
                                printf(".");
                        }
 
                        /* 比较写入的数据是否正确,此语句会导致读卡速度结果降低到 3.5MBytes/S */
                        for (k = 0; k < sizeof(g_TestBuf); k++)
                        {
                                if (g_TestBuf[k] != (k / 512) + '0')
                                {
                                          err = 1;
                                        printf("Speed1.txt 文件读成功,但是数据出错\r\n");
                                        break;
                                }
                        }
                        if (err == 1)
                        {
                                break;
                        }
                }
                else
                {
                        err = 1;
                        printf("Speed1.txt 文件读失败\r\n");
                        break;
                }
        }
 
        runtime2 = bsp_GetRunTime();        /* 读取系统运行时间 */
         
        if (err == 0)
        {
                timelen = (runtime2 - runtime1);
                printf("\r\n  读耗时 : %dms   平均读速度 : %dB/S (%dKB/S)\r\n", timelen,
                        (TEST_FILE_LEN * 1000) / timelen, ((TEST_FILE_LEN / 1024) * 1000) / timelen);
        }
 
        /* 关闭文件*/
        f_close(&file);
 
        /* 卸载文件系统 */
        f_mount(NULL, DiskPath, 0);
}

 

【实测】

1500个文件时:

5100个文件时:

写满SD卡,特别注意,但SD卡还剩下一点空间的时候,比如200M时,建议停止再写入,防止写爆后损坏SD卡

 

posted @ 2024-11-07 13:25  硬汉嵌入式  阅读(26)  评论(0编辑  收藏  举报