硬汉嵌入式论坛

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

[FatFs] fatfs大于512字节长时间写入

[复制链接]

2

主题

8

回帖

14

积分

新手上路

积分
14
发表于 2025-8-26 10:17:23 | 显示全部楼层 |阅读模式
1.基本逻辑 :打开文件→分批写入512字节的buff(比如596字节,分两次写入,一次512,剩余的第二次写入,中间间隔5ms)→长时间写入会出现以下情况

c8975a43-5ae5-4455-bcbd-ed70c4b399aa.png b77c5c59-f028-4125-bdfd-d2a203afa857.png
2.请问有什么解决办法,速率为 569字节 100ms
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-8-26 15:01:36 | 显示全部楼层
你的第2个红色方框,我看绿色字体数值,从86开始,每次都是递增512字节。
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2025-8-26 15:21:58 | 显示全部楼层
eric2013 发表于 2025-8-26 15:01
你的第2个红色方框,我看绿色字体数值,从86开始,每次都是递增512字节。

// 6. 写入数据(支持超过512字节的分批写入)
    write_res = FR_OK;
    bytes_remaining = offset;
    while (bytes_remaining > 0 && write_res == FR_OK)
    {
        // 计算本次要写入的字节数
        bytes_to_write = (bytes_remaining > 511) ? 511 : bytes_remaining;

        // 执行写入操作
        write_res = f_write(&SDFile, write_ptr, bytes_to_write, &bytes_written);

        // 检查写入结果
        if (write_res != FR_OK)
        {
            USR_DEBUG("[SD] Write error: %d at attempt %lu, offset %lu\r\n", write_res, write_attempt, sd_total_bytes_written);
            break;
        }

        if (bytes_written != bytes_to_write)
        {
            USR_DEBUG("[SD] Write incomplete: %lu/%lu bytes written\r\n", bytes_written, bytes_to_write);
            write_res = FR_DISK_ERR;
            break;
        }

        // 更新指针和计数器
        write_ptr += bytes_written;
        bytes_remaining -= bytes_written;
        sd_total_bytes_written += bytes_written;
        write_attempt++;

        // 对于大文件写入,可以适当让出CPU时间
        if (write_attempt % 8 == 0)
        {
            // taskYIELD();
        }
        osDelay(5);
    }

    // 检查最终写入结果
    if (write_res != FR_OK || sd_total_bytes_written != offset)
    {
        USR_DEBUG("[SD] Final write error: res=%d, written=%lu/%lu\r\n", write_res, sd_total_bytes_written, offset);
        f_close(&SDFile);
        ret_val = USR_SD_WRITE_ERROR;
        write_err_and_reset(&g_sd_config);
        goto FAIL;
    }

1.改成511正常了,还在找原因
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-8-27 09:02:03 | 显示全部楼层
a4270 发表于 2025-8-26 15:21
// 6. 写入数据(支持超过512字节的分批写入)
    write_res = FR_OK;
    bytes_remaining = offset; ...

改成511正常,看看是不是底层DMA的4字节对齐没做好。大概率是的。
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2025-8-27 12:51:56 | 显示全部楼层
eric2013 发表于 2025-8-27 09:02
改成511正常,看看是不是底层DMA的4字节对齐没做好。大概率是的。

全部cubemx生成的,还没细看,我再看看
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-8-28 14:53:15 | 显示全部楼层
a4270 发表于 2025-8-27 12:51
全部cubemx生成的,还没细看,我再看看

另外你的STM32用的那个型号,4字节对齐有简单的处理方法
回复

使用道具 举报

2

主题

8

回帖

14

积分

新手上路

积分
14
 楼主| 发表于 2025-8-29 08:16:09 | 显示全部楼层
eric2013 发表于 2025-8-28 14:53
另外你的STM32用的那个型号,4字节对齐有简单的处理方法

stm32F401RET6,现在测了几天 打开文件→存数据→关文件,反复开关几十万次后,会有disk_err,现在改为打开一次文件,然后一直存数据。但是不知道这种disk_err是否是随机存在的,还是说本生程序的错误。
底层库有这种自带的宏定义,但是我看了,我这个系列没相关函数,可能需要自己实现,现在还在找最佳方式。
#if defined(ENABLE_SCRATCH_BUFFER)
    if (!((uint32_t)buff & 0x3))
    {
#endif
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-8-30 08:27:55 | 显示全部楼层
a4270 发表于 2025-8-29 08:16
stm32F401RET6,现在测了几天 打开文件→存数据→关文件,反复开关几十万次后,会有disk_err,现在改为打 ...

f4系列之前处理过一次,供参考

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发布新版案例(2020-06-30)
https://forum.anfulai.cn/forum.p ... 8560&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 09:11 , Processed in 0.046231 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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