OpenEdv-开源电子网

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

FATFS 打开文件夹失败 求大佬帮忙

[复制链接]

32

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2015-1-30
在线时间
40 小时
发表于 2021-2-8 16:39:28 | 显示全部楼层 |阅读模式
1金钱
目标:我把GIF转JGP 然后生成BIN文件放在SD卡里面 然后读取并且显示;
我用的是正点原子的历程;
每个文件夹里面有50个BIN文件   运行47循环卡死  正常读取显示了 50*47个文件。。。
while(1)
{
     display("0:");
    display("0:/1");
    display("0:/2");
    display("0:/3");         
   display("0:/4");       
    ii++;
   LCD_ShowNum(30,230,ii,8,16);               
    //记录次数                       
  if(ii==10000000)ii=0;
}

void display(u8 *path1)
{
        u8 res=0;       
  u32 i=0;
        //        u32 ii=0;
  u8 *test_buff1;
        u16 *test_buff2;
  HEADCOLOR *imginfo;
        u32 file_byte=0;                
        u8 rval=0;                        //返回值       
        DIR picdir;                         //图片目录
        FILINFO picfileinfo;//文件信息
        u8 *fn;                           //长文件名
        u8 *pname;                        //带路径的文件名
        u16 totpicnum;                 //图片文件总数
        u16 curindex;                //图片当前索引
        u16 temp;
        u16 *picindextbl;        //图片索引表 ?

  while(f_opendir(&picdir,(const TCHAR*)path1))//打开图片文件夹
        {            
                Show_Str(30,170,240,16,"PICTURE文件夹错误!",16,0);
                delay_ms(200);                                  
                LCD_Fill(30,170,240,186,WHITE);//清除显示             
                delay_ms(200);               
        }  

        totpicnum=pic_get_tnum(path1); //得到总有效文件数

  picfileinfo.lfsize=_MAX_LFN*2+1;                                                //长文件名最大长度
        picfileinfo.lfname=mymalloc(SRAMIN,picfileinfo.lfsize);        //为长文件缓存区分配内存
        pname=mymalloc(SRAMIN,picfileinfo.lfsize);                                //为带路径的文件名分配内存
        picindextbl=mymalloc(SRAMIN,2*totpicnum);                                //申请2*totpicnum个字节的内存,用于存放图片索引
        //记录索引
  res=f_opendir(&picdir,(const TCHAR*)path1); //打开目录
        if(res==FR_OK)
        {
                curindex=0;//当前索引为0
                while(1)//全部查询一遍
                {
                        temp=picdir.index;                                                                //记录当前index
            res=f_readdir(&picdir,&picfileinfo);                       //读取目录下的一个文件
            if(res!=FR_OK||picfileinfo.fname[0]==0)break;        //错误了/到末尾了,退出       
                        picindextbl[curindex]=temp;//记录索引
      curindex++;                         
                }
       
        }       
  LCD_ShowNum(30,170,totpicnum,5,16);               
  LCD_ShowNum(30,190,curindex,5,16);               
        curindex=0;                                                                                        //从0开始显示

  rval=f_opendir(&picdir,(const TCHAR*)path1);         //打开目录
        while(rval==FR_OK)//打开成功
        {
                dir_sdi(&picdir,picindextbl[curindex]);                        //改变当前目录索引       
                LCD_ShowNum(30,170,curindex,5,16);
                rval=f_readdir(&picdir,&picfileinfo);                       //读取目录下的一个文件
          if(rval!=FR_OK||picfileinfo.fname[0]==0)break;        //错误了/到末尾了,退出
    fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);                         
          strcpy((char*)pname,(const TCHAR*)path1);                                //复制路径(目录)
                strcat((char*)pname,"/");                          //将/粘贴在后面 否则路径错误
                strcat((char*)pname,(const char*)fn);                          //将文件名接在后面
                Show_Str(2,2,240,16,pname,16,1);                                 //显示图片名字
           rval=f_open(file,(char*)pname,FA_READ);        //只读方式打开文件       
           file_byte=f_size(file);//获得文件长度
          test_buff1=mymalloc(SRAMEX,file_byte);
          for(;;)//读取内容
          {
                f_read (file, test_buff1, file_byte, (UINT*)&br);               
                if(br==0)break;
          }       
    f_close (file);        //打开后一定要关闭                                                                       
          test_buff2=mymalloc(SRAMEX,file_byte);
          imginfo=(HEADCOLOR*)test_buff1;        //得到文件信息  
         
                if(imginfo->w>=lcddev.width||imginfo->h>=lcddev.height)
                        {
                                POINT_COLOR=RED;          
                                delay_ms(200);
                                LCD_ShowString(10,70,200,16,16,"The Picture is too large");       
                                delay_ms(200);
                  continue;
                        }else{
                 for(i=0;i<file_byte/2-4;i++)//两个8BIT组合一个16BIT所以要除以2 8个信息头字节所以除以2后减4
                        {
                                test_buff2[i]=image_getcolor(0,(u8*)test_buff1+8);//跳过信息头+8
                                test_buff1+=2;
                        }
                        LCD_Color_Fill(1,1,imginfo->w,imginfo->h,test_buff2);        
                        }       
                  curindex++;               
                       
       /*if(curindex>=totpicnum)
                         {curindex=0;//到末尾的时候,自动从头开始               
                                                    ii++;
                     LCD_ShowNum(30,230,ii,8,16);               
         //目录下20个文件实测运行7W次无错误                       
                    if(ii==10000000)
           {
                                                 ii=0;
                                         }
                         }         */
                 if(curindex>=totpicnum)
                         {
                                 f_closedir(&picdir);       
                                 break;
                         }       
                        myfree(SRAMEX,test_buff1);                        //释放内存               
      myfree(SRAMEX,test_buff2);                        //释放内存

        }



运行到第47次卡死在
  while(f_opendir(&picdir,(const TCHAR*)path1))//打开图片文件夹
        {            
                Show_Str(30,170,240,16,"PICTURE文件夹错误!",16,0);
                delay_ms(200);                                  
                LCD_Fill(30,170,240,186,WHITE);//清除显示             
                delay_ms(200);               
        }  


求大佬帮忙找问题 谢谢

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

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8631
金钱
8631
注册时间
2020-5-11
在线时间
4069 小时
发表于 2021-2-9 09:56:26 | 显示全部楼层
大概一看,malloc明显比free多啊,确定释放完了?
专治疑难杂症
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2021-2-9 22:09:44 | 显示全部楼层
内存爆了吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-14 03:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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