硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8885|回复: 8
收起左侧

[FatFs] FATFS重入功能问题 FF_FS_REENTRANT

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2018-12-12 12:44:01 | 显示全部楼层 |阅读模式
最近在做UCOSIII+Fatfs 0.13,遇到一个问题,我有两个任务,一个负责写文件,一个负责读取文件并上传,写文件比较大,写入时间大约5秒左右,并且任务级别低,会被读文件任务抢占,如果在写的过程中,读取文件,


几次后会造成文件系统崩溃,所有的文件都消失,或者写入的文件名异常,文件丢失等不正常现象,在网上搜索后,
知道Fatfs有重入功能,就是使用ucosIII的互斥信号量来控制文件的读写,按网上的要求修改后,再测试,问题依然出现,
然后就进入debug进行跟踪,发现两个问题,一个是互斥信号量的Pend 、Post函数的问题,一个是互斥信号量Post时机的问题。
1. 互斥信号量的Pend 、Post函数的问题
int lock_fs (       /* 1:Ok, 0:timeout */
    FATFS* fs       /* Filesystem object */
)
{
    return ff_req_grant(fs->sobj);
}
fs->sobj :是Fatfs文件系统定义的一个全局的互斥信号量。



int ff_req_grant (  /* 1:Got a grant to access the volume, 0:Could not get a grant */
    FF_SYNC_t sobj /* Sync object to wait */)


    OS_ERR     err;
    CPU_TS  ts;

    OSMutexPend ((OS_MUTEX  *)&sobj,
                 (OS_TICK    )FF_FS_TIMEOUT,
                 (OS_OPT     )OS_OPT_PEND_BLOCKING,
                 (CPU_TS*     )&ts,
                 (OS_ERR    *)&err);   
    return (int)(err == OS_ERR_NONE);   
}
这个是信号量的Pend函数,它的参数是 FF_SYNC_t sobj,不是指针,这样我在调用该函数的时候,只是把全局信号量的所有值赋给了sobj参数,
但是参数sobj的所以修改都不会反馈到fs->sobj里面,这样我的全局互斥信号量就一直是0,一直不在互斥状态。
同样,Post函数也是这样的情况,  我下载了Fatfs之前的版本,都是这样的。我只有把参数更改成指针(FF_SYNC_t *sobj)才能起作用,
但是我想Fatfs这么多人使用,不至于需要修改源代码吧,我是不是有什么地方理解错了,或者用错了,希望大神看看!!!!!!


2. 互斥信号量Post时机的问题:
   我看了f_open,f_opendir等函数,函数的开关Pend信号量,在函数的结束就Post信号量了,这样能起到控制任务抢占的问题?



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2018-12-12 14:12:41 | 显示全部楼层
换一种实现方案,别搞这个底层重入支持了,容易出现各种神奇问题

专门开一个文件系统任务,再弄1个消息队列,根据接收到不同消息处理不同的功能,这样就有效解决重入问题。
回复

使用道具 举报

38

主题

291

回帖

405

积分

高级会员

积分
405
发表于 2019-6-12 13:12:47 | 显示全部楼层
我是通过更改API接口的方式解决的,原来的接口更适合其他的RTOS
没关系,有需求可以大胆改呗。
eric2013的建议是合理的,可以从需求方面关闭FF_FS_REENTRANT
回复

使用道具 举报

6

主题

216

回帖

234

积分

高级会员

积分
234
发表于 2020-3-13 08:46:13 | 显示全部楼层
楼主的互斥访问解决了吗?我也遇到一样问题
回复

使用道具 举报

16

主题

148

回帖

196

积分

初级会员

积分
196
发表于 2020-4-9 22:12:41 | 显示全部楼层
eric2013 发表于 2018-12-12 14:12
换一种实现方案,别搞这个底层重入支持了,容易出现各种神奇问题

专门开一个文件系统任务,再弄1个消息 ...

硬汉兄 抛开单独起一个任务跑文件系统不谈的话  在fatfs已经做可重入处理的前提下 sdio是否还需要进行互斥操作呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2020-4-10 01:36:19 | 显示全部楼层
dyhfaily 发表于 2020-4-9 22:12
硬汉兄 抛开单独起一个任务跑文件系统不谈的话  在fatfs已经做可重入处理的前提下 sdio是否还需要进行互 ...

不需要了。
回复

使用道具 举报

3

主题

75

回帖

84

积分

初级会员

积分
84
发表于 2023-3-14 10:32:43 | 显示全部楼层
eric2013 发表于 2018-12-12 14:12
换一种实现方案,别搞这个底层重入支持了,容易出现各种神奇问题

专门开一个文件系统任务,再弄1个消息 ...

老大,问一下有例程吗?文件任务读取文件的buffer怎么传回给发送者?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2023-3-15 00:40:35 | 显示全部楼层
gjeoi 发表于 2023-3-14 10:32
老大,问一下有例程吗?文件任务读取文件的buffer怎么传回给发送者?

传递buffer地址。
回复

使用道具 举报

3

主题

75

回帖

84

积分

初级会员

积分
84
发表于 2023-3-15 11:02:56 | 显示全部楼层
明白了,用户任务申请一块buffer并在发送的时候带上buffer地址,再加上返回的消息队列。 文件任务处理完之后根据返回的消息队列发送给用户任务处理结果
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 11:51 , Processed in 0.181430 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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