本帖最后由 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);
希望大神帮我分析分析~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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,一看这个值就不正常,但是真的不知道为什么会出现这种情况。
一周热门 更多>