您的位置 首页 解答

ucos-ii学习笔记——音讯邮箱的原理及运用

Createdon:2012-10-7Author:zhangbin学习笔记forucos-iiPCredesignedbyzhangbin2012-10-7versions:V-01AllRight

Createdon:2012-10-7

Author:zhangbin

学习笔记

forucos-iiPC

redesignedbyzhangbin

2012-10-7

versions:V-0.1

AllRightsReserved

#include“INCLUDES.h”

#defineTASK_STK_SIZE512

char*s;//MyTask发送音讯的指针

char*ss;//YouTask接受到的音讯的指针

INT8Uerr;

INT8Uy=0;

INT32UTimes=0;

OS_EVENT*Str_Box;//界说事情操控块指针界说音讯邮箱的指针

//比较和上例中界说信号量的差异OS_EVENT*Fun_Semp;//声明信号量是事情操控块ECB类型的

//其实没有什么差异,界说的类型都是OS_EVENT的指针,都是事情操控块的指针

OS_STKStartTaskStk[TASK_STK_SIZE];//界说使命仓库区

OS_STKMyTaskStk[TASK_STK_SIZE];

OS_STKYouTaskStk[TASK_STK_SIZE];

voidStartTask(void*data);

voidMyTask(void*data);

voidYouTask(void*data);

voidmain(void)

{

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS,OSCtxSw);

Str_Box=OSMboxCreate((void*)0);//创立音讯邮箱返回值是指向创立音讯邮箱的指针

//该函数的参数为void*msg是音讯指针,在这里(void*)0表明初始值为NULL这样也就表明

//新创立的这个音讯邮箱里没有内容

OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE1],0);//创立开端函数

OSStart();

}

voidStartTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

INT16Skey;

pdata=pdata;

OS_ENTER_CRITICAL();

PC_VectSet(0x08,OSTickISR);

PC_SetTickRate(OS_TICKS_PER_SEC);

OS_EXIT_CRITICAL();

OSStatInit();

OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE1],1);//创立使命函数

OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE1],2);//创立使命函数

for(;;)

{

//假如恩下ESC键,则退出UC/OS-II

if(PC_GetKey(&key)==TRUE)

{

if(key==0x1B)

{

PC_DOSReturn();

}

}

OSTimeDlyHMSM(0,0,3,0);

}

}

voidMyTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

sprintf(s,”%d”,Times);//把Times赋给s

OSMboxPost(Str_Box,s);//发送音讯s其间两个参数Str_Box是OS_EVENT*pevent表明消

//息邮箱指针(是事情操控块指针),s是void*msg表明音讯指针

//该函数表明把音讯s发送到音讯邮箱Str_Box中

Times++;//MyTask的运转次数加1

OSTimeDlyHMSM(0,0,1,0);

}

}

voidYouTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3//AllocatestorageforCPUstatusregister

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

ss=OSMboxPend(Str_Box,10,&err);//恳求音讯邮箱参数表明:Str_Box是音讯邮箱指针,10表明等候时刻,

//err表明错误信息,返回值ss是邮箱中的音讯指针

PC_DispStr(10,++y,ss,DISP_BGND_BLACK+DISP_FGND_WHITE);//显现音讯的内容,便是使命MyTask的运转次数

OSTimeDlyHMSM(0,0,1,0);//等候1s

}

}

//本程序完成的功用便是MyTask把自己的运转次数作为音讯发送到音讯邮箱中,使命YouTask恳求音讯邮箱,得到音讯并显现出来

//因为MyTask和YouTask的等候时刻持平,都是1s,所以Mytask和YouTask替换运转,运转次数相同,所以显现出的数字是从

//0开端,123

//我试过了,(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对应的等候时刻,显现的时刻距离就由等候时刻来确认了,不知道为什么会这样??

//这个要搞清楚

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/256254.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部