硬汉嵌入式论坛

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

[FatFs] FATFS 复制文件内存太大的问题?

[复制链接]

35

主题

73

回帖

343

积分

高级会员

超越昨天

积分
343
QQ
发表于 2016-8-9 15:50:46 | 显示全部楼层 |阅读模式
我现在用的是安富莱的文件复制程序,因为我要复制多个文件,但发现复制完一个文件后内存并没有释放,所以多个文件复制时点内存很大。请高手指教如何复制一个文件后释放内存。程序原码如下:
FRESULT CopyData(u16 earliest,u16 late)
{   
    FATFS fs[2];         /* 逻辑驱动器的工作区(文件系统对象) */
    FIL fsrc, fdst;      /* 文件对象 */
    BYTE buffer[512];   /* 文件拷贝缓冲区 */
    FRESULT res;         /* FatFs 函数公共结果代码 */
    UINT br, bw;         /* 文件读/写字节计数 */
     DIR DirInf;
    FILINFO FileInf;
    uint32_t cnt = 0;
    char name0[16],name2[16];
     printf("开始 \r\n");
    /* 为逻辑驱动器注册工作区 */   
    f_mount(FS_SD, &fs[0]);
   printf("挂载文件系统成功 \r\n");
    res=f_opendir(&DirInf, "0:/");
    if(res)
     {
       Alarm=FSOPENDIRFAIL;
       printf("打开根目录失败 (%d)\r\n", res);
     }     
    f_mount(FS_USB, &fs[1]);
    for (cnt = 0; ;cnt++)
    {
        res = f_readdir(&DirInf,&FileInf);         /* 读取目录项,索引会自动下移 */
        if (res != FR_OK || FileInf.fname[0] == 0)
        {    printf("读取目录失败 (%d)\r\n", res);
            break;
        }

        if (FileInf.fname[0] == '.')
        {
            continue;
        }
        /* 找出选择的文件 */        
        if((FileInf.fdate>=earliest)&&(FileInf.fdate<=late))     
         {

        strcpy(name0,"0:");
        strcpy(name2,"2:");
        strcat(name0,FileInf.fname);
        strcat(name2,FileInf.fname);
      /* 打开驱动器 0 上的源文件 */
      res = f_open(&fsrc, name0, FA_OPEN_EXISTING | FA_READ);
      if (res)
       {printf("打开文件失败 (%d)\r\n",res);
        return(res);
       }
       printf("打开文件成功 (%d)\r\n",res);  

   
       /* 在驱动器 2 上创建目标文件 */
      res = f_open(&fdst, name2, FA_CREATE_ALWAYS | FA_WRITE);
      if (res)
       {printf("打开文件失败 (%d)\r\n",res);
        return(res);
       }
       printf("打开文件成功 (%d)\r\n",res);
      /* 拷贝源文件到目标文件 */
      for (;;) {
        res = f_read(&fsrc, buffer, sizeof(buffer), &br);
        if (res || br == 0) break;   /* 文件结束错误 */
        res = f_write(&fdst, buffer, br, &bw);
        if (res || bw < br) break;   /* 磁盘满错误 */
      }
       printf("拷贝文件成功 \r\n");
      /* 关闭打开的文件 */
      f_close(&fsrc);
      f_close(&fdst);
       printf("关闭文件成功 \r\n");
     }
    }   
    /* 注销工作区(在废弃前) */
    f_mount(FS_SD, NULL);
    f_mount(FS_USB, NULL);
    printf("卸载文件成功 \r\n");
    return(FR_OK);
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2016-8-10 01:14:58 | 显示全部楼层
楼主,你所说的内存没有释放是指的那个内存,看程序没有发现什么问题。
回复

使用道具 举报

35

主题

73

回帖

343

积分

高级会员

超越昨天

积分
343
QQ
 楼主| 发表于 2016-8-10 17:05:55 | 显示全部楼层

回 eric2013 的帖子

eric2013:楼主,你所说的内存没有释放是指的那个内存,看程序没有发现什么问题。 (2016-08-10 01:14) 
是指任务的堆栈大小,那个任务调用复制程序,那个任务的堆栈就必须加大。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2016-8-11 11:14:07 | 显示全部楼层

回 fanyanxi 的帖子

fanyanxi:是指任务的堆栈大小,那个任务调用复制程序,那个任务的堆栈就必须加大。 (2016-08-10 17:05) 
明白你的意思,我以为你的说是随着复制文件的增多,任务栈逐渐增大呢。
比较耗任务栈控件是因为你的局部变量。

FATFS fs[2];         /* 逻辑驱动器的工作区(文件系统对象) */
    FIL fsrc, fdst;      /* 文件对象 */
    BYTE buffer[512];   /* 文件拷贝缓冲区 */
    FRESULT res;         /* FatFs 函数公共结果代码 */
    UINT br, bw;         /* 文件读/写字节计数 */
     DIR DirInf;

你可以简单统计下你的这些局部变量消耗了多少栈空间,文件系统的有些变量非常耗栈空间的。
回复

使用道具 举报

35

主题

73

回帖

343

积分

高级会员

超越昨天

积分
343
QQ
 楼主| 发表于 2016-8-13 10:15:06 | 显示全部楼层

回 eric2013 的帖子

eric2013:明白你的意思,我以为你的说是随着复制文件的增多,任务栈逐渐增大呢。
比较耗任务栈控件是因为你的局部变量。

FATFS fs[2];         /* 逻辑驱动器的工作区(文件系统对象) */
....... (2016-08-11 11:14) 
你理解的没错,就是随着复制文件的增多,任务栈逐渐增大。这种怎么解决。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2016-8-13 11:23:50 | 显示全部楼层

回 fanyanxi 的帖子

fanyanxi:你理解的没错,就是随着复制文件的增多,任务栈逐渐增大。这种怎么解决。 (2016-08-13 10:15) 
for循环里面也没有局部变量,难道有API函数会一直占用,但是这些函数都有返回的,好奇怪。
回复

使用道具 举报

35

主题

73

回帖

343

积分

高级会员

超越昨天

积分
343
QQ
 楼主| 发表于 2016-8-15 11:30:24 | 显示全部楼层

回 eric2013 的帖子

eric2013:for循环里面也没有局部变量,难道有API函数会一直占用,但是这些函数都有返回的,好奇怪。 (2016-08-13 11:23) 
怎么找出是那块一直占用内存?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2016-8-17 10:52:14 | 显示全部楼层

回 fanyanxi 的帖子

fanyanxi:怎么找出是那块一直占用内存? (2016-08-15 11:30) 
只能一步一步调试了,调试for循环里面的时候,观察下MSP主堆栈指针的变化。
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2016-8-19 12:49:33 | 显示全部楼层
你声明的fat fil结构都是很大的   因为fatfs不使用全局变量 工作空间都在这里了

你可以声明为全局变量,就不会放在栈里了
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2016-10-11 17:43:38 | 显示全部楼层
从块内存中申请吧这样使用完后也可以回收
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 07:42 , Processed in 0.257118 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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