zoukankan      html  css  js  c++  java
  • 配置 FATFS 支持长文件名

    FATFS 版本:Nov 09 14 R0.10c

    在 FATFS 已经移植好的基础上,首先打开 ffconf.h 配置文件,找到如下图配置项:

    可以将此值从 0 改为 1 使用 static working buffer on the BSS,但官方不建议这么做,会产生线程安全问题(Always NOT thread-safe.);
    我采用的配置 2,使用栈来分配 LFN working buffer,官方提示的(take care on stack overflow)很良心,当时我是用 STM32RCT6 来做的此实验,发现无法输出 SD 卡内的文件名,百思不得其解,后来突然想到了这个提示,故将栈区放大试一试,果然成功了。修改方法如下(在 STM32 的启动文件中修改):

    初始值为 0x00000400 为 1kbytes,改为 0x00001000 4kbytes。

    当然我们可以在单片机上模拟出个内存管理,实现 mallock free 等函数,这时我们就可以将此项配置为 3 ,以堆的方式来实现(Enable LFN with dynamic working buffer on the HEAP.),这里我们不做此介绍。

    为了能够支持中文,还需要把 _CODE_PAGE 的值改为 936,并把 option/cc936.c 文件添加到工程中, 如下图所示:

    实例演示:

    调用如下代码:

    u8 scan_files(u8 * path)
    {
    	FRESULT res;
    	char buf[512] = {0};	
      char *fn;
    	
    #if _USE_LFN
     	fileinfo.lfsize = _MAX_LFN * 2 + 1;
    	fileinfo.lfname = buf;
    #endif		  
    
        res = f_opendir(&dir,(const TCHAR*)path);
        if (res == FR_OK) 
    	{	
    		printf("
    "); 
    		
    		while(1){
    			
    			res = f_readdir(&dir, &fileinfo);                
    			if (res != FR_OK || fileinfo.fname[0] == 0) break;  
    
    #if _USE_LFN
    			fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
    #else							   
    			fn = fileinfo.fname;
    #endif	    
            
                /* 输出目录及文件名 */
    			printf("%s/", path);			
    			printf("%s
    ", fn);			
    		} 
      }	  
    
        return res;	  
    }
    

    串口输出如下:

  • 相关阅读:
    linux之使用samba实现文件共享
    高级C/C++编译技术之读书笔记(三)之动态库设计
    Java之序列流SequenceInputStream
    Java文件清单列表
    Java之Property-统获取一个应用程序运行的次数
    Java持久化存储对象Properties的方法list、store、load
    Java深度遍历文件夹(递归实现)
    Java流操作之转换流
    Java之字节输入流和输出流
    Java自定义缓冲区MyBufferedReader
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8868922.html
Copyright © 2011-2022 走看看