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;	  
    }
    

    串口输出如下:

  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8868922.html
Copyright © 2011-2022 走看看