学习笔记
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时,表示无限等待,知道邮箱中有消息,
//当等待时间设为很大,大于1s对应的等待时间,显示的时间间隔就由等待时间来确定了,不知道为什么会这样??
//这个要搞清楚
上一篇:ucos-ii学习笔记——消息队列的原理及使用
下一篇:ucos-ii学习笔记——信号量的原理及使用
推荐阅读最新更新时间:2024-03-16 14:29