OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8519|回复: 21

ucos+fatfs功能总是出错

[复制链接]

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-12-6
在线时间
15 小时
发表于 2015-12-6 14:13:54 | 显示全部楼层 |阅读模式
5金钱
最近在调试ucos+fatfs的功能,我是用别人 给我的板子,板子可以肯定是好。我先是不搭载ucos-ii调试fatfs,所有功能都可以实现,但是搭载ucos-ii后总是出现一些莫名其妙的问题。在网上也看到了很多网友的经验和建议,比如任务堆栈8字节对齐;加入fatfs函数可重入,开启互斥信号量;加大任务堆栈。但是对我的工程都不起作用,实在没辙了,来论坛求助,希望各路朋友能给点建议。
我先介绍我的工程思路:
1、开机进行各种初始化,并建立1个文件,这里都没有问题。建立任务,启动系统。
2、启动外部中断,中断发送信息给创建文件任务,创建3个文件(这里有时成功,有时失败,多数情况失败,SD卡插入电脑,有时1个文件,有时2个文件……各种情况都有),并将这3个文件的名字写到初始化建立的文件中(不管前面创建成功与否,这里始终成功,文件里确实写入了3个正确的文件名)
3、系统启动后,任务运行,其他的任务全部正常运行。
起初我觉得是任务之间的干扰导致的,所以我把上面第2步创建3个文件的工作放到了外部中断里来做,但是更奇葩的现象出现了,在中断里,程序自动跳过fatfs的功能函数f_open/f_write/f_close,根本不执行它们,而其他的与fatfs不相关的语句都执行。

此外我想向大家请教下,使用ucos+fatfs是不是一定要开启任务堆栈8字节对齐,是不是一定要加入syscall.c文件并且开启互斥信号量??

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-12-6 23:00:26 | 显示全部楼层
参考下我们开发板的综合实验吧.
支持fatfs和ucos
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-12-6
在线时间
15 小时
 楼主| 发表于 2015-12-6 23:19:21 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子大神,根据你的经验,使用ucos+fatfs是不是一定要开启任务堆栈8字节对齐,是不是一定要加入syscall.c文件并且开启互斥信号量呢?不这么做是不是也可啊?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-12-6 23:52:34 | 显示全部楼层
回复【3楼】ilikedota:
---------------------------------
8字节对其是需要的.
syscall.c没用过.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-12-6
在线时间
15 小时
 楼主| 发表于 2015-12-7 13:36:11 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
那请问你有没有有遇到过在多任务中调用fatfs的相关函数导致不稳定的问题,比如,三个任务都调用f_read。
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-12-6
在线时间
15 小时
 楼主| 发表于 2015-12-7 21:55:49 | 显示全部楼层
调试了一天还是没有调试好。我在创建文件的任务中开启了开中断和关中断,这回是可以创建3个文件了,但是新的问题出现了,只能创建1次,后面再来外部中断信号就不创建了~~~~(>_<)~~~~更悲催的是我发现我的2张SD卡插入电脑的SD插槽后,电脑居然提示说要将SD卡格式化,但是我点击确定后,windows提示无法格式化,现在在电脑上不能读写卡了,但是我插入相机,通过相机连接电脑又可以读卡,这这这…………………………………………………………
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-12-10 00:17:11 | 显示全部楼层
回复【5楼】ilikedota:
---------------------------------
我都解决了。
详见我们的综合测试实验。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-12-6
在线时间
15 小时
 楼主| 发表于 2015-12-31 23:51:28 | 显示全部楼层
本帖最后由 ilikedota 于 2015-12-31 23:53 编辑
正点原子 发表于 2015-12-10 00:17
回复【5楼】ilikedota:
---------------------------------
我都解决了。
详见我们的综合测试实验。

参考了原子哥的综合实验例程,发现我的SD卡底层驱动确实写的有漏洞,更新驱动后,发现我的工程还是有些问题,只是比更新前少了。最近跌跌撞撞的,所有的问题也算解决了吧,文件系统算是比较稳定的用起来了。我就分享下我的做法吧,更新驱动后,还是会出现f_open/f_write等函数调用不稳定,要么创建不了文件,要么创建出垃圾文件,导致SD卡损坏。后来我索性在不同的任务里在要调用fatfs的API前,先把中断关掉,等API操作完,在开启中断,就这样所有的任务稳稳的跑起来了。
之后我尝试用调度器上锁和开锁来代替关中断和开中断,目的都是为了不让当前任务被切换出去,从而保证fatfs的API不会多重进入,但是效果还是不好,仍然出现创建文件失败的情况,并且奇怪的是,程序的显示文件创建成功了,但是把SD卡插PC机,PC界面显示没有文件。这个问题就先这样吧,估计还是有某个点没有发现它的问题。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-1-2 11:18:02 | 显示全部楼层
ilikedota 发表于 2015-12-31 23:51
参考了原子哥的综合实验例程,发现我的SD卡底层驱动确实写的有漏洞,更新驱动后,发现我的工程还是有些问 ...

这个我也是调试了很久的。。。重点就是:一定要做好互斥访问。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-1-2
在线时间
23 小时
发表于 2016-1-2 19:00:44 | 显示全部楼层
ilikedota 发表于 2015-12-31 23:51
参考了原子哥的综合实验例程,发现我的SD卡底层驱动确实写的有漏洞,更新驱动后,发现我的工程还是有些问 ...

