OpenEdv-开源电子网

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

FATFS函数f_readdir读取死机

[复制链接]

31

主题

147

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2182
金钱
2182
注册时间
2014-6-30
在线时间
341 小时
发表于 2017-2-4 16:06:24 | 显示全部楼层 |阅读模式
1金钱
现在是打开SD文件夹都正常,但是当进入函数f_readdir中时,出现死机现象,在使能了长文件名和中文支持的情况下(_USE_LFN=3,_CODE_PAGE=936),当把get_fileinfo函数中的这段代码屏蔽掉时能读取文件名,但是读不出来常文件名,函数是在主函数中调用的,在主函数中申明了FILINFO Tempfile,和 DIR Tempfile,结构体成员Tempfile.fsize被赋的值为Tempfile.fsize=_MAX_LFN*2+1,但当结构体参数传入函数f_readdir函数中时结构体的成员Tempfile.fsize被清零了,是结构体被定义到主函数内部的原因吗,求大神帮忙解决
#if _FS_MINIMIZE <= 1 || _FS_RPATH >= 2
static
void get_fileinfo (                /* No return code */
        DIR* dp,                        /* Pointer to the directory object */
        FILINFO* fno                 /* Pointer to the file information to be filled */
)
{
        UINT i;
        TCHAR *p, c;


        p = fno->fname;
        if (dp->sect) {                /* Get SFN */
                BYTE *dir = dp->dir;

                i = 0;
                while (i < 11) {                /* Copy name body and extension */
                        c = (TCHAR)dir[i++];
                        if (c == ' ') continue;                        /* Skip padding spaces */
                        if (c == NDDE) c = (TCHAR)DDE;        /* Restore replaced DDE character */
                        if (i == 9) *p++ = '.';                        /* Insert a . if extension is exist */
#if _USE_LFN
                        if (IsUpper(c) && (dir[DIR_NTres] & (i >= 9 ? NS_EXT : NS_BODY)))
                                c += 0x20;                        /* To lower */
#if _LFN_UNICODE
                        if (IsDBCS1(c) && i != 8 && i != 11 && IsDBCS2(dir[i]))
                                c = c << 8 | dir[i++];
                        c = ff_convert(c, 1);        /* OEM -> Unicode */
                        if (!c) c = '?';
#endif
#endif
                        *p++ = c;
                }
                fno->fattrib = dir[DIR_Attr];                                /* Attribute */
                fno->fsize = LD_DWORD(dir+DIR_FileSize);        /* Size */
                fno->fdate = LD_WORD(dir+DIR_WrtDate);                /* Date */
                fno->ftime = LD_WORD(dir+DIR_WrtTime);                /* Time */
        }
        *p = 0;                /* Terminate SFN string by a \0 */

//#if _USE_LFN
//        if (fno->lfname) {
//                WCHAR w, *lfn;

//                i = 0; p = fno->lfname;
//                if (dp->sect && fno->lfsize && dp->lfn_idx != 0xFFFF) {        /* Get LFN if available */
//                        lfn = dp->lfn;
//                        while ((w = *lfn++) != 0) {                /* Get an LFN character */
//#if !_LFN_UNICODE
//                                w = ff_convert(w, 0);                /* Unicode -> OEM */
//                                if (!w) { i = 0; break; }        /* No LFN if it could not be converted */
//                                if (_DF1S && w >= 0x100)        /* Put 1st byte if it is a DBC (always false on SBCS cfg) */
//                                        p[i++] = (TCHAR)(w >> 8);
//#endif
//                                if (i >= fno->lfsize - 1) { i = 0; break; }        /* No LFN if buffer overflow */
//                                p[i++] = (TCHAR)w;
//                        }
//                }
//                p[i] = 0;        /* Terminate LFN string by a \0 */
//        }
//#endif
}
#endif /* _FS_MINIMIZE <= 1 || _FS_RPATH >= 2*/

最佳答案

查看完整内容[请看2#楼]

问题圆满解决,移除了一些没用的头文件,出错原因在于文件信息的结构体在函数减传递时里面的长文件名lfsize的值被清零了导致在get_fileinfo函数中有个判断进不去,从而使的长文件名加载不出来,但为什么结构体传递会被清零还不清楚,总之我移除的是和文件系统不搭边的一些头文件,总而言之,问题已经解决
在电路上充实自己
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

147

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2182
金钱
2182
注册时间
2014-6-30
在线时间
341 小时
 楼主| 发表于 2017-2-4 16:06:25 | 显示全部楼层
问题圆满解决,移除了一些没用的头文件,出错原因在于文件信息的结构体在函数减传递时里面的长文件名lfsize的值被清零了导致在get_fileinfo函数中有个判断进不去,从而使的长文件名加载不出来,但为什么结构体传递会被清零还不清楚,总之我移除的是和文件系统不搭边的一些头文件,总而言之,问题已经解决
在电路上充实自己
回复

使用道具 举报

31

主题

147

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2182
金钱
2182
注册时间
2014-6-30
在线时间
341 小时
 楼主| 发表于 2017-2-4 18:40:45 | 显示全部楼层
顶顶
在电路上充实自己
回复

使用道具 举报

31

主题

147

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2182
金钱
2182
注册时间
2014-6-30
在线时间
341 小时
 楼主| 发表于 2017-2-6 09:44:34 | 显示全部楼层
顶顶顶顶顶
在电路上充实自己
回复

使用道具 举报

31

主题

147

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2182
金钱
2182
注册时间
2014-6-30
在线时间
341 小时
 楼主| 发表于 2017-2-6 09:44:53 | 显示全部楼层
顶顶顶顶顶
在电路上充实自己
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-2-6 18:18:39 | 显示全部楼层
仿真跟踪下,看看死哪了
回复

使用道具 举报

31

主题

147

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2182
金钱
2182
注册时间
2014-6-30
在线时间
341 小时
 楼主| 发表于 2017-2-6 18:35:24 | 显示全部楼层
正点原子 发表于 2017-2-6 18:18
仿真跟踪下,看看死哪了

我用液晶屏显示函数打印跟踪的,因为SWD口和SD卡的片选公用了,没法仿真了,看了下貌似在传递结构体参数的时候内部成员有个变量清零了,传递前是赋了值的,导致了在函数get_fileinfo里面有个判断进不去,不知咋回事啊,麻烦原子哥指点下啊
在电路上充实自己
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 19:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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