ucos-ii學(xué)習(xí)筆記——信號量的原理及使用
學(xué)習(xí)筆記
for
redesigned
2012-10-7
versions:V-0.1
All
#include
#define
char
char
INT8U
INT8U
OS_EVENT
//注意,前面有一個例子2
//BOOLEAN
//這樣,當(dāng)已經(jīng)有任務(wù)訪問共享資源時,其他的任務(wù)就不能訪問,知道該資源未被訪問,其他的任務(wù)才可以進(jìn)行訪問
//注意這兩個信號量的區(qū)別和使用情況
OS_STK
OS_STK
OS_STK
void
void
void
void
void
{
Fun_Semp=OSSemCreate(1);
//用該參數(shù)對信號量計數(shù)器OSEventCnt進(jìn)行初始化
//1即代表只創(chuàng)建一個信號量,代表信號量用于對共享資源的訪問(例如,把它當(dāng)做二值信號量使用),詳見P166
}
void
{
#if
#endif
OSTaskCreate(YouTask,(void
for
}
//MyTask的函數(shù)代碼
void
{
#if
#endif
PC_DispStr(0,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
Fun(7,y);
OSSemPost(Fun_Semp);
}
void
{
#if
#endif
pdata=pdata;
for
{
OSSemPend(Fun_Semp,0,&err);
PC_DispStr(0,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
Fun(7,y);
OSSemPost(Fun_Semp);
}
//公共的函數(shù)Fun的代碼
void
{
PC_DispStr(x,y,"
}
//創(chuàng)建信號量時,用的參數(shù)為1,即Fun_Semp=OSSemCreate(1);
//共享資源的訪問(例如,可以把它當(dāng)做二值信號量使用)
//在上面的程序中,當(dāng)MyTask運行時,先請求獲得了信號量,對共享資源Fun函數(shù)進(jìn)行訪問,由于只創(chuàng)建了一個信號量,
//所以在MyTask的訪問期間,即使任務(wù)YouTask也進(jìn)行申請信號量,此時OSEventCnt是值已經(jīng)為0了,所以會把任務(wù)
//YouTask列入任務(wù)等代表OSEventTbl[]中,使任務(wù)處于等待狀態(tài)。
//只有等MyTask對Fun函數(shù)訪問完成了,調(diào)用OSSemPost(Fun_Semp);釋放了信號量,該釋放信號量的函數(shù)會先檢查任務(wù)等待
//表中是否還有等待信號量的任務(wù),如果有,則使任務(wù)進(jìn)入就緒態(tài)后,調(diào)用調(diào)度器OS_Sched()引發(fā)一次任務(wù)調(diào)度,去運行等待
//任務(wù)列表中優(yōu)先級最高的任務(wù)。如果沒有,則就把信號量計數(shù)器OSSemCnt加1.
//所以任務(wù)YouTask要想訪問Fun()函數(shù),必須等到任務(wù)MyTask對Fun訪問完畢,釋放了信號量之后,才能訪問,反之亦然
//所以由上面可以看出,只創(chuàng)建一個信號量,即OSSemCreate(1);,作用就相當(dāng)于使用一個二值信號量,標(biāo)志共享資源是否正在
//被訪問
//看懂了上面的分析,也就可以解釋實驗現(xiàn)象了,由于YouTask等待2s,MyTask等待1s,所以有可能在MyTask訪問Fan函數(shù)期間,YouTask
//也來訪問(也有可能是反過來),但是由于信號量已經(jīng)被MyTask占用了,所YouTask只好等待,MyTask使用完了,釋放了信號量,YouTask才能正常使用Fun函數(shù)
//這樣也就解決了多任務(wù)對共享資源的使用的問題,使任務(wù)之間得到了同步
//要仔細(xì)分析信號量工作的原理,把上面的內(nèi)容看懂了,基本上也就可以使用信號量了
評論