UCOSIIAPI參考手冊(cè)資料_第1頁
UCOSIIAPI參考手冊(cè)資料_第2頁
UCOSIIAPI參考手冊(cè)資料_第3頁
UCOSIIAPI參考手冊(cè)資料_第4頁
UCOSIIAPI參考手冊(cè)資料_第5頁
已閱讀5頁,還剩96頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

ucos-nAPI參照手冊(cè)

本章提供了uc/os-n的顧客指南。每一種顧客可以調(diào)用II勺內(nèi)核函數(shù)都按字母次序加以闡

明,包括:

?函數(shù)的功能描述

?函數(shù)原型

?函數(shù)名稱及源代碼

?函數(shù)使用到的常量

?函數(shù)參數(shù)

?函數(shù)返回值

?特殊闡明和注意點(diǎn)

OSInit()

VoidOSInit(void);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS.CORE.C啟動(dòng)代碼無

OSinit()初始化uC/OS-I【,對(duì)這個(gè)函數(shù)的J調(diào)用必須在調(diào)用OSStart()函數(shù)之前,而OSStart

O函數(shù)真正開始運(yùn)行多任務(wù)。

參數(shù)

返回值

注意/警告

必須先于OSStan()函數(shù)II勺調(diào)用

范例:

voidmain(void)

