<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-8

Author:zhangbin

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

學(xué)習筆記

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;//返回的錯誤信息

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

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

//事件控制塊用來(lái)描述信號量,消息郵箱,消息隊列

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 )建信號量集函數的原型為:OS_FLAG_GRP*OSFlagCreate(OS_FLAGSflags,INT8U*err)

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

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

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

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

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(//請求信號量集

Sem_F,//請求信號量集指針

(OS_FLAGS)3,//過(guò)濾器請求第0和第1位信號0011這里是把數據3強制轉化為OS_FLAGS類(lèi)型的數據,

//因為過(guò)濾器和信號量集中的信號都是OS_FLAGS類(lèi)型的數據

//OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,//信號全是1表示信號有效參數OS_FLAG_CONSUME表示當

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

OS_FLAG_WAIT_SET_ALL,//信號全是1表示信號有效沒(méi)有加參數OS_FLAG_CONSUME,所以不會(huì )清除標志位

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

&err//錯誤信息

);

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

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

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(//向信號量集發(fā)信號

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

(OS_FLAGS)2,//選擇要發(fā)送的信號給第1位發(fā)信號0010同樣把2強制轉化為OS_FLAGS型的數據,

//因為信號為OS_FLAGS型的

OS_FLAG_SET,//信號有效的選項信號置1OS_FLAG_SET為置1OS_FLAG_CLR為置0

&err//錯誤信息

);

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(//向信號量集發(fā)信號

Sem_F,

(OS_FLAGS)1,//給第0位發(fā)信號0001,把1強制轉化為OS_FLAGS型的

OS_FLAG_SET,//信號置1

&err

);

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

}

}

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

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

//是沒(méi)有清除,因為當第一次YouTask和HerTask運行后,間隔了8s任務(wù)MyTask才運行,因為YouTask和HerTask都等待了8s

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

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

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

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

//wait_type加上OS_FLAG_CONSUME,就能清除這個(gè)事件標志位。如下所示:(詳細說(shuō)明,參見(jiàn)P210)



關(guān)鍵詞: ucos-ii信號量集事件標志

評論


相關(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>