搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 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[MainTaskStkLengh - 1], 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_SR  cpu_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[Task0StkLengh - 1], Task0Prio);       
        OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkLengh - 1], 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);
    }
}
这个程序也可以用信号量实现,但为了学习邮箱的用法,所以就用邮箱实现。另外,后面还可加更多的任务从而实现更多的流水灯效果。
是不是我对邮箱的理解有误呢?

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入42汤圆

发表于 2010-11-27 00:11:48 | 显示全部楼层
if(*pmsg==2)          //如果接收到邮箱消息2可以运行
if(*pmsg==1)  //如果接收到邮箱消息1可以运行


应该是:


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

出0入0汤圆

 楼主| 发表于 2010-11-27 10:57:27 | 显示全部楼层
谢楼上的提醒,把指针搞错了,改成如下还是得不到效果啊?
if(pmsg==(void *)2)
if(pmsg==(void *)1)

出0入42汤圆

发表于 2010-11-27 11:30:33 | 显示全部楼层
pmsg=OSMboxPend(SemBox,1,&err);


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

出0入0汤圆

 楼主| 发表于 2010-11-27 11:40:52 | 显示全部楼层
执行函数LED_Horse(1,10)的时间确实不止1个Tick,邮箱的等待时间改成100个Tick后,Task0任务执行了一次后就没反映了。

出0入0汤圆

发表于 2010-11-29 17:27:26 | 显示全部楼层
1.你可能将TASK0的优先级设为最高了。
2.同时LED_Horse(0,10) 这个函数内部不知道你有没有将本任务挂起,如果没有的话,TASK1自始至终都没机会运行。这样的话TASK0一直在运行。

出0入0汤圆

发表于 2010-11-29 17:36:23 | 显示全部楼层
帮顶!

出0入0汤圆

 楼主| 发表于 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相互向邮箱中发消息,两个任务就可交替运行。没有考虑到任务的优先级。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-19 13:40

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

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