(

OSInitO;/*初始化uC/OS-II

OSStartO;/*啟動(dòng)多任務(wù)內(nèi)核*/

OSIntEnter()

VoidOSIntEnter(void);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_CORE.C中斷無

OSIntEnter()告知uC/OS-II一種中斷處理函數(shù)正在執(zhí)行,這有助于uC/OS-II掌握中斷嵌套的

狀況。OSIntEnter()函數(shù)一般和OSIntExit()函數(shù)聯(lián)合使用。

參數(shù)

返回值

注意/警告

在任務(wù)級(jí)不能調(diào)用該函數(shù)。

假如系統(tǒng)使用日勺處理器可以執(zhí)行自動(dòng)口勺獨(dú)立執(zhí)行讀取-修改-寫入的操作,那么就可以直接遞增中

斷嵌套層數(shù)(OSInlNesting),這樣可以防止調(diào)用函數(shù)所帶來的額外的開銷。

范例一:

(Intel80x86的實(shí)模式,在大模式下編譯,,realmode,largemodel)

ISRxPROCFAR

PUSHA;保留中斷現(xiàn)場(chǎng)

PUSHES

PUSHDS

MOVAX,DGROUP;讀入數(shù)據(jù)段

MOVDS,AX

CALLFARPTR_OSIntEnter;告知內(nèi)核進(jìn)入中斷

POPDS;恢旦中斷現(xiàn)場(chǎng)

POPES

POPA

IRET;中斷返回

ISRxENDP

范例二:

(Intel80x86的實(shí)模式,在大模式下編譯,,realmode,largemodel)

ISRxPROCFAR

PUSHAf保留中斷現(xiàn)場(chǎng)

PUSHES

PUSHDS

f

MOVAX,DGROUP;讀入數(shù)據(jù)段

MOVDS,AX

INCBYTEPTR_OSIntNesting;告知內(nèi)核進(jìn)入中斷

POPDS;恢復(fù)中斷現(xiàn)場(chǎng)

POPES

POPA

*

IRETf中斷返回

ISRxENDP

OSIntExit()

VoidOSIntExit(void);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_CORE.C中斷無

OSIntExit()告知uC/OS-H一種中斷服務(wù)已執(zhí)行完畢,這有助于uC/OS-II掌握中斷嵌套的狀

況。一般OSIntExit()和OSIntEnter()聯(lián)合使用。當(dāng)最終一層嵌套的中斷執(zhí)行完畢后,假如

有更高優(yōu)先級(jí)的任務(wù)準(zhǔn)備就緒,UC/OSJI會(huì)調(diào)用任務(wù)調(diào)度函數(shù),在這種狀況下,中斷返回到更

高優(yōu)先級(jí)的任務(wù)而不是被中斷了的任務(wù)。

參數(shù)

返回值

注意/警告

在任務(wù)級(jí)不能調(diào)用該函數(shù)。并且雖然沒有調(diào)用OSIntEnler()而是使用直接遞增OSInlNesling

H勺措施,也必須調(diào)用OSIntExit()函數(shù)。

范例:

(Intel80x86的實(shí)模式,在大模式下編譯,realmode,largemodel)

ISRxPROCFAR

PUSHA;保留中斷現(xiàn)場(chǎng)

PUSHES

PUSHDS

CALLFARPTR_OSIntExit;告知內(nèi)核進(jìn)入中斷

POPDS;恢復(fù)中斷現(xiàn)場(chǎng)

POPES

POPA

IRET;中斷返回

ISRxENDP

OSMboxAccept()

Void*OSMboxAccept(OS-EVENT*pevent);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_MBOX.C任務(wù)或中斷OS_MBOX_EN

OSMboxAccept()函數(shù)查看指定的消息郵箱與否有需要的消息。不一樣于OSMboxPend()函

數(shù),假如沒有需要的消息,OSMboxAccept()函數(shù)并不掛起任務(wù)。假如消息己經(jīng)抵達(dá),該消息

被傳遞到顧客任務(wù)并且從消息郵箱中清除。一般中斷調(diào)用該函數(shù),由于中斷不容許掛起等待消

息。

參數(shù)

pevent是指向需要行看的消息郵箱II勺指針。當(dāng)建立消息郵箱時(shí),該指針返網(wǎng)到顧客程序。(參照

OSMboxCreate()函數(shù))。

返回值

假如消息已經(jīng)抵達(dá),返回指向該消息口勺指針:假如消息郵箱沒有消息,返回空指針。

注意/警告

必須先建立消息郵箱,然后使用。

范例:

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

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_MBOX.C任務(wù)或啟動(dòng)代碼OS_MBOX_EN

OSMboxCreate()建立并初始化一種消息郵箱。消息郵箱容許任務(wù)或中斷向其他一種或幾種任

務(wù)發(fā)送消息。

參數(shù)

msg參數(shù)用來初始化建立小J消息郵箱。假如該指針不為空,建立的消息郵箱將具有消息。

返回值

指向分派給所建立的消息郵箱II勺事件控制塊II勺指針。假如沒有可用的事件控制塊,返回空指針。

注意/警告

必須先建立消息郵箱,然后使用。

范例:

OS_EVENT*CommMbox;

voidmain(void)

OSInitO;/*初始化UC/OS-II*/

CommMbox=OSMboxCreate((void*)0);/*建立消息郵箱*/

OSStart();/*啟動(dòng)多任務(wù)內(nèi)核*/

OSMboxPend()

Void*OSMboxPend(OS_EVNNT*pevent,INT16Utimeout,int8u*err);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_MBOX.C任務(wù)OS_MBOX_EN

OSMboxPend()用于任務(wù)等待消息。消息通過中斷或此外的任務(wù)發(fā)送給需要的任務(wù)。消息是一

種以指針定義的J變量,在不一樣的程序中消息的使用也也許不一樣。假如調(diào)用OSMboxPend()

函數(shù)時(shí)消息郵箱已經(jīng)存在需要日勺消息,那么該消息被返回給OSMboxPend()日勺調(diào)用者,消息

郵箱中清除該消息。假如調(diào)用OSMboxPend。函數(shù)時(shí)消息郵箱中沒有需要日勺消息,OSMboxPend

O函數(shù)掛起目前任務(wù)直到得到需要H勺消息或超過定義等待超時(shí)H勺時(shí)間。假如同步有多種任務(wù)

等待同一種消息,uC/OS-II默認(rèn)最高優(yōu)先級(jí)的任務(wù)獲得消息并且任務(wù)恢復(fù)執(zhí)行。一種由

OSTaskSuspend()函數(shù)掛起的任務(wù)也可以接受消息,但這個(gè)任務(wù)將一直保持掛起狀態(tài)直到通過

調(diào)用OSTaskRcsumc()函數(shù)恢復(fù):任務(wù)的運(yùn)行。

參數(shù)

pevent是指向即將接受消息H勺消息郵箱的指針。該指針的值在建立該消息郵箱時(shí)可以得到。

(參照OSMboxCreate()函數(shù))。

Timeout容許一種任務(wù)在通過了指定數(shù)目日勺時(shí)鐘節(jié)拍后還沒有得到需要的消息時(shí)恢復(fù)運(yùn)行:。假

如該值為零表達(dá)任務(wù)將持續(xù)的等待消息,°最大的等待時(shí)間為65,535個(gè)時(shí)鐘節(jié)拍。這個(gè)時(shí)間長(zhǎng)度

并不是非常嚴(yán)格的,也許存在一種時(shí)鐘節(jié)拍的誤差,由了只有在一種時(shí)鐘節(jié)拍結(jié)束后才會(huì)減少

定義的等待超時(shí)時(shí)鐘節(jié)拍。

Err是指向包括錯(cuò)誤碼H勺變量H勺指針。OSMboxPend()函數(shù)返回的錯(cuò)誤碼也許為下述幾種:

?OS_NO_ERR:消息被對(duì)的口勺接受。

?OS_TIMEOUT:消息沒有在指定H勺周期數(shù)內(nèi)送到。

?OS_ERR_PEND_ISR:從中斷調(diào)用該函數(shù)。雖然規(guī)定了不容許從中斷調(diào)用該函數(shù),但U

C/OS-H仍然包括了檢測(cè)這種狀況的功能。

?OS_ERR_EVENT_TYPE:pevent不是指向消息郵箱的指針。

返回值

OSMboxPend()函數(shù)返回接受的消息并將氣rr置為OS_NO_ERR。假如沒有在指定數(shù)目的時(shí)

鐘節(jié)拍內(nèi)接受到需要的消息,OSMboxPend()函數(shù)返回空指針并且將氣n?設(shè)置為

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

/*消息對(duì)的的接受

}else{

/*在指定期間內(nèi)沒有接受到消息*/

}

}

