打印
[ZLG-ARM]

请大家帮我看看这ucosii+lpc213x 第二个任务怎么不执行阿

[复制链接]
2098|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wlrt|  楼主 | 2007-12-4 13:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  我是 用周工lpc213x模板,

#include "config.h"
#include "stdlib.h"

#define    TaskStkLengh    128            //Define the Task0 stack length 定义用户任务0的堆栈长度
 
OS_STK    TaskStk [TaskStkLengh];        //Define the Task0 stack 定义用户任务0的堆栈
OS_STK  Taskdisp_1 [TaskStkLengh];
OS_STK  Taskdisp_2 [TaskStkLengh];

void     Task0(void *pdata);        //声明Task0 任务0
void    Task1(void *pdata);         //声明Task0 任务1
void    Task2(void *pdata);
OS_EVENT *DispSem;
OS_EVENT *MsgBox;

        int main (void)
{
    OSInit ();    
    DispSem=OSSemCreate(2);    

    OSTaskCreate(Task0,(void *)0,&TaskStk[TaskStkLengh - 1], 2);    OSStart ();
    return 0;                                                            
}

        void Task0    (void *pdata)
{   
    pdata = pdata;
    TargetInit ();
    
 OSTaskCreate(Task1,(void *)0,&Taskdisp_1[TaskStkLengh-1],3);
 OSTaskCreate(Task2,(void *)0,&Taskdisp_2[TaskStkLengh-1],4);
  
  
    while (1)
    { 
    
      OSTimeDly(10);
    
    }
}
   

void Task1 (void *pdata)

  
  uint8 err;
  //volatile uint32 data=1000000;
  pdata = pdata;
   while(1)
  {
   
   //OSSemPend(DispSem,0,&err);-------为什么 这句如果注释掉任务2无法执行?????
  
   disp_1();
  
    
   OSTimeDly(10);
   }
}

 
void Task2 (void *pdata)
{ uint8 err;
  
  pdata=pdata;
  
   while(1)
  {
   OSSemPend(DispSem,0,&err);
 
   disp_2();
   OSTimeDly(1);
   }

}

好奇怪啊,本来的建立2个信号量,2个任务各获得一个(即文中注释的语句保留),两个任务正常切换,而若是把那句注释掉(即只让任务2等待信号量,任务1无条件执行)怎么任务2总是得不到信号量无法执行呢??
  请大家帮忙指点一二。。。。

   

相关帖子

沙发
zlgarm| | 2007-12-4 17:53 | 只看该作者

re

您的任务1申请了信号量如下
OSSemPend(DispSem,0,&err)
比知道您在这个任务里是否在别的地方释放了信号量!

信号量需要成对使用,请求完了之后,当资源使用结束后,需要释放信号量!

使用特权

评论回复
板凳
wlrt|  楼主 | 2007-12-5 15:57 | 只看该作者

这和任务的优先级有没有关系呢?

这和任务的优先级有没有关系呢?

程序并没有在其他地方释放信号量,仅仅在DispSem=OSSemCreate(2),中初始化信号计数器; 另外 我试过,若是在优先级低的任务调用err=OSSemPost(DispSem), 在优先级高的任务里调用
OSSemPend(DispSem,0,&err)是可以运行的 。但是反过来就不行了,消息邮箱也出现同种情况,我想请问一下,到底是不是这样呢?

使用特权

评论回复
地板
lyl831015| | 2007-12-5 18:51 | 只看该作者

信号量的问题

和优先级没有关系。
当有一个任务申请到信号量后,信号量计数器值减1。你别的地方没有发送信号量,当任务使用2次信号量后(即信号量计数器值为0)任务便一直等待信号量了。

使用特权

评论回复
5
liujigan| | 2007-12-5 19:53 | 只看该作者

看了看

 如果创建时把 DispSem=OSSemCreate(1);
任务1中去掉那句......
任务2可以运运行吗?


如果可以,以后要吃多少,做多少,可别剩下了。

使用特权

评论回复
6
wlrt|  楼主 | 2007-12-6 09:17 | 只看该作者

还是不行啊

我试过了,改成DispSem=OSSemCreate(1); 任务2还是无法执行,
我的理解也认为和优先级没有关系,可是程序并没有在任何地方请求信号量,只有在任务2 中请求,为什么老是进不去呢?我碰到的问题总是那么怪呢?
另外还有个怪现象:把任务2中的OSSemPend(DispSem,0,&err);去掉,让任务2无条件执行,把任务1的OSSemPend(DispSem,0,&err); 加上,创建函数还是没变DispSem=OSSemCreate(2); 我认为执行的顺序是:TASK1---TASK2---TASK1--TASK2--(此时信号量用完TASK1无法再执行了)--TASK2--TASK2--TASK2--
可是结果却是:连续执行2次TASK1,然后再一直执行TASK2 。
我又试了在TASK1中最后释放信号量err=OSSemPost(DispSem);结果是一直执行TASK1,TASK2又无法执行了 。。。。
真搞不到懂是怎么回事。。。。。

使用特权

评论回复
7
wlrt|  楼主 | 2007-12-6 17:06 | 只看该作者

郁闷啊。。。。

郁闷啊。。。。
请大家帮忙啊。。。

使用特权

评论回复
8
jd9945| | 2007-12-13 14:28 | 只看该作者

会不会是任务一直在task0 与task1运行,如果任务1

disp_1();时间长于OSTimeDly(10);

使用特权

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

本版积分规则

8

主题

20

帖子

1

粉丝