中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ucos-ii學(xué)習(xí)筆記——信號(hào)量集(事件標(biāo)志組)的原理及使用

        ucos-ii學(xué)習(xí)筆記——信號(hào)量集(事件標(biāo)志組)的原理及使用

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

        Author:zhangbin

        本文引用地址:http://www.antipu.com.cn/article/201611/322852.htm

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

        forucos-iiPC

        redesignedbyzhangbin

        2012-10-8

        versions:V-0.1

        AllRightsReserved

        #include"INCLUDES.h"

        #defineTASK_STK_SIZE512

        OS_STKStartTaskStk[TASK_STK_SIZE];//起始任務(wù)

        OS_STKMyTaskStk[TASK_STK_SIZE];

        OS_STKYouTaskStk[TASK_STK_SIZE];

        OS_STKHerTaskStk[TASK_STK_SIZE];

        char*s1="Mytaskisrunning";

        char*s2="Youtaskisrunning";

        char*s3="Hertaskisrunning";

        INT8Uerr;//返回的錯(cuò)誤信息

        INT8Uy=0;//字符顯示位置

        OS_FLAG_GRP*Sem_F;//定義一個(gè)信號(hào)量集指針,是標(biāo)志組類型,OS_FLAG_GRP類型的指針用標(biāo)志組描述信號(hào)量

        //事件控制塊用來描述信號(hào)量,消息郵箱,消息隊(duì)列

        voidStartTask(void*data);

        voidMyTask(void*data);

        voidYouTask(void*data);

        voidHerTask(void*data);

        voidmain(void)

        {

        OSInit();

        PC_DOSSaveReturn();

        PC_VectSet(uCOS,OSCtxSw);

        Sem_F=OSFlagCreate(0,&err);//創(chuàng)建信號(hào)量集函數(shù)的原型為:OS_FLAG_GRP*OSFlagCreate(OS_FLAGSflags,INT8U*err)

        //其中參數(shù)OS_FLAGSflags是信號(hào)的初始值,在這里指定為0,即信號(hào)初始值為0.參數(shù)*err是錯(cuò)誤信息,前面已經(jīng)定義了

        //INT8Uerr;//返回的錯(cuò)誤信息,所以此處為&err

        //返回值為OS_FLAG_GRP型的指針,即為創(chuàng)建的信號(hào)量集的標(biāo)志組的指針,

        //前面已經(jīng)定義了OS_FLAG_GRP*Sem_F;//定義一個(gè)信號(hào)量集指針

        OSTaskCreate(StartTask,(void*)0,&StartTaskStk[TASK_STK_SIZE-1],0);//創(chuàng)建起始任務(wù)

        OSStart();

        }

        voidStartTask(void*pdata)

        {

        #ifOS_CRITICAL_METHOD==3

        OS_CPU_SRcpu_sr;

        #endif

        INT16Skey;

        pdata=pdata;

        OS_ENTER_CRITICAL();//進(jìn)入臨界段

        PC_VectSet(0x08,OSTickISR);

        PC_SetTickRate(OS_TICKS_PER_SEC);

        OS_EXIT_CRITICAL();//退出臨界段

        OSStatInit();

        OSTaskCreate(MyTask,(void*)0,&MyTaskStk[TASK_STK_SIZE-1],3);//在起始任務(wù)中創(chuàng)建三個(gè)任務(wù)

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

        OSTaskCreate(HerTask,(void*)0,&HerTaskStk[TASK_STK_SIZE-1],5);

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

        {

        OSFlagPend(//請求信號(hào)量集

        Sem_F,//請求信號(hào)量集指針

        (OS_FLAGS)3,//過濾器請求第0和第1位信號(hào)0011這里是把數(shù)據(jù)3強(qiáng)制轉(zhuǎn)化為OS_FLAGS類型的數(shù)據(jù),

        //因?yàn)檫^濾器和信號(hào)量集中的信號(hào)都是OS_FLAGS類型的數(shù)據(jù)

        //OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,//信號(hào)全是1表示信號(hào)有效參數(shù)OS_FLAG_CONSUME表示當(dāng)

        //任務(wù)等待的事件發(fā)生后,清除相應(yīng)的事件標(biāo)志位

        OS_FLAG_WAIT_SET_ALL,//信號(hào)全是1表示信號(hào)有效沒有加參數(shù)OS_FLAG_CONSUME,所以不會(huì)清除標(biāo)志位

        0,//等待時(shí)限,0表示無限等待

        &err//錯(cuò)誤信息

        );

        //任務(wù)MyTask在這里請求信號(hào)量集,如果請求到了信號(hào)量集,就繼續(xù)運(yùn)行,下面就顯示信息,如果請求不到信號(hào)量集

        //MyTask就掛起,處于等待狀態(tài),只到請求到了信號(hào)量集才繼續(xù)往下運(yùn)行

        PC_DispStr(10,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);//顯示信息

        OSTimeDlyHMSM(0,0,2,0);//等待2s

        }

        }

        voidYouTask(void*pdata)

        {

        #ifOS_CRITICAL_METHOD==3

        OS_CPU_SRcpu_sr;

        #endif

        pdata=pdata;

        for(;;)

        {

        PC_DispStr(10,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);//顯示信息

        OSTimeDlyHMSM(0,0,8,0);//等待8s

        OSFlagPost(//向信號(hào)量集發(fā)信號(hào)

        Sem_F,//發(fā)送信號(hào)量集的指針

        (OS_FLAGS)2,//選擇要發(fā)送的信號(hào)給第1位發(fā)信號(hào)0010同樣把2強(qiáng)制轉(zhuǎn)化為OS_FLAGS型的數(shù)據(jù),

        //因?yàn)樾盘?hào)為OS_FLAGS型的

        OS_FLAG_SET,//信號(hào)有效的選項(xiàng)信號(hào)置1OS_FLAG_SET為置1OS_FLAG_CLR為置0

        &err//錯(cuò)誤信息

        );

        OSTimeDlyHMSM(0,0,2,0);//等待2s

        }

        }

        voidHerTask(void*pdata)

        {

        #ifOS_CRITICAL_METHOD==3

        OS_CPU_SRcpu_sr;

        #endif

        pdata=pdata;

        for(;;)

        {

        PC_DispStr(10,++y,s3,DISP_BGND_BLACK+DISP_FGND_WHITE);//顯示信息

        OSTimeDlyHMSM(0,0,8,0);//等待8s

        OSFlagPost(//向信號(hào)量集發(fā)信號(hào)

        Sem_F,

        (OS_FLAGS)1,//給第0位發(fā)信號(hào)0001,把1強(qiáng)制轉(zhuǎn)化為OS_FLAGS型的

        OS_FLAG_SET,//信號(hào)置1

        &err

        );

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

        }

        }

        //因?yàn)槿蝿?wù)MyTask請求信號(hào)量集的時(shí)候請求的是第一位和第零位,所以下面兩個(gè)任務(wù)分別發(fā)送第一位和第零位信號(hào)

        //有一個(gè)問題:任務(wù)請求信號(hào)量集,得到信號(hào)后,信號(hào)量集中的對應(yīng)的信號(hào)會(huì)被清除么??從本例的運(yùn)行現(xiàn)象來看,好像

        //是沒有清除,因?yàn)楫?dāng)?shù)谝淮蝁ouTask和HerTask運(yùn)行后,間隔了8s任務(wù)MyTask才運(yùn)行,因?yàn)閅ouTask和HerTask都等待了8s

        //才向信號(hào)量集發(fā)送信號(hào)。這個(gè)顯現(xiàn)是正常的。但是以后MyTask每間隔2s就運(yùn)行一次,沒有間隔8s,等待信號(hào)量集。

        //查到了:OSFlagPend()函數(shù)允許指定在任務(wù)等待的事件發(fā)生后,重新置起或是清除相應(yīng)的事件標(biāo)志位。這是通過在調(diào)用

        //OSFlagPend()函數(shù)時(shí)將一個(gè)常量OS_FLAG_CONSUME和參數(shù)wait_type相“加”(或者相“或”)來實(shí)現(xiàn)的。

        //例如希望等待事件標(biāo)志組的BIT0位置位,而此時(shí)事件標(biāo)志組的BIT0位已經(jīng)置位了,那么如果在調(diào)用OSFlagPend()時(shí),把參數(shù)

        //wait_type加上OS_FLAG_CONSUME,就能清除這個(gè)事件標(biāo)志位。如下所示:(詳細(xì)說明,參見P210)



        評論


        相關(guān)推薦

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

        關(guān)閉