OpenEdv-开源电子网

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

FATFS函数返回值错误分析

[复制链接]

15

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2017-5-21
在线时间
211 小时
发表于 2018-2-11 18:34:13 | 显示全部楼层 |阅读模式
10金钱
大家好。这两天我自己试验原子哥的FATFS实验,用原子哥的方式做了一遍,没有问题。然后自己在STM32 CubeMX里开启FreeRTOS和FATFS做了一遍,发现一个错误,搞不明白问题在哪,希望有知道的前辈指点一下。

问题1:f_mount 和 f_open 两个函数均能返回正常,但是之后的f_lseek 和 f_write却一直返回9,即“        FR_INVALID_OBJECT,                /* (9) The file/directory object is invalid */”。
还有任务的堆栈也是够的。
搞了两天也没有搞明白哪错了,求指点。(任务的具体代码放在文章最后。)
001.png 002.png

问题2:STM32起始文件里的堆栈是做什么用的?两个值的大小依据什么确定?(如下图红框内的内容)
004.png
因为我汇编学得不好,看不懂。希望有明白的前辈也指点一下。
-------------
代码如下:
[mw_shl_code=c,true]void TFCard_Task(void const * argument)
{        
        static uint8_t  res = 55;
        uint8_t  t = 0;
        char buf[1] = {0};
        
        /*申请内存*/
        fs = (FATFS*)pvPortMalloc(sizeof(FATFS));//磁盘工作区
        if(fs != NULL)
                printf("内存1申请成功!\r\n");
        else
                printf("内存1申请失败!\r\n");
        
        file = (FIL*)pvPortMalloc(sizeof(FIL));//文件内存
        if(file != NULL)
                printf("内存2申请成功!\r\n");
        else
                printf("内存2申请失败!\r\n");
        
        res = f_mount(fs,"0:",1);                                         //挂载SD卡
        printf("函数f_mount返回的值是:%d.\r\n",res);

        
        while(1)
        {
                res = f_open (file,"0:/tan.txt", FA_OPEN_ALWAYS|FA_WRITE);        
                printf("f_open函数的返回值为:%d.\r\n",res);

                res = f_lseek(file, f_size(file));
                printf("f_lseek函数的返回值为:%d.\r\n",res);
               
                for (; t<20;t++)
                {
                        sprintf(buf,"%d",t);
                        res =  f_write (file, buf, 2, &bww);
                        res =  f_write (file, "\r\n", 3, &bww);

                        printf("f_write函数的返回值为:%d.\r\n",res);
                                
                        f_sync(file);                                
                        delay_ms(1000);        
                }
                f_sync(file);
                res = f_close(file);
                printf("f_close函数的返回值为:%d.\r\n",res);
               
                t = 0;
                delay_ms(1000);        
        }
}[/mw_shl_code]

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

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-2-13 05:00:01 | 显示全部楼层
stack是用于给每个子函数内的临时变量分配存储空间的。
heap则是一个公用的大存储空间,谁都可以动态申请占用,但是用完必须返还。
至于你的错误我不知道为什么。
res = f_lseek(file, f_size(file)-1);
试试?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-2-19 23:16:13 | 显示全部楼层
一上来就上系统了啊?  先试试裸奔的吧。
回复

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-2-20 07:53:44 | 显示全部楼层
res = f_lseek(file, f_size(file)-1);  试试?
回复

使用道具 举报

15

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2017-5-21
在线时间
211 小时
 楼主| 发表于 2018-2-25 21:37:02 | 显示全部楼层
backup2k 发表于 2018-2-13 05:00
stack是用于给每个子函数内的临时变量分配存储空间的。
heap则是一个公用的大存储空间,谁都可以动态申请 ...

多谢指点。不过错误还是没有搞好。
回复

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2018-2-26 09:03:44 | 显示全部楼层
工程方便打包上来吗?帮你看看?
回复

使用道具 举报

4

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
397
金钱
397
注册时间
2019-12-5
在线时间
41 小时
发表于 2020-9-4 14:04:32 | 显示全部楼层
LZ解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 11:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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