<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ucos-ii學(xué)習筆記——消息隊列的原理及使用

ucos-ii學(xué)習筆記——消息隊列的原理及使用

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏
Createdon:2012-10-7

Author:zhangbin

本文引用地址:http://dyxdggzs.com/article/201611/322851.htm

學(xué)習筆記

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;//該字符串指示哪個(gè)任務(wù)在運行

//char*s_1;

char*ss;//存放接收到的消息指針

char*s100;//存放發(fā)送消息的指針

char*s;

char*s500;

void*MsgGrp[N_MESSAGES];//定義消息指針數組

//創(chuàng )建消息隊列,首先需要定義一個(gè)指針數組(用于存放消息郵箱),然后把各個(gè)消息數據緩沖區的首地址存入這個(gè)數組中

//最后再調用函數OSQCreate()來(lái)創(chuàng )建消息隊列

INT8Uerr;

INT8Uy=0;

OS_EVENT*Str_Q;//定義事件控制塊指針隊列的事件控制塊指針用于存放創(chuàng )建的消息隊列的指針

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);//創(chuàng )建消息隊列

//函數的第一個(gè)參數&MsgGrp[0]是void**start,是存放消息緩沖區指針數組的地址,它是指向指針數組的指針

//可以用指針數組的首個(gè)元素的地址表示

//N_MESSAGES是該數組的大小

//返回值是消息隊列的指針Str_Q是OS_EVENT型的指針,是事件控制塊型的指針

OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE-1],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_SIZE-1],3);

OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE-1],4);

//s="Howmanystringscouldbegeted?";

//OSQPostFront(Str_Q,s);//發(fā)送消息以L(fǎng)IFO后進(jìn)先出的方式發(fā)送

//第一個(gè)參數Str_Q是消息隊列的指針,是OSQCreate的返回值,第二個(gè)參數s是消息指針

for(;;)

{

s_flag="TheStartTaskisrunning!";

PC_DispStr(50,++y,s_flag,DISP_FGND_RED+DISP_BGND_LIGHT_GRAY);//提示哪個(gè)任務(wù)在運行

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

{

s100="ThevalueofOSTIMEisfrom100to500NOW!!";

OSQPostFront(Str_Q,s100);//發(fā)送消息以L(fǎng)IFO后進(jìn)先出的方式發(fā)送

//發(fā)送消息以L(fǎng)IFO后進(jìn)先出的方式發(fā)送

//第一個(gè)參數Str_Q是消息隊列的指針,是OSQCreate的返回值,第二個(gè)參數s是消息指針

s="Thestringbelongstowhichtask.";

OSQPostFront(Str_Q,s);//發(fā)送消息以L(fǎng)IFO方式發(fā)送所以如果要申請消息時(shí),會(huì )先得到s,然后才是s100

}

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

{

s500="ThevalueofOSTIMEisfrom1000to1500NOW!!";

OSQPostFront(Str_Q,s500);//發(fā)送消息

}

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);//提示哪個(gè)任務(wù)在運行

ss=OSQPend(Str_Q,0,&err);//請求消息隊列,參數分別是:Str_Q為所請求消息隊列的指針第二個(gè)參數為等待時(shí)間

//0表示無(wú)限等待,&err為錯誤信息,返回值為隊列控制塊OS_Q成員OSQOut指向的消息(如果隊列中有消息可用的話(huà)),如果

//沒(méi)有消息可用,在使調用OSQPend的任務(wù)掛起,使之處于等待狀態(tài),并引發(fā)一次任務(wù)調度

//因為前面發(fā)送消息時(shí)使用的是LIFO的方式,所以此處第一次得到的消息是上面最后發(fā)送的消息

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);//顯示是哪一個(gè)任務(wù)顯示的

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);//提示哪個(gè)任務(wù)在運行

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);//顯示是哪一個(gè)任務(wù)顯示的

OSTimeDlyHMSM(0,0,1,0);

}

}

//運行的現象說(shuō)明上面分析是正確的,因為當時(shí)鐘節拍數大于100,小于500時(shí),會(huì )發(fā)送第一個(gè)if語(yǔ)句中的兩個(gè)字符串s100和s

//下面運行的任務(wù)接收到并且顯示。當時(shí)鐘節拍數大于1000小于1500時(shí),發(fā)送第二個(gè)if語(yǔ)句中的字符串,下面運行的任務(wù)

//接收并顯示。當時(shí)鐘節拍數大于1500時(shí),就不再發(fā)送消息了,下面的任務(wù)得不到消息就無(wú)限等待下去,所以就不再顯示了

//從運行的現象不難可以看出,有時(shí)MyTask或YouTask運行了,但是沒(méi)有得到消息而處于等待狀態(tài)

//使用上面的方法可以很清楚地看出任務(wù)調度和運行的關(guān)系了MyTask和YouTask是交替運行的,因為延遲時(shí)間相等



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>