|
直接开门见山吧,我的问题是这样的: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周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|