搜索
bottom↓
回复: 12

RT-THREAD 的rt_thread_suspend 好像无法将任务挂起

[复制链接]

出0入0汤圆

发表于 2012-5-14 14:12:21 | 显示全部楼层 |阅读模式
最近在移植RT-THREAD 碰到了一个问题:我想在一个任务里面将另外一个任务挂起,在这个任务执行完毕才恢复挂起的任务,调用rt-thread  API 函数 rt_thread_suspend 后 发现我想挂起的任务仍然在运行,这就很奇怪了,不知道大家是否也发现是这样子,这是RT-THREAD故意这样设计的吗?那有什么办法可以实现类似UCOS 下 OSTaskSuspend  功能的?期待高手来帮我解答一下。

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

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

出0入0汤圆

 楼主| 发表于 2012-5-14 14:39:54 | 显示全部楼层
刚才又单步跟踪了一下发现 rt_thread_suspend 中有这样一段 if (thread->stat != RT_THREAD_READY)
        {
                RT_DEBUG_LOG(RT_DEBUG_THREAD,\
                        ("thread suspend: thread disorder, %d\n", thread->stat));
               
                return -RT_ERROR;
        }
      好像是要等到我要挂起的任务不处于DELAY状态才能执行下面的操作,但是不解的是为什么要这么做,直接在就绪表里面把这个任务删除不久完了么,为什么要多一个这个判断呢,如果不判断会有什么问题呢?

出0入0汤圆

发表于 2012-5-14 20:03:59 | 显示全部楼层
唉,我也遇到同样的问题。没解决,同问。

出0入0汤圆

发表于 2012-5-14 21:50:34 | 显示全部楼层
一个个是直接写代码不看文档提示呀

《RT-Thread编程指南》的6.7.9节:
注:如果挂起当前任务,需要在调用这个函数后,紧接着调用rt_schedule函数进行 *手动的线程上下文切换* 。

出0入0汤圆

 楼主| 发表于 2012-5-15 09:41:43 | 显示全部楼层
可是我并不是挂起当前任务,我是在当前任务中挂起另一个任务,现在发现要加一个while来判断是否挂起成功,想知道的是,如果去掉 if (thread->stat != RT_THREAD_READY)  这一段会有什么影响?

出0入0汤圆

发表于 2012-5-15 10:36:56 | 显示全部楼层
dso_2012 发表于 2012-5-15 09:41
可是我并不是挂起当前任务,我是在当前任务中挂起另一个任务,现在发现要加一个while来判断是否挂起成功, ...

一般你进入一个线程,另一个应该自动挂起了啊

出0入0汤圆

 楼主| 发表于 2012-5-15 16:48:05 | 显示全部楼层
对,但是我现在想实现的是:我想要挂起的任务在 当前任务运行的整个过程中,不能再运行,直到我手动唤醒它。但是目前看来无法将其真正挂起,我用UCOS 系统是可以的,UCOS 直接操作了任务就绪表,将这个任务删除了。

出0入0汤圆

发表于 2012-5-15 16:56:58 | 显示全部楼层
记得调用suspend之后线程会被挂起到下次任务调度的时刻

出0入0汤圆

 楼主| 发表于 2012-5-15 19:09:37 | 显示全部楼层
那这个挂起就不是真正的挂起了,RTT 不能实现任务真正的挂起吗,除非人为地去手动唤醒它,就像UCOS那样。

出0入0汤圆

发表于 2012-5-15 19:44:03 | 显示全部楼层
本帖最后由 tiancaigao7 于 2012-5-15 20:12 编辑
dso_2012 发表于 2012-5-15 19:09
那这个挂起就不是真正的挂起了,RTT 不能实现任务真正的挂起吗,除非人为地去手动唤醒它,就像UCOS那样。 ...


我又重新看了一下源代码,发现suspend方法确实是会将当前线程挂起,指导resume函数将线程重新加入到线程切换队列中。因此我感觉你之前的现象可能是判断有错误。

出0入0汤圆

发表于 2012-5-15 23:37:47 | 显示全部楼层
dso_2012 发表于 2012-5-15 09:41
可是我并不是挂起当前任务,我是在当前任务中挂起另一个任务,现在发现要加一个while来判断是否挂起成功, ...

请给出测试代码出来。

出0入0汤圆

发表于 2012-5-26 21:50:07 | 显示全部楼层
类似的现象我也遇到,比如我想实现某个线程运行时将另外某个线程强制挂起,直到我手动恢复再接着运行,开始我也想当然的用suspend方法实现,可是现实情况是suspend方法挂起的线程如果处于非READY状态,是没法挂起的,只好用信号量等间接的实现,比较麻烦,不知是不是我对suspend理解错误了?

出0入198汤圆

发表于 2013-1-24 12:01:47 | 显示全部楼层
本帖最后由 sunnydragon 于 2013-1-24 13:20 编辑

楼主的意思应该是在自己的线程中去挂起并且是一直挂起其他线程,直到手动允许其恢复。这点在ucos中很好解决,使用suspend及resume即可。。但是在rtt中就得使用信号量,因为线程中大部分进入到挂起状态都是在执行rt_thread_delay()的时候,等delay时间到了,线程一样会进入到就绪队列中去。而使用信号量可以使被控制的线程自己主动被挂起,直到获得信号量,被控线程状态才转换为就绪状态。。这样做就可以解决楼主的问题。。这也是rtt与ucos中的一些细小差别~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-25 21:24

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

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