搜索
bottom↓
回复: 22

ucos在多个任务、中断中调用OSQpost函数会死机,咋回事?

[复制链接]

出0入211汤圆

发表于 2014-5-5 14:48:28 | 显示全部楼层 |阅读模式
本帖最后由 hushaoxin 于 2014-5-5 14:53 编辑

UCOS2.52版本,有两个任务,和两个中断函数调用OSQpost发送消息到同一个消息队列,运行时间久了就会死机

任务一  post   
任务二  post   
                            任务三 pend
中断一  post   
中断二  post  
   

就像上面这种四对一的结构

目前解决方法是只使用一个中断调用,其他的都停用,这样就不会死机了

仔细看了ucos的OSQpost函数,发现不可中断的程序都有Enter_CRITICAL做保护的,请使用过的网友帮解忙解释一下,谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入211汤圆

 楼主| 发表于 2014-5-5 16:22:24 | 显示全部楼层
论坛沉贴很快啊

出0入211汤圆

 楼主| 发表于 2014-5-6 23:40:52 来自手机 | 显示全部楼层
沉了,顶起来

出0入0汤圆

发表于 2014-5-7 00:24:34 来自手机 | 显示全部楼层
1加大任务栈试试
2确认是否有非法指针访问,用消息队列时容易犯的错误

出0入211汤圆

 楼主| 发表于 2014-5-7 06:48:26 来自手机 | 显示全部楼层
kanprin 发表于 2014-5-7 00:24
1加大任务栈试试
2确认是否有非法指针访问,用消息队列时容易犯的错误

任务堆栈没问题,指针操作也没问题,按你说的意思,ucos是支持多post对单pend的吗?在ucos的官方资料里面没找到这种用法

出0入0汤圆

发表于 2014-5-7 10:25:35 | 显示全部楼层
这个问题我也碰到过,最后没办法用全局变量绕过去了

出0入211汤圆

 楼主| 发表于 2014-5-7 10:52:36 | 显示全部楼层
本帖最后由 hushaoxin 于 2014-5-7 10:54 编辑
M.dd 发表于 2014-5-7 10:25
这个问题我也碰到过,最后没办法用全局变量绕过去了






这是ucos的书,上面的那段话和那个示意图有些矛盾的地方,文字描述的地方说,一个任务或一个中断,而图片里面明显是一个多对多的通讯

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入211汤圆

 楼主| 发表于 2014-5-9 13:19:36 | 显示全部楼层
顶起来一下

出0入0汤圆

发表于 2014-5-11 21:41:54 | 显示全部楼层
应该支持的吧,中断使用post发送的是啥子呢

出0入211汤圆

 楼主| 发表于 2014-5-11 22:31:35 来自手机 | 显示全部楼层
SevenWans 发表于 2014-5-11 21:41
应该支持的吧,中断使用post发送的是啥子呢

单个任务或者中断post没有问题,但是多个就不行,两个都不行

出0入0汤圆

发表于 2014-5-12 00:37:05 | 显示全部楼层
多对一肯定是没问题的, 多对多没试过,不清楚, 不过官网的例程是一对多的, 多对多应该也没什么问题,只是要用来做什么?我也没想过。
但是中断里面不能pend,只能尝试获取-Query,这你应该清楚吧?
Post之后会产生任务切换,注意是否产生优先级翻转之类的问题。

出0入211汤圆

 楼主| 发表于 2014-5-12 06:51:28 来自手机 | 显示全部楼层
kanprin 发表于 2014-5-12 00:37
多对一肯定是没问题的, 多对多没试过,不清楚, 不过官网的例程是一对多的, 多对多应该也没什么问题,只 ...

我现在是ad转换完了之后,post给主任务计算(在DMA中断里面),有几个到了时间post标志过去(在定时器3中断里面),上面两个post是在中断里面进行的,还有一个普通任务也post一个标志给主任务,运行一段时间后,就会出现任务不调度了,所有任务都死翘翘了,但是中断函数都在执行
现在的解决方法是:由于ad采集也是固定时间的,所以定时器3就不要了,用AD采集来计时,那个需要调用post的普通任务干脆就删除了,这样只有DMA中断里面post,主任务pend了,就没有问题,请楼上有空帮我分析一下是什么问题。
1、会不会是移植的时候进入原子操作的那个宏有问题?导致post操作里面的原子操作失败,被打断

出0入211汤圆

 楼主| 发表于 2014-5-12 06:52:55 来自手机 | 显示全部楼层
