FatFs文件系统不能同时读写一个磁盘

2019-07-20 05:05发布

本帖最后由 kokoromi 于 2018-11-12 15:14 编辑

最近调试多任务同时读写同一磁盘文件,头都大了,FatFs自带的那个线程安全设置即便打开了也不管用(配置了Mutex信号量),现在问题是这样的:
1、打开FatFs的互斥功能,配置ffsystem.c中的几个函数,加入Mutex功能,两个任务同时读取SD卡中的文件,程序直接卡死在等待SD卡标志位语句上;
2、在 1的前提下,我把SD卡底层驱动函数也加入的互斥功能,使用的一般信号量,初值为 1的方式,程序正常运行;
3、在 1的前提下,我把SD卡底层驱动函数也加入的互斥功能,使用的互斥信号量,程序跑飞直接进入硬错误;
4、打开FatFs的互斥功能,配置ffsystem.c中的几个函数,加入Sem功能(初值 1),然后再加入步骤 2或者3,程序都正常。

想问一下,互斥信号量不能嵌套吗?我分析了一下,直接打开FatFs的互斥功能不行,底层驱动函数也必须加入互斥功能,现在问题就是如果我在底层驱动里再加入互斥功能,程序就不行了,加入普通信号量就可以,这是为什么呢?调试了好几天,唉...

下面这种形式就不行:
OSMutexPend(M1);
OSMutexPend(M2);
OSMutexPost(M2);
OSMutexPost(M1);

这种就可以...
OSMutexPend(M1);
OSSemPend(S1);
OSSemPost(S1);
OSMutexPost(M1);



希望大神帮我分析分析~


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
翼行园子
1楼-- · 2019-07-20 10:11
帮顶!!
kokoromi
2楼-- · 2019-07-20 12:28
 精彩回答 2  元偷偷看……
kokoromi
3楼-- · 2019-07-20 13:16
程序跑飞之前会进入这个系统函数:

OS_PRIO  OS_MutexGrpPrioFindHighest (OS_TCB  *p_tcb)
{
    OS_MUTEX     **pp_mutex;
    OS_PRIO        highest_prio;
    OS_PRIO        prio;
    OS_PEND_DATA  *p_head;


    highest_prio = OS_CFG_PRIO_MAX - 1u;
    pp_mutex = &p_tcb->MutexGrpHeadPtr;

    while(*pp_mutex != (OS_MUTEX *)0) {
        p_head = (*pp_mutex)->PendList.HeadPtr;
        if (p_head!= (OS_PEND_DATA *)0) {
            prio = p_head->TCBPtr->Prio;
            if(prio < highest_prio) {
                highest_prio = prio;
            }
        }
        pp_mutex = &(*pp_mutex)->MutexGrpNextPtr;
    }

    return (highest_prio);
}
我看了下,那个p_head是0x11111111,一看这个值就不正常,但是真的不知道为什么会出现这种情况。
01.png
mygod
4楼-- · 2019-07-20 18:55
先了解原理再改啊

一周热门 更多>