<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/322849.htm

學(xué)習筆記

forucos-iiPC

redesignedbyzhangbin

2012-10-7

versions:V-0.1

AllRightsReserved

#include"INCLUDES.h"

#defineTASK_STK_SIZE512

char*s1="MyTask";

char*s2="YouTask";

INT8Uerr;//定義一個(gè)錯誤信息

INT8Uy=0;

OS_EVENT*Fun_Semp;//聲明信號量是事件控制塊ECB類(lèi)型的

//注意,前面有一個(gè)例子2定義了互斥信號量,定義如下

//BOOLEANac_key;//信號量,互斥信號量實(shí)質(zhì)上就是一個(gè)標志位,是一個(gè)全局變量,來(lái)標志共享資源的訪(fǎng)問(wèn)情況

//這樣,當已經(jīng)有任務(wù)訪(fǎng)問(wèn)共享資源時(shí),其他的任務(wù)就不能訪(fǎng)問(wèn),知道該資源未被訪(fǎng)問(wèn),其他的任務(wù)才可以進(jìn)行訪(fǎng)問(wèn)

//注意這兩個(gè)信號量的區別和使用情況

OS_STKStartTaskStk[TASK_STK_SIZE];//定義任務(wù)堆棧區

OS_STKMyTaskStk[TASK_STK_SIZE];

OS_STKYouTaskStk[TASK_STK_SIZE];

voidFun(INT8Ux,INT8Uy);

voidStartTask(void*data);

voidMyTask(void*data);

voidYouTask(void*data);

voidmain(void)

{

Fun_Semp=OSSemCreate(1);//在主函數中創(chuàng )建信號量返回值為創(chuàng )建的信號量指針,參數是信號量的計數器的值

//用該參數對信號量計數器OSEventCnt進(jìn)行初始化

//1即代表只創(chuàng )建一個(gè)信號量,代表信號量用于對共享資源的訪(fǎng)問(wèn)(例如,把它當做二值信號量使用),詳見(jiàn)P166

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS,OSCtxSw);

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

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],1);//創(chuàng )建任務(wù)函數

OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE-1],2);//創(chuàng )建任務(wù)函數

for(;;)

{

//如果恩下ESC鍵,則退出UC/OS-II

if(PC_GetKey(&key)==TRUE)

{

if(key==0x1B)

{

PC_DOSReturn();

}

}

OSTimeDlyHMSM(0,0,3,0);

}

}

//MyTask的函數代碼

voidMyTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

OSSemPend(Fun_Semp,0,&err);//請求信號量參數Fun_Semp是信號量指針0那一項是等待時(shí)限timeout,0表示無(wú)限等待

//err表示錯誤信息

PC_DispStr(0,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);//顯示MyTask字符串

Fun(7,y);//調用Fun函數

OSSemPost(Fun_Semp);//發(fā)送信號量釋放信號量,函數的參數Fun_Semp代表信號量的指針

OSTimeDlyHMSM(0,0,1,0);

}

}

voidYouTask(void*pdata)

{

#ifOS_CRITICAL_METHOD==3//AllocatestorageforCPUstatusregister

OS_CPU_SRcpu_sr;

#endif

pdata=pdata;

for(;;)

{

OSSemPend(Fun_Semp,0,&err);//請求信號量

PC_DispStr(0,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);

Fun(7,y);//調用FUN函數

OSSemPost(Fun_Semp);//釋放信號量

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

}

}

//公共的函數Fun的代碼

voidFun(INT8Ux,INT8Uy)

{

PC_DispStr(x,y,"CallingFUN()",DISP_BGND_BLACK+DISP_FGND_WHITE);//顯示字符串,表示調用了Fun函數

}

//創(chuàng )建信號量時(shí),用的參數為1,即Fun_Semp=OSSemCreate(1);,只創(chuàng )建了一個(gè)信號量,這種情況一般是信號量用于對

//共享資源的訪(fǎng)問(wèn)(例如,可以把它當做二值信號量使用)

//在上面的程序中,當MyTask運行時(shí),先請求獲得了信號量,對共享資源Fun函數進(jìn)行訪(fǎng)問(wèn),由于只創(chuàng )建了一個(gè)信號量,

//所以在MyTask的訪(fǎng)問(wèn)期間,即使任務(wù)YouTask也進(jìn)行申請信號量,此時(shí)OSEventCnt是值已經(jīng)為0了,所以會(huì )把任務(wù)

//YouTask列入任務(wù)等代表OSEventTbl[]中,使任務(wù)處于等待狀態(tài)。

//只有等MyTask對Fun函數訪(fǎng)問(wèn)完成了,調用OSSemPost(Fun_Semp);釋放了信號量,該釋放信號量的函數會(huì )先檢查任務(wù)等待

//表中是否還有等待信號量的任務(wù),如果有,則使任務(wù)進(jìn)入就緒態(tài)后,調用調度器OS_Sched()引發(fā)一次任務(wù)調度,去運行等待

//任務(wù)列表中優(yōu)先級最高的任務(wù)。如果沒(méi)有,則就把信號量計數器OSSemCnt加1.

//所以任務(wù)YouTask要想訪(fǎng)問(wèn)Fun()函數,必須等到任務(wù)MyTask對Fun訪(fǎng)問(wèn)完畢,釋放了信號量之后,才能訪(fǎng)問(wèn),反之亦然

//所以由上面可以看出,只創(chuàng )建一個(gè)信號量,即OSSemCreate(1);,作用就相當于使用一個(gè)二值信號量,標志共享資源是否正在

//被訪(fǎng)問(wèn)

//看懂了上面的分析,也就可以解釋實(shí)驗現象了,由于YouTask等待2s,MyTask等待1s,所以有可能在MyTask訪(fǎng)問(wèn)Fan函數期間,YouTask

//也來(lái)訪(fǎng)問(wèn)(也有可能是反過(guò)來(lái)),但是由于信號量已經(jīng)被MyTask占用了,所YouTask只好等待,MyTask使用完了,釋放了信號量,YouTask才能正常使用Fun函數

//這樣也就解決了多任務(wù)對共享資源的使用的問(wèn)題,使任務(wù)之間得到了同步

//要仔細分析信號量工作的原理,把上面的內容看懂了,基本上也就可以使用信號量了



關(guān)鍵詞: ucos-ii學(xué)習筆記信號

評論


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