OSMboxPost()

INT8UOSMboxPost(OS.EVENT*pevent,void*msg);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_MBOX.C任務(wù)或中斷OS_MBOX_EN

OSMboxPost()函數(shù)通過消息郵箱向任務(wù)發(fā)送消息。消息是一種指針長(zhǎng)度H勺變量,在不一樣的

程序中消息的使用也也許不一樣。假如消息郵箱中己經(jīng)存在消息.,返回錯(cuò)誤碼闡明消息郵箱已

滿。OSMboxPost()函數(shù)立即返回調(diào)用者,消息也沒有可以發(fā)到消息郵箱。假如有任何任務(wù)在

等待消息郵箱的消息,最高優(yōu)先級(jí)的任務(wù)將得到這個(gè)消息。假如等待消息H勺任務(wù)優(yōu)先級(jí)比發(fā)送

消息的任務(wù)優(yōu)先級(jí)高,那么高優(yōu)先級(jí)H勺任務(wù)將得到消息而恢復(fù)執(zhí)行,也就是說,發(fā)生了一次任

務(wù)切換。

參數(shù)

pevent是指向即將接受消息的消息郵箱的指針。該指針的值在建立該消息郵箱時(shí)可以得到。

(參照OSMboxCreate()函數(shù))。

Msg是即將實(shí)際發(fā)送給任務(wù)的消息。消息是一種指針長(zhǎng)度口勺變量,在不一樣日勺程序中消息的使

用也也許不一樣。不容許傳遞一種空指針,由于這意味著消息郵箱為空。

返回值

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

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS.MBOX.C任務(wù)或中斷OS_MBOX_EN

OSMboxQuery()函數(shù)用來獲得消息郵箱的信息。顧客程序必須分派一種OS_MBOX_DATAII勺

數(shù)據(jù)構(gòu)造,該構(gòu)造用來從消息郵箱口勺事件控制塊接受數(shù)據(jù),通過調(diào)用OSMboxQuery()函數(shù)可

以懂得任務(wù)與否在等待消息以及有多少個(gè)任務(wù)在等待消息,還可以檢查消息郵箱目前的消息、。

參數(shù)

pevent是指向即將接受消息的消息郵箱的指針。該指針的值在建立該消息郵箱時(shí)可以得至上

(參照OSMboxCreate()函數(shù))。

Pdata是指向OS_MBOX_DATA數(shù)據(jù)構(gòu)造的指針,該數(shù)據(jù)構(gòu)造包括下述組員:

\bid*OSMsg;/*消息郵箱中消息的復(fù)制*/

INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*消息郵箱等待隊(duì)列的復(fù)制*/

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

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_MEM.C任務(wù)或初始代碼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ù)組或在初始化時(shí)使用malloc()函數(shù)

建立。

Nblks需要H勺內(nèi)存塊的數(shù)目。每一種內(nèi)存區(qū)至少需要定義兩個(gè)內(nèi)存塊。

Blksize每個(gè)內(nèi)存塊口勺大小,至少應(yīng)當(dāng)可以容納一種指針。

Err是指向包括錯(cuò)誤碼的變量的指針。OSMemCreate()函數(shù)返回時(shí)錯(cuò)誤碼也許為下述幾種:

OS_NO_ERR:成功建立內(nèi)存區(qū)。

OS_MEMJNV^LID_PART:沒有空閑的內(nèi)存區(qū)。

OS_MEMJNV\LID_BLKS:沒有為每一種內(nèi)存區(qū)建立至少兩個(gè)內(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;/*啟動(dòng)多任務(wù)內(nèi)核*/

}

OSMemGet()

