您的位置 首页 电子

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

#defineN_MESSAGES128

OS_STKStartTaskStk[TASK_STK_SIZE];

OS_STKMyTaskStk[TASK_STK_SIZE];

OS_STKYouTaskStk[TASK_STK_SIZE];

char*s_flag;//该字符串指示哪个使命在运转

//char*s_1;

char*ss;//寄存接纳到的音讯指针

char*s100;//寄存发送音讯的指针

char*s;

char*s500;

void*MsgGrp[N_MESSAGES];//界说音讯指针数组

//创立音讯行列,首要需求界说一个指针数组(用于寄存音讯邮箱),然后把各个音讯数据缓冲区的首地址存入这个数组中

//最终再调用函数OSQCreate()来创立音讯行列

INT8Uerr;

INT8Uy=0;

OS_EVENT*Str_Q;//界说事情操控块指针行列的事情操控块指针用于寄存创立的音讯行列的指针

voidMyTask(void*data);

voidStartTask(void*data);

voidYouTask(void*data);

voidmain(void)

{

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS,OSCtxSw);

Str_Q=OSQCreate(&MsgGrp[0],N_MESSAGES);//创立音讯行列

//函数的第一个参数&MsgGrp[0]是void**start,是寄存音讯缓冲区指针数组的地址,它是指向指针数组的指针

//能够用指针数组的首个元素的地址表明

//N_MESSAGES是该数组的巨细

//返回值是音讯行列的指针Str_Q是OS_EVENT型的指针,是事情操控块型的指针

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],3);

OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE1],4);

//s=”Howmanystringscouldbegeted?”;

//OSQPostFront(Str_Q,s);//发送音讯以LIFO后进先出的办法发送

//第一个参数Str_Q是音讯行列的指针,是OSQCreate的返回值,第二个参数s是音讯指针

for(;;)

{

s_flag=”TheStartTaskisrunning!”;

PC_DispStr(50,++y,s_flag,DISP_FGND_RED+DISP_BGND_LIGHT_GRAY);//提示哪个使命在运转

if(OSTimeGet()>100&&OSTimeGet()<500)

{

s100=”ThevalueofOSTIMEisfrom100to500NOW!!”;

OSQPostFront(Str_Q,s100);//发送音讯以LIFO后进先出的办法发送

//发送音讯以LIFO后进先出的办法发送

//第一个参数Str_Q是音讯行列的指针,是OSQCreate的返回值,第二个参数s是音讯指针

s=”Thestringbelongstowhichtask.”;

OSQPostFront(Str_Q,s);//发送音讯以LIFO办法发送所以假如要恳求音讯时,会先得到s,然后才是s100

}

if(OSTimeGet()>1000&&OSTimeGet()<1500)

{

s500=”ThevalueofOSTIMEisfrom1000to1500NOW!!”;

OSQPostFront(Str_Q,s500);//发送音讯

}

if(PC_GetKey(&key)==TRUE)

{

if(key==0x1B)

{

PC_DOSReturn();

}

}

OSTimeDlyHMSM(0,0,1,0);

}

}

voidMyTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

s_flag=”TheMyTaskisrunning!”;

PC_DispStr(50,++y,s_flag,DISP_FGND_RED+DISP_BGND_LIGHT_GRAY);//提示哪个使命在运转

ss=OSQPend(Str_Q,0,&err);//恳求音讯行列,参数分别是:Str_Q为所恳求音讯行列的指针第二个参数为等候时间

//0表明无限等候,&err为错误信息,返回值为行列操控块OS_Q成员OSQOut指向的音讯(假如行列中有音讯可用的话),假如

//没有音讯可用,在使调用OSQPend的使命挂起,使之处于等候状况,并引发一次使命调度

//由于前面发送音讯时运用的是LIFO的办法,所以此处第一次得到的音讯是上面最终发送的音讯

PC_DispStr(3,y,ss,DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);//显现得到的音讯

//s_1=”M”;

PC_DispStr(0,y,”My”,DISP_FGND_RED+DISP_BGND_LIGHT_GRAY);//显现是哪一个使命显现的

OSTimeDlyHMSM(0,0,1,0);

}

}

voidYouTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

s_flag=”TheYouTaskisrunning!”;

PC_DispStr(50,++y,s_flag,DISP_FGND_RED+DISP_BGND_LIGHT_GRAY);//提示哪个使命在运转

ss=OSQPend(Str_Q,0,&err);//恳求音讯行列

PC_DispStr(3,y,ss,DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);//显现得到的音讯

//s_1=”Y”;

PC_DispStr(0,y,”You”,DISP_FGND_RED+DISP_BGND_LIGHT_GRAY);//显现是哪一个使命显现的

OSTimeDlyHMSM(0,0,1,0);

}

}

//运转的现象阐明上面剖析是正确的,由于当时钟节拍数大于100,小于500时,会发送第一个if语句中的两个字符串s100和s

//下面运转的使命接纳到而且显现。当时钟节拍数大于1000小于1500时,发送第二个if语句中的字符串,下面运转的使命

//接纳并显现。当时钟节拍数大于1500时,就不再发送音讯了,下面的使命得不到音讯就无限等候下去,所以就不再显现了

//从运转的现象不难能够看出,有时MyTask或YouTask运转了,可是没有得到音讯而处于等候状况

//运用上面的办法能够很清楚地看出使命调度和运转的关系了MyTask和YouTask是替换运转的,由于延迟时间持平

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部