开RT_DFS_ELM_REENTRANT导致文件不能创建

发布于 2017-03-06 21:20:57
平台STM32F767正点原子,SD卡,SDIO接口;
移植好后可以cat文件,表面读驱动正常;
可以创建文件夹,写驱动应该也就正常了;
fd=open(file_name,O_RDWR|O_CREAT,0);这句会在

int ff_req_grant(_SYNC_t m)
{
if (rt_mutex_take(m, _FS_TIMEOUT) == RT_EOK)
return RT_TRUE;

return RT_FALSE;
}


返回RT_FALSE;
全局搜索发现ffconf.h这里有点描述:
/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module.
/
/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect.
/ 1: Enable reentrancy. Also user provided synchronization handlers,
/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj
/ function must be added to the project. */

于是注释掉RT_DFS_ELM_REENTRANT,然后创建文件成功;

反推用了这个函数的程序,出现在这里;

static
FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */
FATFS *fs, /* Pointer to the file system object */
WORD id /* Member id of the target object to be checked */
)
{
if (!fs || !fs->fs_type || fs->id != id)
return FR_INVALID_OBJECT;

ENTER_FF(fs); /* Lock file system */

if (disk_status(fs->drv) & STA_NOINIT)
return FR_NOT_READY;

return FR_OK;
}

然而很多open、read之类的函数都调用了,用IAR quick watch看了
出问题时rt_mutex_take(m, _FS_TIMEOUT)中的m是归finsh_thread的;
但是在finsh_thread没找到谁操作了啊,何处下手呢,请大侠们指点一下。

查看更多

关注者
0
被浏览
1.8k
3 个回答
bernard
bernard 2017-03-06
F7要考虑cache了,是否是cache引入的问题?
jeffwei
jeffwei 2017-03-07
谢谢回复,昨晚9点半出差到北京了,板子带着,刚刚试了一下
open函数前面用SCB_CleanInvalidateDCache(); 清理了cache
结果没用;晚点有空再追踪一下,不知道别的平台有无这个问题;
我的STM32F103开发板送人了,咱们论坛的407板子还没空实验。
-------------------------------------------------------------------
更新一点,刚才看了realtouch的代码,这个RT_DFS_ELM_REENTRANT是打开的;
说明之前407平台是正常的,这个问题可能是767上出的问题,或者DFS组件代码改了很多;
---------------------------------------------------------------------------------------------
再次更新一下;老大是对的,注释了//CPU_CACHE_Enable();这句就好了;
看来清除Dcache不够

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览