请选择 进入手机版 | 继续访问电脑版

安富莱电子论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 101|回复: 1
收起左侧

[FatFs] FATFS重入功能问题 FF_FS_REENTRANT

[复制链接]

1

主题

1

帖子

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信号量了,这样能起到控制任务抢占的问题?



回复

使用道具 举报

5275

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

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

专门开一个文件系统任务,再弄1个消息队列,根据接收到不同消息处理不同的功能,这样就有效解决重入问题。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|安富莱电子论坛 ( 鄂ICP备09023347号,公安机关备案号42010602000201 )

GMT+8, 2019-2-19 15:01 , Processed in 0.165520 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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