本帖最后由 hushaoxin 于 2014-5-12 06:54 编辑
SevenWans 发表于 2014-5-11 21:41
应该支持的吧,中断使用post发送的是啥子呢


发送一个变量的值,不是发送一个变量的地址,所以不存在说由于发送了局部变量的问题

出0入0汤圆

发表于 2014-5-12 22:18:38 | 显示全部楼层
1、可以验证一下关中断是否有效

//
enter_critical();
//
event_pend();
//
led_show();
查看一下是否有指示信息。

2、不知道楼主有没有注意到, 消息队列传递的只是一个指针,某个地方发送消息,需要考虑下一个消息要发送但前一个消息又还未被处理时的情况。

出0入211汤圆

 楼主| 发表于 2014-5-12 23:08:31 来自手机 | 显示全部楼层
kanprin 发表于 2014-5-12 22:18
1、可以验证一下关中断是否有效

//

感谢你的回复,
1、你说的方法一确实是一个验证关中断是否有效的很好的方法,今天仔细检查了的,关中断应该没有问题,明天用你说的方法再试一下
2、消息队列传输的是指针没错的的
我传递的是这样子的OSQpost(event,(void *)flag1);
说白了就是把一个局部变量当成一个标志,然后强制转换为一个void指针,当然flag不会为0
所以程序结构是下面这样子的:
中断一:OSQpost(event,(void *)flag1)
中断二:OSQpost(event,(void *)flag2)
任务一:OSQpost(event,(void *)flag3)

主任务:
flag=OSQpend(event,0,&err)
switch(flag)
case  flag1  操作1
case  flag2  操作2
case  flag3  操作3

你觉得我这样操作有问题吗?

出0入0汤圆

发表于 2014-5-13 06:13:58 来自手机 | 显示全部楼层
思路没问题,很多时候问题出在细节上。
比如你写的

flag=OSQpend(event,0,&err)
switch(flag)

后面一个flag就需要带“*”号。

出0入211汤圆

 楼主| 发表于 2014-5-13 07:25:38 来自手机 | 显示全部楼层
kanprin 发表于 2014-5-13 06:13
思路没问题,很多时候问题出在细节上。
比如你写的


这些c语言的语法不会有问题,这个只是手机回复的时候,示意代码
那就是说思路没有问题ucos肯定是支持这种操作的啊?那问题估计出在哪里呢?楼上有位朋友说也碰到了这种情况,他要是参与进来讨论就好了,我目前也和他的解决方法差不多,使用全局变量
还有一个地方不知道有没有问题,就是在ucos移植的时候会将pendsv的优先级置到最低,但是我移植的时候将pendsv和嘀嗒时钟一起置到最低优先级,感觉是没有问题的,不知道你有何见解?

出0入211汤圆

 楼主| 发表于 2014-5-13 07:33:01 来自手机 | 显示全部楼层
M.dd 发表于 2014-5-7 10:25
这个问题我也碰到过,最后没办法用全局变量绕过去了

希望你也描述一下你的情况,比如说结构,使用方法,移植的方法

出0入0汤圆

发表于 2014-5-13 09:33:56 | 显示全部楼层
支持支持 !!!

出0入211汤圆

 楼主| 发表于 2014-5-16 16:03:59 | 显示全部楼层
今天反复测试了一下功能,发现,只要在OSQpend所在的任务里面调用一下OSTimeDly函数,就可以稳定工作,没有问题,但是问题只是治标了,没有找到根本原因

出0入0汤圆

发表于 2014-5-17 13:20:23 | 显示全部楼层
本帖最后由 SevenWans 于 2014-5-17 13:21 编辑

期待大神出来!

我猜是不是这边Pend一直都有效啊,结果这个任务就一直运行,不释放CPU

出0入211汤圆

 楼主| 发表于 2014-5-18 11:13:28 | 显示全部楼层
SevenWans 发表于 2014-5-17 13:20
期待大神出来!

我猜是不是这边Pend一直都有效啊,结果这个任务就一直运行,不释放CPU ...

http://www.amobbs.com/thread-5581238-1-1.html
问题解决,请看上面的帖子

出0入211汤圆

 楼主| 发表于 2014-5-18 11:14:04 | 显示全部楼层
kanprin 发表于 2014-5-12 00:37
多对一肯定是没问题的, 多对多没试过,不清楚, 不过官网的例程是一对多的, 多对多应该也没什么问题,只 ...

http://www.amobbs.com/thread-5581238-1-1.html
问题解决,请看上面帖子
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-31 04:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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