搜索
bottom↓
回复: 55

ucos中的这个问题(BUG),大家如何看待!

[复制链接]

出0入0汤圆

发表于 2009-10-10 10:34:29 | 显示全部楼层 |阅读模式
1) OS_CORE.C:
OSIntExit() and OS_Sched() have changed slightly because of a boundary condition found with the Cortex-M3 port. Specifically, we needed to move the statement:
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
Before testing for the priority.

2.86中的代码是这样的:
void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
    OS_CPU_SR  cpu_sr = 0;
#endif



    OS_ENTER_CRITICAL();
    if (OSIntNesting == 0) {                           /* Schedule only if all ISRs done and ...       */
        if (OSLockNesting == 0) {                      /* ... scheduler is not locked                  */
            OS_SchedNew();
            if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy     */
                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
#if OS_TASK_PROFILE_EN > 0
                OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task      */
#endif
                OSCtxSwCtr++;                          /* Increment context switch counter             */
                OS_TASK_SW();                          /* Perform a context switch                     */
            }
        }
    }
    OS_EXIT_CRITICAL();
}

2.88中的是这样的:
void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3u                           /* Allocate storage for CPU status register     */
    OS_CPU_SR  cpu_sr = 0u;
#endif



    OS_ENTER_CRITICAL();
    if (OSIntNesting == 0u) {                          /* Schedule only if all ISRs done and ...       */
        if (OSLockNesting == 0u) {                     /* ... scheduler is not locked                  */
            OS_SchedNew();
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy     */
#if OS_TASK_PROFILE_EN > 0u
                OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task      */
#endif
                OSCtxSwCtr++;                          /* Increment context switch counter             */
                OS_TASK_SW();                          /* Perform a context switch                     */
            }
        }
    }
    OS_EXIT_CRITICAL();
}

对于这样的改变我实在看不出有什么不同,还请高手指点!

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2009-10-26 19:38:10 | 显示全部楼层
V2.88的合理一些,因为始终应该保持OSTCBHighRdy与OSPrioHighRdy是对应的.而V2.86却有这个漏洞存在,虽然该错误导致的事故概率很小,但还是被Micrium改正了,说明他们的态度是很好的!Micrium的东西,值得信赖.

出0入0汤圆

发表于 2009-12-17 07:15:12 | 显示全部楼层
ucos之类OS最大的问题是:把mian()所在主任务忽略了。
    在这里,要把任务改称为线程会更为妥当些。
   
    如果不能利用main()主线程的所占的堆栈,会浪费一些RAM空间的。

出0入0汤圆

发表于 2009-12-17 10:17:10 | 显示全部楼层
难道我的ucos跑一段时间调度就停止了,跟这有关系?
要真是该多好呀

出0入0汤圆

发表于 2009-12-17 14:00:23 | 显示全部楼层
GZ

出0入0汤圆

发表于 2009-12-17 17:56:19 | 显示全部楼层
楼主太感谢你了,你在哪看到的这个改变呀?
困扰了我快一个月的问题呀。就这么轻松解决了
有空请你吃饭哈!

出0入0汤圆

 楼主| 发表于 2009-12-18 08:32:49 | 显示全部楼层
吃饭倒不必了,
在2.88的发布中看到的这个细微差别。

出0入0汤圆

 楼主| 发表于 2009-12-18 08:34:56 | 显示全部楼层
PZLPDY不知用的是哪个版的, 可以换个更高版本的试下。

出0入0汤圆

发表于 2009-12-18 09:26:01 | 显示全部楼层
我用的2.86版,跑了个LwIP。总是过一段时间操作系统就挂了,不是死机,是只剩一个任务在运行了.其它任务无法调度。
害得我调lwip调了近一个月了。现在修正过来,就好了

出0入0汤圆

发表于 2010-11-22 15:05:12 | 显示全部楼层
标记一下,ucos 2.86 任务调度 bug

出0入22汤圆

