lizexi486 发表于 2010-11-26 23:28:09

邮箱这样用不知问题出在哪?

一个很简单的程序,两个任务,Task0实现流水灯左向右摆动,Task1实现流水灯右向左摆动。任务Task0实现完后向Task1发送消息1,通知其可以运行;任务Task1运行完后向Task0发送消息2,通知其可以运行;如此反复,实现流水灯左右摆动。程序运行后,没啥反映,请各位帮忙分析。

int Main(int argc, char **argv)
{
        //初始化目标板
        TargetInit();

        //初始化uCOS-II
        OSInit ();       

        //初始化系统时基
        OSTimeSet(0);
         SemBox=OSMboxCreate(2);
        //创建系统初始任务
        OSTaskCreate (MainTask,(void *)0, &MainTaskStk, MainTaskPrio);

        //开始任务
        OSStart ();
        return 0;
}
//-----------------------------------------------------------------------------------------------------------------------------------
void MainTask(void *pdata) //Main Task create taks0 and task1
{
        #if OS_CRITICAL_METHOD == 3                /* Allocate storage for CPU status register */
                OS_CPU_SRcpu_sr;
        #endif
        OS_ENTER_CRITICAL();

        Timer0Init();                                //initial timer0 for ucos time tick
        ISRInit();                                  //initial interrupt prio or enable or disable

        OS_EXIT_CRITICAL();

        OSPrintfInit();                                //use task to print massage to Uart
        OSStatInit();
        OSTaskCreate (Task0,(void *)0, &Task0Stk, Task0Prio);       
        OSTaskCreate (Task1,(void *)0, &Task1Stk, Task1Prio);               
        while(1)
        {
                OSMboxPost(SemBox,(void *)2); //发送消息2开始运行Task0
                OSTaskSuspend(MainTaskPrio);//当前任务挂起
                OSTimeDly(1000);
        }
}
//----------------------------------------------------------------------------------------------------------------------------------
void Task0(void *pdata)                               //任务0
{
        for(;;)
        {
             pmsg=OSMboxPend(SemBox,1,&err);
             if(*pmsg==2)          //如果接收到邮箱消息2可以运行
             LED_Horse(0,10);
             OSMboxPost(SemBox,(void *)1);
          }
}
//----------------------------------------------------------------------------------------------------------------------------------
void Task1(void *pdata)                                //任务1
{
for(;;)
    {
       pmsg=OSMboxPend(SemBox,1,&err);
       if(*pmsg==1)//如果接收到邮箱消息1可以运行
       LED_Horse(1,10);
       OSMboxPost(SemBox,(void *)2);
    }
}
这个程序也可以用信号量实现,但为了学习邮箱的用法,所以就用邮箱实现。另外,后面还可加更多的任务从而实现更多的流水灯效果。
是不是我对邮箱的理解有误呢?

my_avr 发表于 2010-11-27 00:11:48

if(*pmsg==2)          //如果接收到邮箱消息2可以运行
if(*pmsg==1)//如果接收到邮箱消息1可以运行


应该是:


if(pmsg==2)          //如果接收到邮箱消息2可以运行
if(pmsg==1)//如果接收到邮箱消息1可以运行

lizexi486 发表于 2010-11-27 10:57:27

谢楼上的提醒,把指针搞错了,改成如下还是得不到效果啊?
if(pmsg==(void *)2)
if(pmsg==(void *)1)

my_avr 发表于 2010-11-27 11:30:33

pmsg=OSMboxPend(SemBox,1,&err);


邮箱等待的时间太短了,才1个Tick。你执行函数LED_Horse(1,10)的时间应该不止那么短吧

lizexi486 发表于 2010-11-27 11:40:52

执行函数LED_Horse(1,10)的时间确实不止1个Tick,邮箱的等待时间改成100个Tick后,Task0任务执行了一次后就没反映了。

chenfu 发表于 2010-11-29 17:27:26

1.你可能将TASK0的优先级设为最高了。
2.同时LED_Horse(0,10) 这个函数内部不知道你有没有将本任务挂起,如果没有的话,TASK1自始至终都没机会运行。这样的话TASK0一直在运行。

embeddev 发表于 2010-11-29 17:36:23

帮顶!

lizexi486 发表于 2010-11-29 21:34:11

回复【5楼】chenfu
1.你可能将task0的优先级设为最高了。
2.同时led_horse(0,10) 这个函数内部不知道你有没有将本任务挂起,如果没有的话,task1自始至终都没机会运行。这样的话task0一直在运行。

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

确实将Task0设置成最高优先级的任务了。是我原来的理解有误。


我原以为在MainTask中发消息2,然后挂起,在Task0中收到MainTask发到邮箱中的消息2即可运行,接着Task0发消息1到邮箱,Task1收到消息1后可运行,接着Task1向邮箱发消息2。如此反复,Task0,Task1相互向邮箱中发消息,两个任务就可交替运行。没有考虑到任务的优先级。

embeddev 发表于 2010-11-30 11:41:54

楼主贴下修改后可以运行的程序吧!
页: [1]
查看完整版本: 邮箱这样用不知问题出在哪?