搜索
bottom↓
回复: 0

急救!!!任哲ucos-II书中关于消息邮箱的疑问

[复制链接]

出0入0汤圆

发表于 2011-6-14 17:40:52 | 显示全部楼层 |阅读模式
直接开门见山吧,我的问题是这样的:ucos 中已经建立了一个消息邮箱。如果在一个任务中我OSMboxPost发送一个消息过去,在另一个任务中我OSMboxPend把信息取出来。这时候消息邮箱中还有这个消息吗?是不是这时候mes = NULL 啊。此时如果我再用一个任务取邮箱中的内容,该任务是不是要陷入等待?
    为了验证以上问题,我对任哲书中给的代码进行了修改
  /************************Test*************************************/
#include "includes.h"
#define  TASK_STK_SIZE   512                                //任务堆栈长度
OS_STK   StartTaskStk[TASK_STK_SIZE];                        //定义任务堆栈区
OS_STK   MyTaskStk[TASK_STK_SIZE];                        //定义任务堆栈区
OS_STK   YouTaskStk[TASK_STK_SIZE];                        //定义任务堆栈区
INT16S   key;                                                //用于退出的键
char*s;
char*ss;
INT8U err;                                                 
INT8U y=0;                                                //字符显示位置
INT32U Times=0;       
INT8U  FLAG = 0;                                                //我自己建立的一个标志量                                       
OS_EVENT *Str_Box;
void  StartTask(void *data);                                //声明起始任务
void  MyTask(void *data);                                //声明任务
void  YouTask(void *data);                                //声明任务
/************************主函数*********************************/
void  main (void)
{
    OSInit( );                                                //初始化uCOS_II
    PC_DOSSaveReturn( );                                //保存Dos环境
    PC_VectSet(uCOS, OSCtxSw);                                //安装uCOS_II中断
    Str_Box = OSMboxCreate ((void*)0);                        //创建互斥型信号量
    OSTaskCreate(StartTask,                                //创建任务StartTask
        (void*)0,                                        //给任务传递参数
        &StartTaskStk[TASK_STK_SIZE - 1],                //设置任务堆栈栈顶
        0);                                                //使任务的优先级别为0
    OSStart( );                                                //启动多任务管理
}
/***********************任务StartTask*******************************/
void  StartTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
    pdata = pdata;
    OS_ENTER_CRITICAL( );
    PC_VectSet(0x08, OSTickISR);                //安装时钟中断向量
    PC_SetTickRate(OS_TICKS_PER_SEC);                //设置uCOS_II时钟频率
    OS_EXIT_CRITICAL( );

    OSStatInit( );                                //初始化统计任务
    OSTaskCreate(MyTask,                        //创建任务MyTask
                (void*)0,                        //给任务传递参数
                &MyTaskStk[TASK_STK_SIZE - 1],        //设置任务堆栈栈顶
                3);                                //使任务的优先级别为3
    OSTaskCreate(YouTask,                        //创建任务YouTask
                (void*)0,                        //给任务传递参数
                &YouTaskStk[TASK_STK_SIZE - 1],        //设置任务堆栈栈顶
                4);                                //使任务的优先级别为4

    for (;;)
    {
        //如果按下Esc键则退出uCOS_II
        if (PC_GetKey(&key) == TRUE)
        {
            if (key == 0x1B)
            {
                PC_DOSReturn();
            }
        }
        OSTimeDlyHMSM(0, 0, 3, 0);        //等待3秒
    }
}
/************************任务MyTask*******************************/
void  MyTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
    pdata = pdata;
  
    for (;;)
    {
          if( FLAG <= 5 )
         {
        sprintf(s,"%d" ,Times);
        OSMboxPost(Str_Box,s);                //发送消息
         }
         FLAG ++;

        /*PC_DispStr(10,++y,
                Str_Box->OSEventPtr,//s,
                DISP_BGND_BLACK+DISP_FGND_WHITE );*/
        Times++;      
        OSTimeDlyHMSM(0, 0, 1, 0);        //等待1秒
    }
}
/************************任务YouTask******************************/
void  YouTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR  cpu_sr;
#endif
    pdata = pdata;     
     
    for (;;)
    {
        ss=OSMboxPend(Str_Box,0,&err);                                          
        PC_DispStr(10,++y,
                ss,
                DISP_BGND_BLACK+DISP_FGND_WHITE );                                 
        OSTimeDlyHMSM(0, 0, 1, 0);                //等待1秒
    }
}

/************************End**************************************/

注意,我在MyTask的任务中加上了一个if(FLAG <= 5)的判断,并且在YourTask 中把ss=OSMboxPend(Str_Box,10,&err);改为ss=OSMboxPend(Str_Box,0,&err);
按理说这个代码应该先打印0,1,2,3,4,5.在陷入等待。但问题是为什么这个代码改完以后就不会跑了呢????
并且如果我仅仅是把任哲给出的源代码中YourTask中的ss=OSMboxPend(Str_Box,10,&err);改为ss=OSMboxPend(Str_Box,0,&err);
程序也不会跑了,呵呵,OSMboxPend这个函数到底怎么了?

我的ucos博客http://zhangzhenyuan163.blog.163.com/

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-4 21:40

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

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