发表于 2010-12-10 09:27:22 | 显示全部楼层
mark!!最近也遇到这个现象,任务跑了一段时间就挂了,我也修改一下试试!

出0入0汤圆

发表于 2010-12-10 17:53:41 | 显示全部楼层
以前我用的版本也没有出现什么问题啊,
去看看版本先,但肯定是2.86以前的。

出0入0汤圆

发表于 2010-12-10 23:32:33 | 显示全部楼层
记个号先

出0入0汤圆

发表于 2010-12-11 18:38:52 | 显示全部楼层
mark

出0入22汤圆

发表于 2010-12-18 15:42:32 | 显示全部楼层
改了之后果然给力了,运行一晚上没事! 这个bug在把时钟节拍调高的时候很容易出现的

出0入0汤圆

发表于 2010-12-18 16:26:48 | 显示全部楼层
这么修改回复【1楼】9509238
v2.88的合理一些,因为始终应该保持ostcbhighrdy与ospriohighrdy是对应的.而v2.86却有这个漏洞存在,虽然该错误导致的事故概率很小,但还是被micrium改正了,说明他们的态度是很好的!micrium的东西,值得信赖.
-----------------------------------------------------------------------

是什么情况会出现这个BUG啊

出0入0汤圆

发表于 2010-12-22 14:03:40 | 显示全部楼层
我也得试试以下

出0入0汤圆

发表于 2010-12-31 23:09:55 | 显示全部楼层
的确会有这个问题啊,谢谢楼主指出来啊

出0入0汤圆

发表于 2011-1-5 21:16:29 | 显示全部楼层
mark.mark

出0入0汤圆

发表于 2011-1-5 21:32:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-30 17:24:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-1 23:23:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-3 20:57:38 | 显示全部楼层
mr

出0入0汤圆

发表于 2011-4-13 18:09:25 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-4-13 19:18:21 | 显示全部楼层
回复【2楼】wuzhujian 吴助建
    如果不能利用main()主线程的所占的堆栈,会浪费一些ram空间的。

-----------------------------------------------------------------------

其实可以不要空闲任务,直接把把main当做空闲任务,这样就可以充分利用main的占用的堆栈,
同时不必要在分配一个空闲任务堆栈。

出0入0汤圆

发表于 2011-4-13 19:27:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-15 20:53:57 | 显示全部楼层
回复【1楼】9509238
-----------------------------------------------------------------------
回复【1楼】9509238
v2.88的合理一些,因为始终应该保持ostcbhighrdy与ospriohighrdy是对应的.而v2.86却有这个漏洞存在,虽然该错误导致的事故概率很小,但还是被micrium改正了,说明他们的态度是很好的!micrium的东西,值得信赖.
-----------------------------------------------------------------------

这两天我是遇到了这个问题的。我用的Cortex-M3的核,版本是V252。
出现的现象是:系统运行一段时间后,只有task_idle()任务在跑,其它任务得不到执行。在仿真环境下看,OSPrioCur为0x00(最高优先级),而OSTCBCur->OSTCBPrio却为0x3F(task_idle任务)。
在调用OS_Sched()时,if (OSPrioHighRdy != OSPrioCur)始终为false。故切换不了。
最常出现在中断触发频率很高,在中断中调用了OSSemPost()或OSQPost()就容易出现。
按楼上说的改了,问题就解决了。但心里不安,请大虾们告诉我导致上述问题的起因是什么?
有知道请用邮件告诉我:hevake_lcj@126.com  QQ:527020730

出0入0汤圆

发表于 2011-6-16 16:00:24 | 显示全部楼层
标记一个UCOS2.86的任务调度BUG

出0入0汤圆

发表于 2011-6-16 16:29:42 | 显示全部楼层
正在用2.86目前还没出现这个问题,先标记下,出问题了才好找答案

出0入0汤圆

发表于 2011-6-16 16:40:42 | 显示全部楼层
ucos 2.86 bug.

