ucos-ii学习笔记——消息邮箱的原理及使用
学习笔记
for
redesigned
2012-10-7
versions:V-0.1
All
#include
#define
char
char
INT8U
INT8U
INT32U
OS_EVENT
//比较和上例中定义信号量的区别
//其实没有什么区别,定义的类型都是OS_EVENT的指针,都是事件控制块的指针
OS_STK
OS_STK
OS_STK
void
void
void
void
{
}
void
{
#if
#endif
OSTaskCreate(YouTask,(void
for
}
void
{
#if
#endif
}
void
{
#if
#endif
pdata=pdata;
for
{
ss=OSMboxPend(Str_Box,10,&err);
//err表示错误信息,返回值ss是邮箱中的消息指针
PC_DispStr(10,++y,ss,DISP_BGND_BLACK+DISP_FGND_WHITE);
}
//本程序实现的功能就是MyTask把自己的运行次数作为消息发送到消息邮箱中,任务YouTask请求消息邮箱,得到消息并显示出来
//因为MyTask和YouTask的等待时间相等,都是1s,所以Mytask和YouTask交替运行,运行次数相同,所以显示出的数字是从
//0开始,1
//我试过了,(1)当MyTask的延迟时间短时,即YouTask运行一次,MyTask运行多次,这样显示的数字就是MyTask的运行次数,会不连续
//这是正常的。
//但是,(2)当MyTask运行一次,YouTask运行多次时,这样会好几次显示同样的数字,这也就表示在YouTask调用
//ss=OSMboxPend(Str_Box,10,&err);函数后,取得了消息,并每有把消息邮箱中的消息给清除,而是消息一直在邮箱中存在,
//所以下次再取消息的时候,消息还没有来得及更新,还是原来的消息。
//不知道当调用ss=OSMboxPend(Str_Box,10,&err);取得消息后,邮箱中的消息是否应该清除,从上面的现象来看,好像是没有清除
//这要分析该函数的代码才能搞清楚
//清楚了,情况是这样的:函数ss=OSMboxPend(Str_Box,10,&err);得到了邮箱中的消息后,确实是将邮箱清除了,将NULL指针存入了
//邮箱中,当出现上面(2)情况时,邮箱为空,YouTask是处于等待状态,但是由于在调用OSMboxPend时指定等待时间为10,所以当
//等待时间到了,即使邮箱中还是无消息,YouTask也会进入就绪态的,然后继续往下运行,但是,由于ss没有再取得新的消息,还
//是原来的值,所以还会显示原来的值。这种情况可以用改变OSMboxPend的等待时间来验证。OSMboxPend的详细代码说明,参见P235
//但是不知道为什么当OSMboxPend的等待时间我设为0时,表示无限等待,知道邮箱中有消息,
//当等待时间设为很
cos-ii学习笔记消息邮 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)