ucos+fatfs+TF卡碰到的文件系统不稳定问题,求救。

2019-07-21 06:32发布

我的问题这里询问过一次,昨天测试了,在发一个求救贴。还请版主手下留情。
http://www.openedv.com/posts/list/0/47326.htm?privmsg=14442&&sysid=4#272187

做了一个新工程
ucosII + fatfs(0.09b) + TF卡 +lpc1788

现在碰到的问题是,文件系统测试,在任务中使用就不稳定,会导致类似文件系统崩溃的情况。
比如:文件不能打开和删除,文件夹不能打开删除,创建了很多同名文件,tf卡不能打开只能格式化,tf卡不能格式化等。

现在怀疑是ucos对文件系统有干扰,因为测试代码放在main函数中OSStart();之前就一切正常,放在任务中,哪怕是单任务只跑测试代码都会出问题。

[mw_shl_code=c,true]int main(void) { SystemInit(); OSInit(); DriverInit();//各硬件初始化 OSTaskCreate(OS_TASK_SCANANDOUTPUT,(void *)0,(OS_STK *)&ScanAndPutStk[4*TASK_STK_SIZE-1],(INT8U)(3)); OSTimeSet(0); // sdwritetest(); //运行没有问题 OSStart(); } void OS_TASK_SCANANDOUTPUT( void *p_arg ) { sdwritetest(); //运行会出错 } //测试代码 void sdwritetest() { while(1) { //写一个文件 。。 //for 循环延时 。。 } }[/mw_shl_code]


有人说要加临界域保护,我按照原子的例子加了
[mw_shl_code=c,true]extern void ff_enter(void); extern void ff_leave(void); #define ENTER_FF(fs) {ff_enter();}//{OS_ENTER_CRITICAL();}//进入FATFS,关闭中断,防止相互干扰 #define LEAVE_FF(fs, res) {ff_leave();return res;}//{OS_EXIT_CRITICAL();return res;}//离开FATFS,开启中断,任务继续执行[/mw_shl_code] [mw_shl_code=c,true]OS_CPU_SR cpu_sr=0; void ff_enter(void) { OS_ENTER_CRITICAL();//进入临界区(无法被中断打断) } void ff_leave(void) { OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断) }[/mw_shl_code]


还有建议是说要保证可重入。我打开了_FS_REENTRANT,按照syscall.c添加了互斥量,还是不行。
考虑到在单任务中运行不行,在main中运行可以,所以怀疑是ucos有干扰。而不是其他比如硬件中断之类的。(我屏蔽了除了tf卡意外的所有中断初始化也不行)。
但是对ucos没有很深的认识,不知道从哪里下手。
求大神指点。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
TinyBoy
1楼-- · 2019-07-21 11:52
可以的,我TF一边读一边串口输出,而且是大数据量都没有问题,是你的程序问题,多检查看看。
caiwei_cs
2楼-- · 2019-07-21 16:16
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-21 20:30
任务堆栈有没有8字节对其?
caiwei_cs
4楼-- · 2019-07-21 21:30
回复【4楼】正点原子:
---------------------------------
原子大神,这个怎么说?
我没这个概念啊。ucos移植是已经做好的。
ScanAndPutStk[4*TASK_STK_SIZE-1]
你是指这个么?
TASK_STK_SIZE = 512
正点原子
5楼-- · 2019-07-22 02:39
[mw_shl_code=c,true]//START 任务 //设置任务优先级 #define START_TASK_PRIO 10 //开始任务的优先级设置为最低 //设置任务堆栈大小 #define START_STK_SIZE 64 //任务堆栈,8字节对齐 __align(8) static OS_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *pdata);[/mw_shl_code]
zhangjingjing
6楼-- · 2019-07-22 06:29
我也遇到同一问题,堆栈8字节对齐也不行呀

一周热门 更多>