出0入0汤圆

发表于 2011-6-16 16:48:56 | 显示全部楼层
ucos 2.86 任务调度 bug

出0入0汤圆

发表于 2011-7-17 12:42:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-17 15:46:25 | 显示全部楼层
以前一直使用 2.86 或者之前的版本 也没有出现问题啊

出0入0汤圆

发表于 2011-7-17 16:16:47 | 显示全部楼层
这个只是针对 cm3 的bug 吧 看
because of a boundary condition found with the Cortex-M3 port
因为cm3 的什么原因呢?

出0入0汤圆

发表于 2012-2-6 16:01:21 | 显示全部楼层
标记一下,ucos 2.86 任务调度 bug

出0入4汤圆

发表于 2012-2-6 18:01:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-7 23:12:11 | 显示全部楼层
正在研究ucOS3。3里面应该没有这样的问题了吧。

出0入0汤圆

发表于 2012-2-8 10:56:03 | 显示全部楼层
mark !!好东西

出0入0汤圆

发表于 2012-2-15 14:41:42 | 显示全部楼层
mark!目前还未发现。

出0入0汤圆

发表于 2013-4-19 15:10:31 | 显示全部楼层
我的UCOS2.52也有类似的问题,OSQPEND函数设置超时时间为0,居然还出现了超时OS_TIMEOUT错误,郁闷

出0入0汤圆

发表于 2013-5-4 18:51:51 | 显示全部楼层
wuzhujian 发表于 2009-12-17 07:15
ucos之类OS最大的问题是:把mian()所在主任务忽略了。
    在这里,要把任务改称为线程会更为妥当些。
     ...

小弟新手 如何把任务改成线程啊 你的意思是说main的堆栈浪费掉了吗 那改如何解决那

出0入0汤圆

发表于 2013-5-5 08:47:51 | 显示全部楼层
mark,ucos 2.86 任务调度 bug

出0入0汤圆

发表于 2013-8-21 07:42:46 | 显示全部楼层
mark,ucos 2.86 任务调度 bug

出0入8汤圆

发表于 2013-8-21 09:21:38 | 显示全部楼层
leecny2012 发表于 2013-4-19 15:10
我的UCOS2.52也有类似的问题,OSQPEND函数设置超时时间为0,居然还出现了超时OS_TIMEOUT错误,郁闷 ...

请问题2.52要修改吗?

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-10-21 12:48:06 | 显示全部楼层
mark                  

出0入0汤圆

发表于 2013-10-26 11:55:38 | 显示全部楼层
这种BUG要不是官方说,一般还是不容易想到的

出0入0汤圆

发表于 2013-10-26 13:09:56 | 显示全部楼层
高人能不能解释一下什么情况下,或者有什么原因才会出现这种情况啊?
一直想不到原因

出0入0汤圆

发表于 2013-10-26 13:45:08 | 显示全部楼层
标记UCOS V2.86 BUG

出0入0汤圆

发表于 2014-11-9 16:16:32 | 显示全部楼层
标记了!

出0入0汤圆

发表于 2014-11-9 17:00:30 | 显示全部楼层
由小见大

出0入0汤圆

发表于 2014-11-9 17:59:07 来自手机 | 显示全部楼层
标记一下 以后可能用的到

出0入0汤圆

发表于 2015-10-31 17:51:32 | 显示全部楼层
我分析了一下,应该算解释了bug产生的原因。
http://www.amobbs.com/thread-5635959-1-1.html

出100入101汤圆

发表于 2016-6-2 16:44:17 | 显示全部楼层
ucos 2.86 bug

出0入0汤圆

发表于 2018-1-31 17:28:28 | 显示全部楼层
MARK一下,好贴,避免掉坑。

出0入0汤圆

发表于 2019-7-12 19:42:39 | 显示全部楼层
MARK一下,还是不错的~~~~~~~

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-28 23:40

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

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