Void*OSMemGet(OS_MEM*pmem,INT8U*err);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_MEM.C任務(wù)或中斷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是指向包括錯(cuò)誤碼的變量日勺指針。OSMemGet(函數(shù)返回的J錯(cuò)誤碼也許為下述幾種:

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

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_MEM.C任務(wù)或中斷OS_MEM_EN

OSMemPut()函數(shù)釋放一種內(nèi)存塊,內(nèi)存塊必須釋放回原先申請(qǐng)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)了錯(cuò)

誤,釋放了多于用OSMemGei()函數(shù)得到日勺內(nèi)存塊。

注意/警告

必須首先建立內(nèi)存區(qū),然后使用。

內(nèi)存塊必須釋放回原先申請(qǐng)的內(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);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_MEM.C任務(wù)或中斷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;/*每個(gè)內(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);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_Q.C任務(wù)或中斷OS_Q_EN

OSQAcccpt()函數(shù)檢查消息隊(duì)列中與否已經(jīng)有需要的J消息。不一樣于OSQPcnd()函數(shù),假

如沒有需要的消息,OSQAccept()函數(shù)并不掛起任務(wù)。假如消息已經(jīng)抵達(dá),該消息被傳遞到

顧客任務(wù)。?般中斷調(diào)用該函數(shù),由于中斷不容許掛起等待消息。

參數(shù)

pcvent是指向需要查看『、J消息隊(duì)列口勺指針。當(dāng)建立消息隊(duì)列時(shí),該指針返回到顧客程序。(參照

OSMboxCreate()函數(shù))。

返回值

假如消息已經(jīng)抵達(dá),返回指向該消息II勺指針;假如消息隊(duì)列沒有消息,返回空指針。

注意/警告

必須先建立消息隊(duì)列,然后使用。

范例:

OS_EVENT*CommQ;

voidTask(void*pdata)

(

void*msg;

pdata=pdata;

for(;;)(

msg=OSQAccept(CommQ);/*檢查消息隊(duì)列*/

if(msg!=(void*)0)(

/*處理接受的消息*/

}else{

/*沒有消息*/

)

}

OSQCreate()

OS.EVENT*OSQCreate(void**start,INT8Usize);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_Q.C任務(wù)或啟動(dòng)代碼OS_Q_EN

OSQCreateO函數(shù)建立一種消息隊(duì)列。任務(wù)或中斷可以通過消息隊(duì)列向其他一種或多種任務(wù)發(fā)

送消息。消息的J含義是和詳細(xì)口勺應(yīng)用親密有關(guān)B勺。

參數(shù)

start是消息內(nèi)存區(qū)時(shí)基地址,消息內(nèi)存區(qū)是一種指針數(shù)組。

Size是消息內(nèi)存區(qū)的大小。

返回值

OSQCreate()函數(shù)返回一種指向消息隊(duì)列事件控制塊向右針。假如沒有空余的事件空閑塊,

OSQCreate()函數(shù)返回空指針。

注意/警告

必須先建立消息隊(duì)列,然后使用。

范例:

OS_EVENT*CommQ;

void*CommMsg[10];

voidmain(void)

OSInit();/*初始化UC/OS?H*/

CommQ=OSQCreate(SCommMsg[0]z10);/*建立消息隊(duì)列

OSStart();/*啟動(dòng)多任務(wù)內(nèi)核

OSQFlush()

INT8U*SOQFlush(OS_EVENT*pevent);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_Q.C任務(wù)或中斷OS_Q_EN

OSQFlush()函數(shù)清空消息隊(duì)列并且忽視發(fā)送往隊(duì)列的所有消息。不管隊(duì)列中與否有消息,這

個(gè)函數(shù)的J執(zhí)行時(shí)間都是相似的I。

參數(shù)

pevent是指向消息隊(duì)列的指針。該指針日勺值在建立該隊(duì)列時(shí)可以得到。(參照OSQCrcale()

函數(shù))。

返回值

OSQFlush()函數(shù)的返回值為下述之一:

?OS_NO_ERR:消息隊(duì)列被成功清空

?OS_ERR_EVENT_TYPE:試圖清除不是消息隊(duì)列的I對(duì)象

注意/警告

必須先建立消息隊(duì)列,然后使用。

范例:

OS_EVENT*CommQ;

voidmain(void)

INT8Uerr;

OSInit();/*初始化UC/OS-H*/

err=OSQFlush(CommQ);

