打印

严重!!! UCOS-II高级BUG..请帮忙~

[复制链接]
12627|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Swd21ic|  楼主 | 2009-7-23 22:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
背景: 平台STM32 + uCOS2.86 (移植为官方的最新版本) 

程序在某个中断调用OSQPost发送一消息队列  

任务A Pend该消息队列作为触发的条件. 并使用pend得到的指针进行数据解析. 
void TaskA (void *p_arg); 

   void *p_data; 

   while (OS_TRUE) 
   { 
       p_data = (void *)OSQPend(g_DataQ, 0, &err); 
       ProcessData(p_data); 
   } 

调试时发现在某种情况下. OSPendQ返回的指针是 (void *)0; 并且返回err == OS_ERR_NONE; 表明此时是从消息指针数组中读到了空指针. 
但此时消息指针数组中确确实实没有空指针的元素.  

更奇怪的是.  
运行到这种情况下时(任务A Pend返回空指针). 
当前任务块指针 OSTCBCur 确实是指向的任务A的任务控制块,但!! 但OSPrioCur/OSPrioHigh却等于任务B的优先级(比任务A高).!!!! 

如果我没有理解错的话, 这种情况是绝对不可能发生的...随便运行到哪个任务. OSPrioCur应当就是当前任务的优先级.~ (任务B与任务A没有任何直接的关联) 

此BUG找了好几天了.今天才发现这个问题,感觉可能跟ucos任务切换有很大的关系. 明明有高优先级的任务正处于就绪态. 却切换到低优先级的任务A来了. 
估计之前跟直接PendQ得到空指针有很大的关联..   请大家帮忙看看有哪些可能. 

相关帖子

沙发
Swd21ic|  楼主 | 2009-7-24 22:50 | 只看该作者

re

BUG已解决. 是UCOS本身的问题

使用特权

评论回复
板凳
lonely8122| | 2009-7-25 08:42 | 只看该作者

说说看

我也用了一段时间了,没发现楼主说的问题啊

使用特权

评论回复
地板
Swd21ic|  楼主 | 2009-7-25 18:49 | 只看该作者

ls

请见 2.88 的release note.官方已修正

使用特权

评论回复
5
lonely8122| | 2009-7-25 22:27 | 只看该作者

2.88版

我在www.micrium.com上只能找到v2.86,不知道v2.88在哪里下载?

使用特权

评论回复
6
bqt| | 2009-7-26 13:29 | 只看该作者

这个问题我也遇到过


我遇到的情况也是一样的。

通过仿真器可以看出,空闲任务竟然获得了最高优先级0,导致其它所有任务都切换不进去。当时我就觉得是ucosII在STM32上移植代码的问题,但是一直没有找出来,平台也是STM32 + uCOS2.86 (移植为官方的最新版本) 。具体解决问题的方法还请楼主明示,谢谢!

使用特权

评论回复
7
bqt| | 2009-7-26 13:39 | 只看该作者

最后导致不得不放弃在STM32上使用UCOS

问题出现时,OSPrioCur的确不是当前任务的优先级,我也想了很久一直没解决,官方的移植程序仔细看也没看出问题。但是问题就出在移植程序上,不知道楼主如何解决的?

使用特权

评论回复
8
bqt| | 2009-7-26 13:58 | 只看该作者

2.88版本没见到啊,官方网站没有

使用特权

评论回复
9
bqt| | 2009-7-27 10:59 | 只看该作者

找到了,不过官方网站上是没有的,呵呵

使用特权

评论回复
10
bqt| | 2009-7-27 11:02 | 只看该作者

原文是这样的

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. 

使用特权

评论回复
11
lonely8122| | 2009-7-27 15:26 | 只看该作者

没发现这个改动的作用

  看了一会任务调度那部分的源代码,没发现这个改动会有什么作用啊,我也是使用2.86版,但没发现过优先级被打乱的情况, 不知道这种情况是这么出现的?也许我的应用也有潜在的危险,希望遇到过这个问题的朋友指点下。

使用特权

评论回复
12
bqt| | 2009-7-27 23:05 | 只看该作者

任务切换频繁以及长时间运行程序时此问题可能出现

使用特权

评论回复
13
lonely8122| | 2009-7-28 08:28 | 只看该作者

能够具体解释一下出现此问题的原因?谢谢

使用特权

评论回复
14
bqt| | 2009-7-29 12:39 | 只看该作者

应该只是针对Cortex-M3的移植才会出现此问题

在其它体系结构上,如ARM7、ARM9上运行ucos2.86我还没发现此问题,我觉得应该和移植代码有关系,但是官方修改的是内核代码,而不是移植代码。此问题的原因比较细微,和Cortex-M3的中断机制有关。

使用特权

评论回复
15
bqt| | 2009-7-29 12:47 | 只看该作者

或许换一种移植方式,此问题就不会出现

目前用到的大部分都是官方的移植,此移植程序非常简练,效率很高,充分利用到了Cortex-M3针对操作系统提供的硬件便利,但是不知道有没有经过全面的验证。或许换一种更保守的移植方式也可以解决问题,就是类似ARM7的移植方式。

使用特权

评论回复
16
lonely8122| | 2009-7-29 13:36 | 只看该作者

我用的就是cortex-m3

没有出现这个问题不说,而且也看不出来把OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; 放到if(OSPrioHighRdy != OSPrioCur){}前面的作用。

使用特权

评论回复
17
bqt| | 2009-7-29 21:09 | 只看该作者

我先前用也没出现问题,后来连续几个项目中遇到

一定要用仿真器才能看得出来,没遇到也正常,因为在一定条件下才能出现

使用特权

评论回复
18
foxqiu| | 2009-8-6 21:59 | 只看该作者
好问题。。。。。我没有遇到

使用特权

评论回复
19
headwolf_83| | 2009-8-8 22:40 | 只看该作者
是不是真的只有CM3会出问题。今天照着范例写了两个任务,每个任务闪一个LED灯,结果,每个任务的第一行代码,LED送1的代码都被执行了,而后续的清0代码确怎么都执行不了。真不知道是SIM的问题还是其它问题。
PIC32+UC/OS V2.86。
2个任务从不删除自己,一直跑,结果发现程序老是跑到空闲任务中,对一个新手,这样的事情太郁闷了。

使用特权

评论回复
20
headwolf_83| | 2009-8-8 22:40 | 只看该作者

问题解决了。

本帖最后由 headwolf_83 于 2009-8-9 10:02 编辑

改代码的时候,时钟初使化设置被我注释没了,所以总是不正常。老跑进空闲任务。现在搞定了。只是希望别出现LZ提到的BUG。现在可指望这个版本的官方移植来学习呢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

781

帖子

1

粉丝