




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
ucos-nAPI參照手冊
本章提供了uc/os-n的顧客指南。每一種顧客可以調(diào)用II勺內(nèi)核函數(shù)都按字母次序加以闡
明,包括:
?函數(shù)的功能描述
?函數(shù)原型
?函數(shù)名稱及源代碼
?函數(shù)使用到的常量
?函數(shù)參數(shù)
?函數(shù)返回值
?特殊闡明和注意點
OSInit()
VoidOSInit(void);
所屬文獻調(diào)用者開關量
OS.CORE.C啟動代碼無
OSinit()初始化uC/OS-I【,對這個函數(shù)的J調(diào)用必須在調(diào)用OSStart()函數(shù)之前,而OSStart
O函數(shù)真正開始運行多任務。
參數(shù)
無
返回值
無
注意/警告
必須先于OSStan()函數(shù)II勺調(diào)用
范例:
voidmain(void)
(
OSInitO;/*初始化uC/OS-II
OSStartO;/*啟動多任務內(nèi)核*/
OSIntEnter()
VoidOSIntEnter(void);
所屬文獻調(diào)用者開關量
OS_CORE.C中斷無
OSIntEnter()告知uC/OS-II一種中斷處理函數(shù)正在執(zhí)行,這有助于uC/OS-II掌握中斷嵌套的
狀況。OSIntEnter()函數(shù)一般和OSIntExit()函數(shù)聯(lián)合使用。
參數(shù)
無
返回值
無
注意/警告
在任務級不能調(diào)用該函數(shù)。
假如系統(tǒng)使用日勺處理器可以執(zhí)行自動口勺獨立執(zhí)行讀取-修改-寫入的操作,那么就可以直接遞增中
斷嵌套層數(shù)(OSInlNesting),這樣可以防止調(diào)用函數(shù)所帶來的額外的開銷。
范例一:
(Intel80x86的實模式,在大模式下編譯,,realmode,largemodel)
ISRxPROCFAR
PUSHA;保留中斷現(xiàn)場
PUSHES
PUSHDS
MOVAX,DGROUP;讀入數(shù)據(jù)段
MOVDS,AX
CALLFARPTR_OSIntEnter;告知內(nèi)核進入中斷
POPDS;恢旦中斷現(xiàn)場
POPES
POPA
IRET;中斷返回
ISRxENDP
范例二:
(Intel80x86的實模式,在大模式下編譯,,realmode,largemodel)
ISRxPROCFAR
PUSHAf保留中斷現(xiàn)場
PUSHES
PUSHDS
f
MOVAX,DGROUP;讀入數(shù)據(jù)段
MOVDS,AX
INCBYTEPTR_OSIntNesting;告知內(nèi)核進入中斷
POPDS;恢復中斷現(xiàn)場
POPES
POPA
*
IRETf中斷返回
ISRxENDP
OSIntExit()
VoidOSIntExit(void);
所屬文獻調(diào)用者開關量
OS_CORE.C中斷無
OSIntExit()告知uC/OS-H一種中斷服務已執(zhí)行完畢,這有助于uC/OS-II掌握中斷嵌套的狀
況。一般OSIntExit()和OSIntEnter()聯(lián)合使用。當最終一層嵌套的中斷執(zhí)行完畢后,假如
有更高優(yōu)先級的任務準備就緒,UC/OSJI會調(diào)用任務調(diào)度函數(shù),在這種狀況下,中斷返回到更
高優(yōu)先級的任務而不是被中斷了的任務。
參數(shù)
無
返回值
無
注意/警告
在任務級不能調(diào)用該函數(shù)。并且雖然沒有調(diào)用OSIntEnler()而是使用直接遞增OSInlNesling
H勺措施,也必須調(diào)用OSIntExit()函數(shù)。
范例:
(Intel80x86的實模式,在大模式下編譯,realmode,largemodel)
ISRxPROCFAR
PUSHA;保留中斷現(xiàn)場
PUSHES
PUSHDS
CALLFARPTR_OSIntExit;告知內(nèi)核進入中斷
POPDS;恢復中斷現(xiàn)場
POPES
POPA
IRET;中斷返回
ISRxENDP
OSMboxAccept()
Void*OSMboxAccept(OS-EVENT*pevent);
所屬文獻調(diào)用者開關量
OS_MBOX.C任務或中斷OS_MBOX_EN
OSMboxAccept()函數(shù)查看指定的消息郵箱與否有需要的消息。不一樣于OSMboxPend()函
數(shù),假如沒有需要的消息,OSMboxAccept()函數(shù)并不掛起任務。假如消息己經(jīng)抵達,該消息
被傳遞到顧客任務并且從消息郵箱中清除。一般中斷調(diào)用該函數(shù),由于中斷不容許掛起等待消
息。
參數(shù)
pevent是指向需要行看的消息郵箱II勺指針。當建立消息郵箱時,該指針返網(wǎng)到顧客程序。(參照
OSMboxCreate()函數(shù))。
返回值
假如消息已經(jīng)抵達,返回指向該消息口勺指針:假如消息郵箱沒有消息,返回空指針。
注意/警告
必須先建立消息郵箱,然后使用。
范例:
OSEVENT*CommMbox;
voidTask(void*pdata)
void*msg;
pdata=pdata;
for(;;){
msg=OSMboxAccept(CommMbox);/*檢Si消息郵箱與否有消息*/
if(msg!=(void*)0)(
/*處理消息*/
}else{
/*沒有消息*/
)
OSMboxCreate()
OS_EVENT*OSMboxCreate(void*msg);
所屬文獻調(diào)用者開關量
OS_MBOX.C任務或啟動代碼OS_MBOX_EN
OSMboxCreate()建立并初始化一種消息郵箱。消息郵箱容許任務或中斷向其他一種或幾種任
務發(fā)送消息。
參數(shù)
msg參數(shù)用來初始化建立小J消息郵箱。假如該指針不為空,建立的消息郵箱將具有消息。
返回值
指向分派給所建立的消息郵箱II勺事件控制塊II勺指針。假如沒有可用的事件控制塊,返回空指針。
注意/警告
必須先建立消息郵箱,然后使用。
范例:
OS_EVENT*CommMbox;
voidmain(void)
OSInitO;/*初始化UC/OS-II*/
CommMbox=OSMboxCreate((void*)0);/*建立消息郵箱*/
OSStart();/*啟動多任務內(nèi)核*/
OSMboxPend()
Void*OSMboxPend(OS_EVNNT*pevent,INT16Utimeout,int8u*err);
所屬文獻調(diào)用者開關量
OS_MBOX.C任務OS_MBOX_EN
OSMboxPend()用于任務等待消息。消息通過中斷或此外的任務發(fā)送給需要的任務。消息是一
種以指針定義的J變量,在不一樣的程序中消息的使用也也許不一樣。假如調(diào)用OSMboxPend()
函數(shù)時消息郵箱已經(jīng)存在需要日勺消息,那么該消息被返回給OSMboxPend()日勺調(diào)用者,消息
郵箱中清除該消息。假如調(diào)用OSMboxPend。函數(shù)時消息郵箱中沒有需要日勺消息,OSMboxPend
O函數(shù)掛起目前任務直到得到需要H勺消息或超過定義等待超時H勺時間。假如同步有多種任務
等待同一種消息,uC/OS-II默認最高優(yōu)先級的任務獲得消息并且任務恢復執(zhí)行。一種由
OSTaskSuspend()函數(shù)掛起的任務也可以接受消息,但這個任務將一直保持掛起狀態(tài)直到通過
調(diào)用OSTaskRcsumc()函數(shù)恢復:任務的運行。
參數(shù)
pevent是指向即將接受消息H勺消息郵箱的指針。該指針的值在建立該消息郵箱時可以得到。
(參照OSMboxCreate()函數(shù))。
Timeout容許一種任務在通過了指定數(shù)目日勺時鐘節(jié)拍后還沒有得到需要的消息時恢復運行:。假
如該值為零表達任務將持續(xù)的等待消息,°最大的等待時間為65,535個時鐘節(jié)拍。這個時間長度
并不是非常嚴格的,也許存在一種時鐘節(jié)拍的誤差,由了只有在一種時鐘節(jié)拍結(jié)束后才會減少
定義的等待超時時鐘節(jié)拍。
Err是指向包括錯誤碼H勺變量H勺指針。OSMboxPend()函數(shù)返回的錯誤碼也許為下述幾種:
?OS_NO_ERR:消息被對的口勺接受。
?OS_TIMEOUT:消息沒有在指定H勺周期數(shù)內(nèi)送到。
?OS_ERR_PEND_ISR:從中斷調(diào)用該函數(shù)。雖然規(guī)定了不容許從中斷調(diào)用該函數(shù),但U
C/OS-H仍然包括了檢測這種狀況的功能。
?OS_ERR_EVENT_TYPE:pevent不是指向消息郵箱的指針。
返回值
OSMboxPend()函數(shù)返回接受的消息并將氣rr置為OS_NO_ERR。假如沒有在指定數(shù)目的時
鐘節(jié)拍內(nèi)接受到需要的消息,OSMboxPend()函數(shù)返回空指針并且將氣n?設置為
OS_TIMEOUT<.
注意/警告
必須先建立消息郵箱,然后使用。
不容許從中斷調(diào)用該函數(shù)。
范例:
OS_EVENT*CommMbox;
voidCommTask(void*pdata)
(
INT8Uerr;
void*msg;
pdata=pdata;
for(;;)(
msg=OSMboxPend(CommMbox,10,&err);
if(err==OSNOERR)(
/*消息對的的接受
}else{
/*在指定期間內(nèi)沒有接受到消息*/
}
}
OSMboxPost()
INT8UOSMboxPost(OS.EVENT*pevent,void*msg);
所屬文獻調(diào)用者開關量
OS_MBOX.C任務或中斷OS_MBOX_EN
OSMboxPost()函數(shù)通過消息郵箱向任務發(fā)送消息。消息是一種指針長度H勺變量,在不一樣的
程序中消息的使用也也許不一樣。假如消息郵箱中己經(jīng)存在消息.,返回錯誤碼闡明消息郵箱已
滿。OSMboxPost()函數(shù)立即返回調(diào)用者,消息也沒有可以發(fā)到消息郵箱。假如有任何任務在
等待消息郵箱的消息,最高優(yōu)先級的任務將得到這個消息。假如等待消息H勺任務優(yōu)先級比發(fā)送
消息的任務優(yōu)先級高,那么高優(yōu)先級H勺任務將得到消息而恢復執(zhí)行,也就是說,發(fā)生了一次任
務切換。
參數(shù)
pevent是指向即將接受消息的消息郵箱的指針。該指針的值在建立該消息郵箱時可以得到。
(參照OSMboxCreate()函數(shù))。
Msg是即將實際發(fā)送給任務的消息。消息是一種指針長度口勺變量,在不一樣日勺程序中消息的使
用也也許不一樣。不容許傳遞一種空指針,由于這意味著消息郵箱為空。
返回值
OSMboxPost()函數(shù)的J返回值為下述之一:
?OS_NO_ERR:消息成功日勺放到消息郵箱中。
?OS_MBOX_FULL:消息郵箱已經(jīng)包括了其他消息,不空。
?OS_ERR_EVENT_TYPE:pevent不是指向消息郵箱II勺指針。
注意/警告
必須先建立消息郵箱,然后使用。
不容許傳遞一種空指針,由于這意味著消息郵箱為空。
范例:
OS_EVENT*CommMbox;
INT8UCommRxBuf[103];
voidCommTaskRx(void1cpdata)
(
INT8Uerr;
pdata=pdata;
for(;;)(
err=OSMboxPost(CommMbox,(void*)&CommRxBuf(0]);
}
OSMboxQuery()
INT8UOSMboxQuen(OS_EVENT*pevent,OS_MBOX_DATA*pdata);
所屬文獻調(diào)用者開關量
OS.MBOX.C任務或中斷OS_MBOX_EN
OSMboxQuery()函數(shù)用來獲得消息郵箱的信息。顧客程序必須分派一種OS_MBOX_DATAII勺
數(shù)據(jù)構(gòu)造,該構(gòu)造用來從消息郵箱口勺事件控制塊接受數(shù)據(jù),通過調(diào)用OSMboxQuery()函數(shù)可
以懂得任務與否在等待消息以及有多少個任務在等待消息,還可以檢查消息郵箱目前的消息、。
參數(shù)
pevent是指向即將接受消息的消息郵箱的指針。該指針的值在建立該消息郵箱時可以得至上
(參照OSMboxCreate()函數(shù))。
Pdata是指向OS_MBOX_DATA數(shù)據(jù)構(gòu)造的指針,該數(shù)據(jù)構(gòu)造包括下述組員:
\bid*OSMsg;/*消息郵箱中消息的復制*/
INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*消息郵箱等待隊列的復制*/
INT8UOSEvenlGrp:
返回值
OSMboxQuery()函數(shù)的J返回值為下述之":
?OS_NO_ERR:調(diào)用成功
?OS_ERR_EVENT_TYPE:pcvcnt不是指向消息郵箱的I指針。
注意/警告
必須先建立消息郵箱,然后使用。
范例:
OS_EVENT*CommMbox;
voidTask(void*pdata)
(
OS_MBOXDATAmbox_data;
INT8Uerr;
pdata=pdata;
for(;;)(
err=OSMboxQuery(CommMbox,&mbox_data);
if(err==OS_NO_ERR)(
./*假如mbox_data.OSMsg為非空指針,闡明消息郵箱非空*/
)
}
OSMemCreate()
OS_MEM*OSMemCreate(void*addi;INT32Unblks,INT32Ublksize,INT8U*err);
所屬文獻調(diào)用者開關量
OS_MEM.C任務或初始代碼OS_/MEM_EN
OSMemCreate()函數(shù)建立并初始化一塊內(nèi)存區(qū)。一塊內(nèi)存區(qū)包括指定數(shù)目的大小確定的內(nèi)存
塊。程序可以包括這些內(nèi)存塊并在用完后釋放回內(nèi)存區(qū)。
參數(shù)
addr建立日勺內(nèi)存區(qū)的起妗地址。內(nèi)存區(qū)可以使用靜態(tài)數(shù)組或在初始化時使用malloc()函數(shù)
建立。
Nblks需要H勺內(nèi)存塊的數(shù)目。每一種內(nèi)存區(qū)至少需要定義兩個內(nèi)存塊。
Blksize每個內(nèi)存塊口勺大小,至少應當可以容納一種指針。
Err是指向包括錯誤碼的變量的指針。OSMemCreate()函數(shù)返回時錯誤碼也許為下述幾種:
OS_NO_ERR:成功建立內(nèi)存區(qū)。
OS_MEMJNV^LID_PART:沒有空閑的內(nèi)存區(qū)。
OS_MEMJNV\LID_BLKS:沒有為每一種內(nèi)存區(qū)建立至少兩個內(nèi)存塊。
OS_MEMJNV\LID_SIZE:內(nèi)存塊大小局限性以容納?種指針變量。
返回值
OSMemCreate()函數(shù)返回指向內(nèi)存區(qū)控制塊H勺指針。假如沒有剩余內(nèi)存區(qū),OSMemCreate()
函數(shù)返回空指針。
注意/警告
必須首先建立內(nèi)存區(qū),然后使用。
范例:
OS_MEM*CommMem;
INT8UCommBuf[16][128];
voidmain(void)
(
INT8Uerr;
OSInitO;/*初始化UC/OS-1I*/
CommMem=OSMemCreate(SCommBuf[0][0],16,128,&err);
OSStartO;/*啟動多任務內(nèi)核*/
}
OSMemGet()
Void*OSMemGet(OS_MEM*pmem,INT8U*err);
所屬文獻調(diào)用者開關量
OS_MEM.C任務或中斷OS_MEM_EN
OSMemGet()函數(shù)用于從內(nèi)存辨別配一種內(nèi)存塊。顧客程序必須懂得所建立日勺內(nèi)存塊的大小,
同步顧客程序必須在使用完內(nèi)存塊后釋放內(nèi)存塊??梢远啻握{(diào)用OSMemGet()函數(shù),
參數(shù)
pniem是指向內(nèi)存區(qū)控制塊的指針,可以從OSMemCreate()函數(shù)返回得到。
Err是指向包括錯誤碼的變量日勺指針。OSMemGet(函數(shù)返回的J錯誤碼也許為下述幾種:
?OS_NO_ERR:成功得到一種內(nèi)存塊。
?OS_MEM_NO_FREE_BLKS:內(nèi)存區(qū)已經(jīng)沒有空間分派給內(nèi)存塊。
返回值
OSMcmGct()函數(shù)返回指向內(nèi)存區(qū)塊歐J指針。假如沒有空間分派給內(nèi)存塊,OSMemGet()函
數(shù)返回空指針。
注意/警告
必須首先建立內(nèi)存區(qū),然后使用。
范例:
OS_MEM*CommMem;
voidTask(void*pdata)
(
INT8U*msg;
pdata=pdata;
for(;;)(
msg■OSMemGet(CommMem,&err);
if(msg!=(INT8U*)0){
/*內(nèi)存塊已經(jīng)分派*/
)
OSMemPut()
INT8UOSMemPut(OS_MEM*pmem,void*pblk);
所屬文獻調(diào)用者開關量
OS_MEM.C任務或中斷OS_MEM_EN
OSMemPut()函數(shù)釋放一種內(nèi)存塊,內(nèi)存塊必須釋放回原先申請II勺內(nèi)存區(qū)。
參數(shù)
pmem是指向內(nèi)存區(qū)控制塊的J指針,可以從OSMcmCrcatc()函數(shù)返回得到。
Pblk是指向?qū)⒈会尫诺膬?nèi)存塊的指針。
返回值
OSMemPut()函數(shù)的返回值為下述之一:
OS_NO_ERR:成功釋放內(nèi)存塊
OS_MEM_FULL:內(nèi)存區(qū)已經(jīng)不能再接受更多釋放口勺內(nèi)存塊。這種狀況闡明顧客程序出現(xiàn)了錯
誤,釋放了多于用OSMemGei()函數(shù)得到日勺內(nèi)存塊。
注意/警告
必須首先建立內(nèi)存區(qū),然后使用。
內(nèi)存塊必須釋放回原先申請的內(nèi)存區(qū)。
范例:
OS_MEM*CommMem;
INT8U*CommMsg;
voidTask(void*pdata)
INT8Uerr;
pdata=pdata;
for;){
err=OSMemPut(CommMem,(void*)CommMsg);
if(err==OS_NO_ERR){
./*釋放內(nèi)存決*/
)
}
OSMemQuery()
INT8UOSMemQuery(OS_MEM*pmem,OS_MEM_DATA*pdata);
所屬文獻調(diào)用者開關量
OS_MEM.C任務或中斷OS_MEM_EN
OSMemQuery()函數(shù)得到內(nèi)存區(qū)的信息。該函數(shù)返回OS_MEM構(gòu)造包括的信息,但使用了一
種新的OS_MEM_DAI'A的數(shù)據(jù)構(gòu)造。OS_MEM_DAI'A數(shù)據(jù)構(gòu)造還包括了正被使用的內(nèi)存塊數(shù)
目的域。
參數(shù)
pmem是指向內(nèi)存區(qū)控制塊的指針,可以從OSMemCreate()函數(shù)返回得到。
Pdata是指向OS_MEM_DATA數(shù)據(jù)構(gòu)造的指針,該數(shù)據(jù)構(gòu)造包括了如下的域:
\6idOSAddr;/*指向內(nèi)存區(qū)起始地址的指針*/
VbidOSFreeList;/*指向空閑內(nèi)存塊列表起始地址的指針*/
INT32UOSBlkSize;/*每個內(nèi)存塊的大小*/
INT32UOSNBlks;/*該內(nèi)存區(qū)的內(nèi)存塊總數(shù)*/
INT32UOSNFree:/水空閑的J內(nèi)存塊數(shù)目*/
INT32UOSNUscd;/*使用的內(nèi)存塊數(shù)目*/
返回值
OSMemQuery()函數(shù)返回值總是OS_NO_ERR。
注意/警告
必須首先建立內(nèi)存區(qū),然后使用。
范例:
OS_MEM*CommMem;
voidTask(void*pdata)
(
INT8Uerr;
OS_MEM_DATAmem_data;
pdata=pdata;
for(;;)(
err=OSMemQuery(CommMem,&mem_data);
}
}
OSQAccept()
Void*OSQAccept(OS_EVENT*pevent);
所屬文獻調(diào)用者開關量
OS_Q.C任務或中斷OS_Q_EN
OSQAcccpt()函數(shù)檢查消息隊列中與否已經(jīng)有需要的J消息。不一樣于OSQPcnd()函數(shù),假
如沒有需要的消息,OSQAccept()函數(shù)并不掛起任務。假如消息已經(jīng)抵達,該消息被傳遞到
顧客任務。?般中斷調(diào)用該函數(shù),由于中斷不容許掛起等待消息。
參數(shù)
pcvent是指向需要查看『、J消息隊列口勺指針。當建立消息隊列時,該指針返回到顧客程序。(參照
OSMboxCreate()函數(shù))。
返回值
假如消息已經(jīng)抵達,返回指向該消息II勺指針;假如消息隊列沒有消息,返回空指針。
注意/警告
必須先建立消息隊列,然后使用。
范例:
OS_EVENT*CommQ;
voidTask(void*pdata)
(
void*msg;
pdata=pdata;
for(;;)(
msg=OSQAccept(CommQ);/*檢查消息隊列*/
if(msg!=(void*)0)(
/*處理接受的消息*/
}else{
/*沒有消息*/
)
}
OSQCreate()
OS.EVENT*OSQCreate(void**start,INT8Usize);
所屬文獻調(diào)用者開關量
OS_Q.C任務或啟動代碼OS_Q_EN
OSQCreateO函數(shù)建立一種消息隊列。任務或中斷可以通過消息隊列向其他一種或多種任務發(fā)
送消息。消息的J含義是和詳細口勺應用親密有關B勺。
參數(shù)
start是消息內(nèi)存區(qū)時基地址,消息內(nèi)存區(qū)是一種指針數(shù)組。
Size是消息內(nèi)存區(qū)的大小。
返回值
OSQCreate()函數(shù)返回一種指向消息隊列事件控制塊向右針。假如沒有空余的事件空閑塊,
OSQCreate()函數(shù)返回空指針。
注意/警告
必須先建立消息隊列,然后使用。
范例:
OS_EVENT*CommQ;
void*CommMsg[10];
voidmain(void)
OSInit();/*初始化UC/OS?H*/
CommQ=OSQCreate(SCommMsg[0]z10);/*建立消息隊列
OSStart();/*啟動多任務內(nèi)核
OSQFlush()
INT8U*SOQFlush(OS_EVENT*pevent);
所屬文獻調(diào)用者開關量
OS_Q.C任務或中斷OS_Q_EN
OSQFlush()函數(shù)清空消息隊列并且忽視發(fā)送往隊列的所有消息。不管隊列中與否有消息,這
個函數(shù)的J執(zhí)行時間都是相似的I。
參數(shù)
pevent是指向消息隊列的指針。該指針日勺值在建立該隊列時可以得到。(參照OSQCrcale()
函數(shù))。
返回值
OSQFlush()函數(shù)的返回值為下述之一:
?OS_NO_ERR:消息隊列被成功清空
?OS_ERR_EVENT_TYPE:試圖清除不是消息隊列的I對象
注意/警告
必須先建立消息隊列,然后使用。
范例:
OS_EVENT*CommQ;
voidmain(void)
INT8Uerr;
OSInit();/*初始化UC/OS-H*/
err=OSQFlush(CommQ);
OSStart();/*啟動多任務內(nèi)核
OSQPend()
Void*OSQPend(OS.EVENT*pevent,INT16Utimeout,INT8U*err);
所屬文獻調(diào)用者開關量
OS_Q.C任務OS_Q_EN
OSQPend()函數(shù)用于任務等待消息.消息通過中斷或此外II勺任務發(fā)送給需要的任務。消息是
一種以指針定義口勺變量,在不一樣日勺程序中消息的使用也也許不一樣。假如調(diào)用OSQPend()
函數(shù)時隊列中已經(jīng)存在需要的J消息,那么該消息被返回給OSQPend()函數(shù)日勺調(diào)用者,隊列中
清除該消息。假如調(diào)用OSQPend()函數(shù)時隊列中沒有需要的消息,OSQPend()函數(shù)掛起目
前任務直到得到需要的消息或超過定義的超時時間。假如同步有多種任務等待同一種消息,U
C/OSJI默認最高優(yōu)先級的任務獲得消息并且任務恢復執(zhí)行。一種由OSTaskSuspend()函數(shù)掛
起的任務也可以接受消息,但這個任務將一直保持掛起狀態(tài)直到通過調(diào)用OSTaskResume()函
數(shù)恢愛任務的運行。
參數(shù)
pevent是指向即將接受消息的隊列的指針。該指針H勺值在建立該隊列時可以得到。(參照
OSMboxCreate()函數(shù))。
Timeout容許一種任務在通過了指定數(shù)FH、J時鐘節(jié)拍后還沒有得到需要的消息時恢復運行狀
態(tài)。假如該值為零表達任務將持續(xù)時等待消息。最大的等待時間為65535個時鐘節(jié)拍。這個時
間長度并不是非常嚴格的,也許存在一種時鐘節(jié)拍的誤差,由于只有在一種時鐘節(jié)拍結(jié)束后才
會減少定義的等待超時時鈔節(jié)拍。
Err是指向包括錯誤碼H勺變量H勺指針。OSQPend()函數(shù)返回的錯誤碼也許為下述幾種:
?OS_NO_ERR:消息被對的口勺接受。
?OS_TIMEOUT:消息沒有在指定H勺周期數(shù)內(nèi)送到。
?OS_ERR_PEND_ISR:從中斷調(diào)用該函數(shù)。雖然規(guī)定了不容許從中斷調(diào)用該函數(shù),但口
C/OS-H仍然包括了檢測這種狀況的功能。
?OS_ERR_EVENT_TYPE:pevent不是指向消息隊列I付指針。
返回值
OSQPend()函數(shù)返回接受的消息并將*err置為OS_NO_ERR。假如沒有在指定數(shù)Fl的I時鐘節(jié)
拍內(nèi)接受到需要的消息,OSQPend()函數(shù)返回空指針并且將*crr設置為OS_TIMEOUT。
注意/警告
必須先建立消息郵箱,然后使用。
不容許從中斷調(diào)用該函數(shù)。
范例:
OS_EVENT*CommQ;
voidCommTask(void*data)
(
INT8Uerr;
void*msg;
pdata=pdata;
for;){
msg=OSQPend(CommQ,100,&err);
if(err==OS_NO_ERR){
./*在指定期間內(nèi)接受到消息*/
}else{
./*在指定的時間內(nèi)沒有接受到指定I向消息
OSQPost()
INT8UOSQPost(OS_EVENT*pevent,void*msg);
所屬文獻調(diào)用者開關量
OS_Q.C任務或中斷OS_Q_EN
OSQPost()函數(shù)通過消息隊列向任務發(fā)送消息。消息是一種指針長度H勺變量,在不一樣II勺程
序中消息口勺使用也也許不一樣。假如隊列中已經(jīng)存滿消息,返回錯誤碼。OSQPost()函數(shù)立
即返回調(diào)用者,消息也沒有可以發(fā)到隊列。假如有任何任務在等待隊列中日勺消息,最高優(yōu)先級
的任務將得到這個消息。假如等待消息的任務優(yōu)先級比發(fā)送消息時任務優(yōu)先級高,那么高優(yōu)先
級H勺任務將得到消息而恢復執(zhí)行,也就是說,發(fā)生「一次任務切換。消息隊列是先入先出(FIFO)
機制I向,先進入隊列的消息先被傳遞給任務。
參數(shù)
pevent是指向即將接受消息B勺消息隊列日勺指針。該指針的值在建立該隊列時可.以得到。(參照
OSQCreate()函數(shù)C
Msg是即將實際發(fā)送給任務的消息。消息是一種指針長度口勺變量,在不一樣日勺程序中消息的使
用也也許不一樣。不容許傳遞一種空指針。
返回值
OSQPost()函數(shù)的返回值為下述之一:
?OS_NO_ERR:消息成功日勺放到消息隊列中。
?OS_MBOX_FULL:消息隊列已滿。
?OS_ERR_EVENT_TYPE:pevent不是指向消息隊列II勺指針。
注意/警告
必須先建立消息隊列,然后使用。
不容許傳遞一種空指針。
范例:
OS_EVENT*CommQ;
INT8UCommRxBuf[103];
voidCommTaskRx(voidxpdata)
(
INT8Uerr;
pdata=pdata;
for;){
err-OSQPost(CommQ,(void*)&CommRxBuf[0]);
if(?rr==OS_NO_ERR){
/*將消息放入消息隊列*/
}else{
/*消息隊列已滿*/
}
OSQPostFront()
INT8UOSQPostFront(OS_EVENT*pevent,void*msg);
所屬文獻調(diào)用者開關量
OS_Q.C任務或中斷OS_Q_EN
OSQPostFront()函數(shù)通過消息隊列向任務發(fā)送消息。OSQPostFront()函數(shù)和OSQPost()
函數(shù)非常相似,不一樣之處在于OSQPostFront()函數(shù)將發(fā)送口勺消息插到消息隊列口勺最前端。
也就是說,OSQPostFront()函數(shù)使得消息隊列按照后入先出(LIFO)的J方式工作,而不是先
入先出(FIFO)。消息是一種指針長度的變量,在不一樣的程序中消息的使用也也許不一樣。假
如隊列中已經(jīng)存滿消息,返回錯誤碼。OSQPost()函數(shù)立即返回調(diào)用者,消息也沒能發(fā)到隊
列。假如有任何任務在等待隊列中的消息,最高優(yōu)先級的任務將得到這個消息。假如等待消息
的任務優(yōu)先級比發(fā)送消息的任務優(yōu)先級高,那么高優(yōu)先級的任務將得到消息而恢復執(zhí)行,也就
是說,發(fā)生了一次任務切換
參數(shù)
pevent是指向即將接受消息H勺消息隊列H勺指針。該指針時值在建立該隊列時可以得到。(參照
OSQCreate()函數(shù))。
Msg是即將實際發(fā)送給任務的消息。消息是一種指針長度口勺變量,在不一樣的程序中消息的使
用也也許不一樣。不容許傳遞一種空指針。
返回值
OSQPost()函數(shù)的返回值為下述之一:
?OS_NO_ERR:消息成功的放到消息隊列中。
?OS_MBOX_FULL:消息隊列已滿。
?OS_ERR_EVENT_TYPE:pcvcnt不是指向消息隊列出J指針。
注意/警告
必須先建立消息隊列,然后使用。
不容許傳遞一種空指針飛
范例:
OS_EVENT*CommQ;
INT8UCommRxBuf[103];
voidCommTaskRx(void*pdata)
(
INT8Uerr;
pdata=pdata;
for(;;)(
err=OSQPostFront(CommQ,(void*)&CommR:<Buf[0]);
if(err==OS_NO_ERR){
./*將消息放入消息隊列*/
}else{
/*消息隊列已滿*/
)
}
OSuery()
INT8UOSuery(OS_EVENT*pevent,OS_Q_DATA*pdata);
所屬文獻調(diào)用者開關量
OS_Q.C任務或中斷OS_Q_EN
OSueryO函數(shù)用來獲得消息隊列的信息。顧客程序必須建立一種OS_Q_DATAII勺數(shù)據(jù)構(gòu)造,
該構(gòu)造用來保留從消息隊到的J事件控制塊得到口勺數(shù)據(jù)。通過調(diào)用OSuery()函數(shù)可以懂得
任務與否在等待消息、有多少個任務在等待消息、隊列中有多少消息以及消息隊列可以容納的
消息數(shù)。OSuery()函數(shù)還可以得到即將被傳遞給任務的消息的信息。
參數(shù)
pevent是指向即將接受消息II勺消息郵箱的指針。該指針的值在建立該消息郵箱時可以得到。
(參照OSQCreate()函數(shù))。
Pdata是指向OS_Q_DATA數(shù)據(jù)構(gòu)造的指針,該數(shù)據(jù)構(gòu)造包括下述組員:
\bid*()SMsg;/*下一種可用日勺消息*/
INTI6UOSNMsgs;/*隊列中H勺消息數(shù)目*/
INTI6UOSQSize;/*消息隊列的大小*/
INT8UOSEventTbl|OS_EVENT_TBL_SIZE1;/*消息隊列的等待隊列*/
INTSUOSEvcntGrp;
返回值
OSuery()函數(shù)的返回值為下述之一:
?OS_NO_ERR:調(diào)用成功
?OS_ERR_EVENT_TYPE:pevent不是指向消息隊列的指針。
注意/警告
必須先建立消息隊列,然后使用。
范例:
OS_EVENT*CommQ;
voidTask(void*pdata)
(
OS_Q_DATAqdata;
INT8Uerr;
pdata=pdata;
for(;;)(
err-OSuery(CommQ,&qdata);
if(err==OS_NO_ERR){
./*獲得消息隊列的信息*/
}
OSSchedLock()
VoidOSSchedLock(void);
所屬文獻調(diào)用者開關量
OS_CORE.C任務或中斷N/A
OSSchedLock()函數(shù)停止任務調(diào)度,只有使用配對的函數(shù)OSSchedUnbck()才能重新開始
內(nèi)核的任務調(diào)度。調(diào)用OSSchedLock()函數(shù)的任務獨占CPU,不管有無其他高優(yōu)先級的就緒
任務。在這種狀況下,中斷仍然可以被接受和執(zhí)行(中斷必須容許)。OSSchedLock()函數(shù)和
OSSchcdUnlock()函數(shù)必須配對使用??贑/OS-II可以支持多達254層於JOSSchedLock()函
數(shù)嵌套,必須調(diào)用同樣次數(shù)的OSSchedUnlock()函數(shù)才能恢復任務調(diào)度。
參數(shù)
無
返回值
無
注意/警告
任務調(diào)用rOSSchedLock()函數(shù)后,決不能再調(diào)用也許導致目前任務掛起的系統(tǒng)函數(shù):
OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。由
于任務調(diào)度已經(jīng)被嚴禁,其他任務不能運行,這會導致系統(tǒng)死鎖。
范例:
voidTaskX(void*pdata)
pdata=pdata;
for(;;){
OSSchedLock();/*停止任務調(diào)度*/
./*不容許被打斷的執(zhí)行代碼*/
OSSchedUnlockO;/*恢復任務調(diào)度*/
}
OSSchedUnlock()
VoidOSSchedUnlock(void);
所屬文獻調(diào)用者開關量
OS-CORE.C任務或中斷N/A
在調(diào)用了OSSchedLock()函數(shù)后,OSSchedUnlock()函數(shù)恢復任務調(diào)度。
參數(shù)
無
返回值
無
注意/警告
任務調(diào)用了OSSchedLock。函數(shù)后,決不能再調(diào)用也許導致目前任務掛起的系統(tǒng)函數(shù):
OSTimeDly(),OSTimcDlyHMSM(),OSScmPend(),OSMboxPend(),OSQPcnd()。由
于任務調(diào)度已經(jīng)被嚴禁,其他任務不能運行,這會導致系統(tǒng)死鎖。
范例:
voidTaskX(void*pdata)
(
pdata=pdata;
for(;;)(
OSSchedLock();/*停止任務調(diào)度*/
/*不容許被打斷的執(zhí)行代碼*/
OSSchedUnlock();/*恢復任務調(diào)度*/
}
OSSemAccept()
INT16U*OSSemAccept(OS_EVENT*pevent);
所屬文獻調(diào)用者開關量
OS_SEM.C任務或中斷OS_SEM_EN
OSSemAccept()函數(shù)競看設備與否就緒或事件與否發(fā)生,不一樣于OSSemPend()函數(shù),假
如設備沒有就緒,OSSemAccept()函數(shù)并不掛起任務。中斷調(diào)用該函數(shù)來查詢信號量。
參數(shù)
pcvent是指向需要查詢的設備的信號量。當建立信號量時,該指針返回到顧客程序。(參照
OSSemCreate()函數(shù))。
返回值
當調(diào)用OSSemAccept()函數(shù)時,設備信號量的J值不小于零,闡明設備就緒,這個值被返回調(diào)
用者,設備信號量的值減-。假如調(diào)用OSSemAccept()函數(shù)時,設備信號量時值等于零,闡
明設備沒有就緒,返回零。
注意/警告
必須先建立信號量,然后使用.
范例:
OS_EVENT*DispSem;
voidTask(void*pdata)
INT16Uvalue;
pdata=pdata;
for;){
value=OSSemAccept(DispSem);/*查看設備與否就緒或事件與否發(fā)生*/
if(value>0){
/*就緒,執(zhí)行處理代碼*/
OSSemCreate()
OS_EVENT*OSSemCreate(WORDvalue);
所屬文獻調(diào)用者開關量
OS.SEM.C任務或啟動代碼OS_SEM_EN
OSSemCreate()函數(shù)建立并初始化一種信號量。信號量H勺作用如下:
?容許一種任務和其他任務或者中斷同步。
?獲得設備口勺使用權
?標志事件日勺發(fā)生
參數(shù)
value參數(shù)是建立日勺信號量的初始值,可以取0到65535之間H勺任何值。
返回值
OSSemCreate()函數(shù)返回指向分派給所建立日勺消息郵箱的事件控制塊的指針。假如沒有可用時
事件控制塊,OSSemCreate()函數(shù)返回空指針。
注意/警告
必須先建立信號量,然后使用。
范例:
OS_EVENT*DispSem;
voidmain(void)
OSInit();/*初始化UC/OS-H
DispSem=OSSemCreate(1);/*建立顯示設備的信號量
OSStart();/*啟動多任務內(nèi)核*/
}
OSSemPend()
VoidOSSemPend(OS_EVNNT*pevent,INT16Utimeout,int8u*err);
所屬文獻調(diào)用者開關量
OS_SEM.C任務OS_SEM_EN
OSSemPend()函數(shù)用于任務試圖獲得設備的使用權,任務需要和其他任務或中斷同步,任務
需要等待特定事件時發(fā)生的場所。假如任務調(diào)用OSSemPend()函數(shù)時,信號量的I值不小于零,
OSSemPend()函數(shù)遞減該值并返回該值。假如調(diào)用時信號量等于零,OSSemPend()函數(shù)函
數(shù)將任務加入該信號量H勺等待隊列。OSSemPend()函數(shù)掛起目前任務直到其他的任務或中斷
置起信號量或超過等待1ft預期時間。假如在預期的時鐘節(jié)拍內(nèi)信號量被置起,UC/OS-H默認最
高優(yōu)先級H勺任務獲得信號量恢復執(zhí)行。一種被OSTaskSuspend()函數(shù)掛起的任務也可以接受
信號量,但這個任務將一直保持掛起狀態(tài)直到通過調(diào)用OSTaskResumeO函數(shù)恢復任務的運行。
參數(shù)
pevent是指向信號量的指針。該指針時值在建立該信號量時可以得到。(參照OSSemCreate()
函數(shù))。
Timeout容許一種任務在通過了指定數(shù)目的時鐘節(jié)拍后還沒有得到需要的信號量時恢復運行
狀態(tài)。假如該值為零表達任務將持續(xù)日勺等待信號量。最大的等待時間為65535個時鐘節(jié)掃。這
個時間長度并
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 凱里學院《工程化學C》2023-2024學年第二學期期末試卷
- 蘭州理工大學《微機原理與嵌入式系統(tǒng)》2023-2024學年第二學期期末試卷
- 黑龍江幼兒師范高等??茖W?!督ㄖ醪健?023-2024學年第二學期期末試卷
- 青海民族大學《衛(wèi)生統(tǒng)計學C》2023-2024學年第二學期期末試卷
- 山西應用科技學院《光電軟件基礎綜合實踐》2023-2024學年第二學期期末試卷
- 貴州建設職業(yè)技術學院《C程序設計》2023-2024學年第二學期期末試卷
- 麗江師范高等??茖W?!冬F(xiàn)代舞基訓》2023-2024學年第二學期期末試卷
- 哈密職業(yè)技術學院《邏輯電子技術》2023-2024學年第二學期期末試卷
- 臨汾職業(yè)技術學院《創(chuàng)新創(chuàng)業(yè)實踐(二)》2023-2024學年第二學期期末試卷
- 遼寧石化職業(yè)技術學院《Java語言及網(wǎng)絡編程》2023-2024學年第二學期期末試卷
- 2024-2025中國服裝行業(yè)科技創(chuàng)新白皮書
- 道路安全交通課課件
- 眼科住院及手術患者安全
- 數(shù)字化轉(zhuǎn)型對企業(yè)人力資本的影響研究
- 保密基本知識培訓材料范文
- 公開征集招標代理機構(gòu)投標方案(技術方案)
- 信息系統(tǒng)安全等級保護等級測評報告模板【等保2.0】
- 《榮安地產(chǎn)公司財務風險研究與防范研究(定量論文)》8200字
- 【MOOC】理性思維實訓-華南師范大學 中國大學慕課MOOC答案
- (翻譯)UL6A標準中文版-2019版電氣剛性金屬導管-鋁紅黃銅和不銹鋼
- 2024年信息系統(tǒng)項目管理師(綜合知識、案例分析、論文)合卷軟件資格考試(高級)試題與參考答案
評論
0/150
提交評論