OSStart();/*啟動(dòng)多任務(wù)內(nèi)核

OSQPend()

Void*OSQPend(OS.EVENT*pevent,INT16Utimeout,INT8U*err);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_Q.C任務(wù)OS_Q_EN

OSQPend()函數(shù)用于任務(wù)等待消息.消息通過中斷或此外II勺任務(wù)發(fā)送給需要的任務(wù)。消息是

一種以指針定義口勺變量,在不一樣日勺程序中消息的使用也也許不一樣。假如調(diào)用OSQPend()

函數(shù)時(shí)隊(duì)列中已經(jīng)存在需要的J消息,那么該消息被返回給OSQPend()函數(shù)日勺調(diào)用者,隊(duì)列中

清除該消息。假如調(diào)用OSQPend()函數(shù)時(shí)隊(duì)列中沒有需要的消息,OSQPend()函數(shù)掛起目

前任務(wù)直到得到需要的消息或超過定義的超時(shí)時(shí)間。假如同步有多種任務(wù)等待同一種消息,U

C/OSJI默認(rèn)最高優(yōu)先級(jí)的任務(wù)獲得消息并且任務(wù)恢復(fù)執(zhí)行。一種由OSTaskSuspend()函數(shù)掛

起的任務(wù)也可以接受消息,但這個(gè)任務(wù)將一直保持掛起狀態(tài)直到通過調(diào)用OSTaskResume()函

數(shù)恢愛任務(wù)的運(yùn)行。

參數(shù)

pevent是指向即將接受消息的隊(duì)列的指針。該指針H勺值在建立該隊(duì)列時(shí)可以得到。(參照

OSMboxCreate()函數(shù))。

Timeout容許一種任務(wù)在通過了指定數(shù)FH、J時(shí)鐘節(jié)拍后還沒有得到需要的消息時(shí)恢復(fù)運(yùn)行狀

態(tài)。假如該值為零表達(dá)任務(wù)將持續(xù)時(shí)等待消息。最大的等待時(shí)間為65535個(gè)時(shí)鐘節(jié)拍。這個(gè)時(shí)

間長(zhǎng)度并不是非常嚴(yán)格的,也許存在一種時(shí)鐘節(jié)拍的誤差,由于只有在一種時(shí)鐘節(jié)拍結(jié)束后才

會(huì)減少定義的等待超時(shí)時(shí)鈔節(jié)拍。

Err是指向包括錯(cuò)誤碼H勺變量H勺指針。OSQPend()函數(shù)返回的錯(cuò)誤碼也許為下述幾種:

?OS_NO_ERR:消息被對(duì)的口勺接受。

?OS_TIMEOUT:消息沒有在指定H勺周期數(shù)內(nèi)送到。

?OS_ERR_PEND_ISR:從中斷調(diào)用該函數(shù)。雖然規(guī)定了不容許從中斷調(diào)用該函數(shù),但口

C/OS-H仍然包括了檢測(cè)這種狀況的功能。

?OS_ERR_EVENT_TYPE:pevent不是指向消息隊(duì)列I付指針。

返回值

OSQPend()函數(shù)返回接受的消息并將*err置為OS_NO_ERR。假如沒有在指定數(shù)Fl的I時(shí)鐘節(jié)

拍內(nèi)接受到需要的消息,OSQPend()函數(shù)返回空指針并且將*crr設(shè)置為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{

./*在指定的時(shí)間內(nèi)沒有接受到指定I向消息

OSQPost()

INT8UOSQPost(OS_EVENT*pevent,void*msg);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_Q.C任務(wù)或中斷OS_Q_EN

OSQPost()函數(shù)通過消息隊(duì)列向任務(wù)發(fā)送消息。消息是一種指針長(zhǎng)度H勺變量,在不一樣II勺程

序中消息口勺使用也也許不一樣。假如隊(duì)列中已經(jīng)存滿消息,返回錯(cuò)誤碼。OSQPost()函數(shù)立

即返回調(diào)用者,消息也沒有可以發(fā)到隊(duì)列。假如有任何任務(wù)在等待隊(duì)列中日勺消息,最高優(yōu)先級(jí)

的任務(wù)將得到這個(gè)消息。假如等待消息的任務(wù)優(yōu)先級(jí)比發(fā)送消息時(shí)任務(wù)優(yōu)先級(jí)高,那么高優(yōu)先

級(jí)H勺任務(wù)將得到消息而恢復(fù)執(zhí)行,也就是說,發(fā)生「一次任務(wù)切換。消息隊(duì)列是先入先出(FIFO)

機(jī)制I向,先進(jìn)入隊(duì)列的消息先被傳遞給任務(wù)。

參數(shù)

pevent是指向即將接受消息B勺消息隊(duì)列日勺指針。該指針的值在建立該隊(duì)列時(shí)可.以得到。(參照

OSQCreate()函數(shù)C

Msg是即將實(shí)際發(fā)送給任務(wù)的消息。消息是一種指針長(zhǎng)度口勺變量,在不一樣日勺程序中消息的使

用也也許不一樣。不容許傳遞一種空指針。

返回值

OSQPost()函數(shù)的返回值為下述之一:

?OS_NO_ERR:消息成功日勺放到消息隊(duì)列中。

?OS_MBOX_FULL:消息隊(duì)列已滿。

?OS_ERR_EVENT_TYPE:pevent不是指向消息隊(duì)列II勺指針。

注意/警告

必須先建立消息隊(duì)列,然后使用。

不容許傳遞一種空指針。

范例:

OS_EVENT*CommQ;

INT8UCommRxBuf[103];

voidCommTaskRx(voidxpdata)

(

INT8Uerr;

pdata=pdata;

for;){

err-OSQPost(CommQ,(void*)&CommRxBuf[0]);

if(?rr==OS_NO_ERR){

/*將消息放入消息隊(duì)列*/

}else{

/*消息隊(duì)列已滿*/

}

