在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

      EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ucos-ii學(xué)習(xí)筆記——消息隊(duì)列的原理及使用

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

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

      Author:zhangbin

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

      學(xué)習(xí)筆記

      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ù)在運(yùn)行

      //char*s_1;

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

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

      char*s;

      char*s500;

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

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

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

      INT8Uerr;

      INT8Uy=0;

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

      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)建消息隊(duì)列

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

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

      //N_MESSAGES是該數(shù)組的大小

      //返回值是消息隊(duì)列的指針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ā)送消息以LIFO后進(jìn)先出的方式發(fā)送

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

      for(;;)

      {

      s_flag="TheStartTaskisrunning!";

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

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

      {

      s100="ThevalueofOSTIMEisfrom100to500NOW!!";

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

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

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

      s="Thestringbelongstowhichtask.";

      OSQPostFront(Str_Q,s);//發(fā)送消息以LIFO方式發(fā)送所以如果要申請(qǐng)消息時(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ù)在運(yùn)行

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

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

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

      //因?yàn)榍懊姘l(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ù)在運(yùn)行

      ss=OSQPend(Str_Q,0,&err);//請(qǐng)求消息隊(duì)列

      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);

      }

      }

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

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

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

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

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



      評(píng)論


      相關(guān)推薦

      技術(shù)專區(qū)

      關(guān)閉