你好 ,我也碰到这个头疼问题 ,弄了几天了,过年都不放假的弄 ,两个任务都随时要读取SD卡里面的文件,肯定会有存在A任务还没有关闭文件之前,另一个任务要去读取文件,甚至是读取的是同一个文件的时候。现在问题是在运行中偶尔会死掉一个任务,调试发现死在读取SD卡的函数里,现象有点奇怪,当其中的一个任务死了,另一个任务是没有影响的,可以正常运行,我怀疑是不是一定要加入重入功能 ,可是老加不进去 ,老提示
a value of type "OS_EVENT *" cannot be assigned to an entity of type "OS_EVENT",不知道你的问题是怎么解决的,
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-1-2
在线时间
23 小时
发表于 2016-1-2 19:13:04 | 显示全部楼层
ilikedota 发表于 2015-12-31 23:51
参考了原子哥的综合实验例程,发现我的SD卡底层驱动确实写的有漏洞,更新驱动后,发现我的工程还是有些问 ...

我在其中的一个任务里,在打开文件和读取文件前,加入了OS_ENTER_CRITICAL();关闭调度,等读取完关闭文件后再OS_EXIT_CRITICAL();打开调度,问题依然存在,唉 ,头疼啊
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-12-6
在线时间
15 小时
 楼主| 发表于 2016-1-3 17:23:18 | 显示全部楼层
h_jl2005 发表于 2016-1-2 19:00
你好 ,我也碰到这个头疼问题 ,弄了几天了,过年都不放假的弄 ,两个任务都随时要读取SD卡里面的文件, ...

现这个提示是不是你没有把关于ucos的头文件加入到syscall.c里面 啊?OS_EVENT是ucos的数据类型。
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-12-6
在线时间
15 小时
 楼主| 发表于 2016-1-3 17:28:24 | 显示全部楼层
本帖最后由 ilikedota 于 2016-1-3 17:29 编辑
h_jl2005 发表于 2016-1-2 19:13
我在其中的一个任务里,在打开文件和读取文件前,加入了OS_ENTER_CRITICAL();关闭调度,等读取完关闭文件 ...

你先按照我说的试试看,保证syscall.c文件能够加入你的工程。我不太建议使用开中断和关中断的方法,虽然我是这样做的,这样做对其他任务的运行在时间上影响还是很大的。此外说明一下,我用的fatfs是最新的R0.11版本的,不知道你的是不是。
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-1-2
在线时间
23 小时
发表于 2016-1-4 18:12:40 | 显示全部楼层
ilikedota 发表于 2016-1-3 17:28
你先按照我说的试试看,保证syscall.c文件能够加入你的工程。我不太建议使用开中断和关中断的方法,虽然 ...

我的是0.10B版本 ,现在我还是暂时使用关中断的办法 ,但是SD卡和U盘同时用到的时候就蛋疼了,U盘只能关闭调度,不能关中断 ,USB处理使用的中断 ,现在基本没有什么问题,但是还是很担心使用关中断的方法 ,迟早发现问题的,syscall.c文件加进去就是老是报错,也不是没有包含头文件,         *sobj = OSMutexCreate(0, &err);        OSMutexDel(sobj, OS_DEL_ALWAYS, &err);        OSMutexPend(sobj, _FS_TIMEOUT, &err);        OSMutexPost(sobj);
这几个函数愣是说 a value of type "OS_EVENT *" cannot be assigned to an entity of type "OS_EVENT", 愣是说不兼容的数据类型 可是我都是用同一个OS_EVENT去定义的,
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-1-2
在线时间
23 小时
发表于 2016-1-4 18:17:35 | 显示全部楼层
正点原子 发表于 2015-12-6 23:52
回复【3楼】ilikedota:
---------------------------------
8字节对其是需要的.
syscall.c没用过.

原子老大是不是 使用下syscall.c文件到底怎么个用法 啊,我英文太烂,没有办法弄进去
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-1-4 23:24:21 | 显示全部楼层
h_jl2005 发表于 2016-1-4 18:17
原子老大是不是 使用下syscall.c文件到底怎么个用法 啊,我英文太烂,没有办法弄进去

我也没用过
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-1-2
在线时间
23 小时
发表于 2016-1-5 15:10:17 | 显示全部楼层

用关调度的法子还是比较稳定,关中断的就很难控制了,偶尔会出现莫名其妙的问题
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-12-6
在线时间
15 小时
 楼主| 发表于 2016-1-7 12:25:12 | 显示全部楼层
正点原子 发表于 2016-1-2 11:18
这个我也是调试了很久的。。。重点就是:一定要做好互斥访问。

原子哥,我又看了遍你的综合实验例程,没看到你是怎么做的互斥啊?能讲讲吗?
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-12-6
在线时间
15 小时
 楼主| 发表于 2016-1-7 12:27:11 | 显示全部楼层
h_jl2005 发表于 2016-1-5 15:10
用关调度的法子还是比较稳定,关中断的就很难控制了,偶尔会出现莫名其妙的问题

我的和你相反,关中断很稳定,关调度就出问题,我也很纠结到底怎么回事,还是没有发现问题的根源所在。
回复

使用道具 举报

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-1-2
在线时间
23 小时
发表于 2016-1-12 18:35:59 | 显示全部楼层
ilikedota 发表于 2016-1-7 12:27
我的和你相反,关中断很稳定,关调度就出问题,我也很纠结到底怎么回事,还是没有发现问题的根源所在。

还是使劲研究下重入功能吧,先用着先,等完成全部了最后弄它,很折腾人,这个重入
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-7-15
在线时间
47 小时
发表于 2020-8-5 20:23:01 | 显示全部楼层
正点原子 发表于 2015-12-6 23:00
参考下我们开发板的综合实验吧.
支持fatfs和ucos

大神,这个综合实验是在哪找呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-8-6 01:25:48 | 显示全部楼层
captainhn 发表于 2020-8-5 20:23
大神,这个综合实验是在哪找呢

我们每个开发板都有一个这样的例程,程序源码,寄存器版本,最后一个例程就是
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 13:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表