OSQPostFront()

INT8UOSQPostFront(OS_EVENT*pevent,void*msg);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_Q.C任務(wù)或中斷OS_Q_EN

OSQPostFront()函數(shù)通過消息隊(duì)列向任務(wù)發(fā)送消息。OSQPostFront()函數(shù)和OSQPost()

函數(shù)非常相似,不一樣之處在于OSQPostFront()函數(shù)將發(fā)送口勺消息插到消息隊(duì)列口勺最前端。

也就是說,OSQPostFront()函數(shù)使得消息隊(duì)列按照后入先出(LIFO)的J方式工作,而不是先

入先出(FIFO)。消息是一種指針長(zhǎng)度的變量,在不一樣的程序中消息的使用也也許不一樣。假

如隊(duì)列中已經(jīng)存滿消息,返回錯(cuò)誤碼。OSQPost()函數(shù)立即返回調(diào)用者,消息也沒能發(fā)到隊(duì)

列。假如有任何任務(wù)在等待隊(duì)列中的消息,最高優(yōu)先級(jí)的任務(wù)將得到這個(gè)消息。假如等待消息

的任務(wù)優(yōu)先級(jí)比發(fā)送消息的任務(wù)優(yōu)先級(jí)高,那么高優(yōu)先級(jí)的任務(wù)將得到消息而恢復(fù)執(zhí)行,也就

是說,發(fā)生了一次任務(wù)切換

參數(shù)

pevent是指向即將接受消息H勺消息隊(duì)列H勺指針。該指針時(shí)值在建立該隊(duì)列時(shí)可以得到。(參照

OSQCreate()函數(shù))。

Msg是即將實(shí)際發(fā)送給任務(wù)的消息。消息是一種指針長(zhǎng)度口勺變量,在不一樣的程序中消息的使

用也也許不一樣。不容許傳遞一種空指針。

返回值

OSQPost()函數(shù)的返回值為下述之一:

?OS_NO_ERR:消息成功的放到消息隊(duì)列中。

?OS_MBOX_FULL:消息隊(duì)列已滿。

?OS_ERR_EVENT_TYPE:pcvcnt不是指向消息隊(duì)列出J指針。

注意/警告

必須先建立消息隊(duì)列,然后使用。

不容許傳遞一種空指針飛

范例:

OS_EVENT*CommQ;

INT8UCommRxBuf[103];

voidCommTaskRx(void*pdata)

