4383|8

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

有关UCOS2的一个怪问题 [复制链接]

 
下面是个很简单的例程:问题是 Task1中的i 不为10时,Task2 能运行吗?
static void Task2(void * pdata)
{
    uint8 err;

        pdata = pdata;
while (1)
   {   
                OSSemPend(DataSemPtr2, 0, &err);
                 UART0_SendStr(Tx_buf1);
                 OSTimeDlyHMSM(0, 0, 0, 100);   
   }   
}
static void Task1(void * pdata)
{       uint8 i=0;
        DataSemPtr2 = OSSemCreate(0);

    OSTaskCreate(Task2,  (void *)0, &Task2Stk[100],  5);   
        while (1)

        {    if(i==10)
             OSSemPost(DataSemPtr2);
             OSTimeDlyHMSM(0, 0, 0, 3);  
        }
}
     int main (void)
{
        OSInit();
        TargetInit();
        OSTaskCreate(Task1,   (void *)0, &Task1Stk[100],   3);
        OSStart();
        return 0;
}
我用v2.7*的UCOS2,结果是Task1中的i 不为10时,Task2 不能运行。 但用v2.51的UCOS2,Task2 能运行。

太怪啦。进 OSSemPend 这个函数里面,发现这两个版本中有个很明显的差别。v2.7 中297行 多了这句     OSTCBCur->OSTCBPendTO  = FALSE;  
但其中的代码看不太明白。  

望高手解释。

最新回复

那再换个版本呢?或许这是版本升级,思想升级造成的差异。还有你希望在哪个版本下运行?如果实在对版本不放心,可以直接mail到uCOS网站去,他们肯定更了解其中的差异  详情 回复 发表于 2008-5-25 13:30
点赞 关注
 

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
lz贴错地方了。

 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
估计lz也不知道该往哪里发了。eeworld更适合讨论微软产品及Windows平台下相关的开发。其他的,这里都不擅长,或者说其他领域的高手都不屑到这里来的。

Task1中,i不会=10,那么while(1)就会一直死循环,系统被完全堵塞。
ucOSII要求在while(1)中,调用OSTimeDlyHMSM(0, 0, 0, 3);此函数会将当前线程Task1提交到任务管理列表,并将当前线程Task1挂起等待下一次唤醒。
你现在无法调用到OSTimeDlyHMSM(0, 0, 0, 3);那么这个线程将一直循环并占用CPU,任务管理器无法将其挂起,其他线程也就无法执行了。

至于版本不同结果不同,就不知道了。现在一般都用2.83,而最新的是2.86,你换一下版本试试。
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

4
 
你现在无法调用到OSTimeDlyHMSM(0, 0, 0, 3);
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
to shuiyan :

看清楚了是   if(i==10)
               OSSemPost(DataSemPtr2);
             OSTimeDlyHMSM(0, 0, 0, 3);   

而不是        if(i==10)
              {
             OSSemPost(DataSemPtr2);
             OSTimeDlyHMSM(0, 0, 0, 3);  
             }

 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
之前的版本没有用过,相应的函数功能不明确。

调用OSSemPend等待某信号量的程序,会在等待超时后,返回错误,此程序会继续执行。

OSTCBCur->OSTCBPendTO  = FALSE; // 当前线程的OSTCBPendTO设为FALSE

至于此函数返回值造成的影响,就得看新旧版本的限制了。

研究中……
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

7
 
应该会运行的
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
TO  楼上的大侠

为什么会运行 ? 信号量的初始值是0,没有发送信号量 ,怎么能请求到呢 ?没道理啊 。

还有,这个版本上的差异怎么解释? 2个版本确实得到了完全不一样的结果——一个可以运行,另一个却不行。
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

9
 
那再换个版本呢?或许这是版本升级,思想升级造成的差异。还有你希望在哪个版本下运行?如果实在对版本不放心,可以直接mail到uCOS网站去,他们肯定更了解其中的差异
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表