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