(

INT8Uerr;

pdata=pdata;

for(;;)(

err=OSQPostFront(CommQ,(void*)&CommR:<Buf[0]);

if(err==OS_NO_ERR){

./*將消息放入消息隊(duì)列*/

}else{

/*消息隊(duì)列已滿*/

)

}

OSuery()

INT8UOSuery(OS_EVENT*pevent,OS_Q_DATA*pdata);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_Q.C任務(wù)或中斷OS_Q_EN

OSueryO函數(shù)用來獲得消息隊(duì)列的信息。顧客程序必須建立一種OS_Q_DATAII勺數(shù)據(jù)構(gòu)造,

該構(gòu)造用來保留從消息隊(duì)到的J事件控制塊得到口勺數(shù)據(jù)。通過調(diào)用OSuery()函數(shù)可以懂得

任務(wù)與否在等待消息、有多少個(gè)任務(wù)在等待消息、隊(duì)列中有多少消息以及消息隊(duì)列可以容納的

消息數(shù)。OSuery()函數(shù)還可以得到即將被傳遞給任務(wù)的消息的信息。

參數(shù)

pevent是指向即將接受消息II勺消息郵箱的指針。該指針的值在建立該消息郵箱時(shí)可以得到。

(參照OSQCreate()函數(shù))。

Pdata是指向OS_Q_DATA數(shù)據(jù)構(gòu)造的指針,該數(shù)據(jù)構(gòu)造包括下述組員:

\bid*()SMsg;/*下一種可用日勺消息*/

INTI6UOSNMsgs;/*隊(duì)列中H勺消息數(shù)目*/

INTI6UOSQSize;/*消息隊(duì)列的大小*/

INT8UOSEventTbl|OS_EVENT_TBL_SIZE1;/*消息隊(duì)列的等待隊(duì)列*/

INTSUOSEvcntGrp;

返回值

OSuery()函數(shù)的返回值為下述之一:

?OS_NO_ERR:調(diào)用成功

?OS_ERR_EVENT_TYPE:pevent不是指向消息隊(duì)列的指針。

注意/警告

必須先建立消息隊(duì)列,然后使用。

范例:

OS_EVENT*CommQ;

voidTask(void*pdata)

(

OS_Q_DATAqdata;

INT8Uerr;

pdata=pdata;

for(;;)(

err-OSuery(CommQ,&qdata);

if(err==OS_NO_ERR){

./*獲得消息隊(duì)列的信息*/

}

OSSchedLock()

VoidOSSchedLock(void);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_CORE.C任務(wù)或中斷N/A

OSSchedLock()函數(shù)停止任務(wù)調(diào)度,只有使用配對(duì)的函數(shù)OSSchedUnbck()才能重新開始

內(nèi)核的任務(wù)調(diào)度。調(diào)用OSSchedLock()函數(shù)的任務(wù)獨(dú)占CPU,不管有無其他高優(yōu)先級(jí)的就緒

任務(wù)。在這種狀況下,中斷仍然可以被接受和執(zhí)行(中斷必須容許)。OSSchedLock()函數(shù)和

OSSchcdUnlock()函數(shù)必須配對(duì)使用??贑/OS-II可以支持多達(dá)254層於JOSSchedLock()函

數(shù)嵌套,必須調(diào)用同樣次數(shù)的OSSchedUnlock()函數(shù)才能恢復(fù)任務(wù)調(diào)度。

參數(shù)

返回值

注意/警告

任務(wù)調(diào)用rOSSchedLock()函數(shù)后,決不能再調(diào)用也許導(dǎo)致目前任務(wù)掛起的系統(tǒng)函數(shù):

OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。由

于任務(wù)調(diào)度已經(jīng)被嚴(yán)禁,其他任務(wù)不能運(yùn)行,這會(huì)導(dǎo)致系統(tǒng)死鎖。

范例:

voidTaskX(void*pdata)

pdata=pdata;

for(;;){

OSSchedLock();/*停止任務(wù)調(diào)度*/

./*不容許被打斷的執(zhí)行代碼*/

OSSchedUnlockO;/*恢復(fù)任務(wù)調(diào)度*/

}

OSSchedUnlock()

VoidOSSchedUnlock(void);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS-CORE.C任務(wù)或中斷N/A

在調(diào)用了OSSchedLock()函數(shù)后,OSSchedUnlock()函數(shù)恢復(fù)任務(wù)調(diào)度。

參數(shù)

返回值

注意/警告

任務(wù)調(diào)用了OSSchedLock。函數(shù)后,決不能再調(diào)用也許導(dǎo)致目前任務(wù)掛起的系統(tǒng)函數(shù):

OSTimeDly(),OSTimcDlyHMSM(),OSScmPend(),OSMboxPend(),OSQPcnd()。由

于任務(wù)調(diào)度已經(jīng)被嚴(yán)禁,其他任務(wù)不能運(yùn)行,這會(huì)導(dǎo)致系統(tǒng)死鎖。

范例:

voidTaskX(void*pdata)

(

pdata=pdata;

for(;;)(

OSSchedLock();/*停止任務(wù)調(diào)度*/

/*不容許被打斷的執(zhí)行代碼*/

OSSchedUnlock();/*恢復(fù)任務(wù)調(diào)度*/

}

OSSemAccept()

INT16U*OSSemAccept(OS_EVENT*pevent);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_SEM.C任務(wù)或中斷OS_SEM_EN

OSSemAccept()函數(shù)競(jìng)看設(shè)備與否就緒或事件與否發(fā)生,不一樣于OSSemPend()函數(shù),假

如設(shè)備沒有就緒,OSSemAccept()函數(shù)并不掛起任務(wù)。中斷調(diào)用該函數(shù)來查詢信號(hào)量。

參數(shù)

pcvent是指向需要查詢的設(shè)備的信號(hào)量。當(dāng)建立信號(hào)量時(shí),該指針返回到顧客程序。(參照

OSSemCreate()函數(shù))。

返回值

當(dāng)調(diào)用OSSemAccept()函數(shù)時(shí),設(shè)備信號(hào)量的J值不小于零,闡明設(shè)備就緒,這個(gè)值被返回調(diào)

用者,設(shè)備信號(hào)量的值減-。假如調(diào)用OSSemAccept()函數(shù)時(shí),設(shè)備信號(hào)量時(shí)值等于零,闡

明設(shè)備沒有就緒,返回零。

注意/警告

必須先建立信號(hào)量,然后使用.

范例:

OS_EVENT*DispSem;

voidTask(void*pdata)

INT16Uvalue;

pdata=pdata;

for;){

value=OSSemAccept(DispSem);/*查看設(shè)備與否就緒或事件與否發(fā)生*/

if(value>0){

/*就緒,執(zhí)行處理代碼*/

OSSemCreate()

OS_EVENT*OSSemCreate(WORDvalue);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS.SEM.C任務(wù)或啟動(dòng)代碼OS_SEM_EN

OSSemCreate()函數(shù)建立并初始化一種信號(hào)量。信號(hào)量H勺作用如下:

?容許一種任務(wù)和其他任務(wù)或者中斷同步。

?獲得設(shè)備口勺使用權(quán)

?標(biāo)志事件日勺發(fā)生

參數(shù)

value參數(shù)是建立日勺信號(hào)量的初始值,可以取0到65535之間H勺任何值。

返回值

OSSemCreate()函數(shù)返回指向分派給所建立日勺消息郵箱的事件控制塊的指針。假如沒有可用時(shí)

事件控制塊,OSSemCreate()函數(shù)返回空指針。

注意/警告

必須先建立信號(hào)量,然后使用。

范例:

OS_EVENT*DispSem;

voidmain(void)

OSInit();/*初始化UC/OS-H

DispSem=OSSemCreate(1);/*建立顯示設(shè)備的信號(hào)量

OSStart();/*啟動(dòng)多任務(wù)內(nèi)核*/

}

OSSemPend()

VoidOSSemPend(OS_EVNNT*pevent,INT16Utimeout,int8u*err);

所屬文獻(xiàn)調(diào)用者開關(guān)量

OS_SEM.C任務(wù)OS_SEM_EN

OSSemPend()函數(shù)用于任務(wù)試圖獲得設(shè)備的使用權(quán),任務(wù)需要和其他任務(wù)或中斷同步,任務(wù)

需要等待特定事件時(shí)發(fā)生的場(chǎng)所。假如任務(wù)調(diào)用OSSemPend()函數(shù)時(shí),信號(hào)量的I值不小于零,

OSSemPend()函數(shù)遞減該值并返回該值。假如調(diào)用時(shí)信號(hào)量等于零,OSSemPend()函數(shù)函

數(shù)將任務(wù)加入該信號(hào)量H勺等待隊(duì)列。OSSemPend()函數(shù)掛起目前任務(wù)直到其他的任務(wù)或中斷

置起信號(hào)量或超過等待1ft預(yù)期時(shí)間。假如在預(yù)期的時(shí)鐘節(jié)拍內(nèi)信號(hào)量被置起,UC/OS-H默認(rèn)最

高優(yōu)先級(jí)H勺任務(wù)獲得信號(hào)量恢復(fù)執(zhí)行。一種被OSTaskSuspend()函數(shù)掛起的任務(wù)也可以接受

信號(hào)量,但這個(gè)任務(wù)將一直保持掛起狀態(tài)直到通過調(diào)用OSTaskResumeO函數(shù)恢復(fù)任務(wù)的運(yùn)行。

參數(shù)

pevent是指向信號(hào)量的指針。該指針時(shí)值在建立該信號(hào)量時(shí)可以得到。(參照OSSemCreate()

函數(shù))。

Timeout容許一種任務(wù)在通過了指定數(shù)目的時(shí)鐘節(jié)拍后還沒有得到需要的信號(hào)量時(shí)恢復(fù)運(yùn)行

狀態(tài)。假如該值為零表達(dá)任務(wù)將持續(xù)日勺等待信號(hào)量。最大的等待時(shí)間為65535個(gè)時(shí)鐘節(jié)掃。這

個(gè)時(shí)間長(zhǎng)度并

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論