【專業(yè)文檔】ucos-ii_api_參考手冊_第1頁
【專業(yè)文檔】ucos-ii_api_參考手冊_第2頁
【專業(yè)文檔】ucos-ii_api_參考手冊_第3頁
【專業(yè)文檔】ucos-ii_api_參考手冊_第4頁
【專業(yè)文檔】ucos-ii_api_參考手冊_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余39頁可下載查看

下載本文檔

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

文檔簡介

1、UCOS-IIAPI參考手冊本章提供了科c/os-n的用戶指南。每一個(gè)用戶可以調(diào)用的內(nèi)核函數(shù)都按字母順序加以說明,包括:函數(shù)的功能描述函數(shù)原型函數(shù)名稱及源代碼函數(shù)使用到的常量函數(shù)參數(shù)函數(shù)返回值特殊說明和注意點(diǎn)OSInit()VoidOSInit(void);所屬文件調(diào)用者開關(guān)量OS_CORE.C啟動(dòng)代碼無OSinit()初始化科C/OS-n,對這個(gè)函數(shù)的調(diào)用必須在調(diào)用OSStart()函數(shù)之前,而OSStart()函數(shù)真正開始運(yùn)行多任務(wù)。參數(shù)無返回值無注意/警告必須先于OSStart()函數(shù)的調(diào)用范例:voidmain(void).OSInit();/*初始化uC/OS-II*/OSStart

2、();/*啟動(dòng)多任務(wù)內(nèi)核*/OSIntEnter()VoidOSIntEnter(void);所屬文件調(diào)用者開關(guān)量OS_CORE.C中斷無OSIntEnter()通知科C/OS-n一個(gè)中斷處理函數(shù)正在執(zhí)行,這有助于科C/OS-n掌握中斷嵌套的情況。OSIntEnter()函數(shù)通常和OSIntExit()函數(shù)聯(lián)合使用。參數(shù)無返回值無注意/警告在任務(wù)級不能調(diào)用該函數(shù)。如果系統(tǒng)使用的處理器能夠執(zhí)行自動(dòng)的獨(dú)立執(zhí)行讀取-修改-寫入的操作,那么就可以直接遞增中斷嵌套層數(shù)(OSIntNesting),這樣可以避免調(diào)用函數(shù)所帶來的額外的開銷。范例一:(Intel80x86的實(shí)模式,在大模式下編譯,realmo

3、de,largemodel)ISRxPROCFARPUSHA;保存中斷現(xiàn)場PUSHESPUSHDS;MOVAX,DGROUP;讀入數(shù)據(jù)段MOVDS,AX;CALLFARPTR_OSIntEnter;通知內(nèi)核進(jìn)入中斷POPDS;恢復(fù)中斷現(xiàn)場POPESPOPAIRET;中斷返回ISRxENDP范例二:(Intel80x86的實(shí)模式,在大模式下編譯,,realmode,largemodel)ISRxPROCFARPUSHA;PUSHESPUSHDS;MOVAX,DGROUP;MOVDS,AX;INCBYTEPTR_OSIntNesting;保存中斷現(xiàn)場讀入數(shù)據(jù)段通知內(nèi)核進(jìn)入中斷POPDS;恢復(fù)中斷現(xiàn)

4、場POPESPOPAIRET;中斷返回ISRxENDPOSIntExit()VoidOSIntExit(void);所屬文件調(diào)用者開關(guān)量OS_CORE.C中斷無OSIntExit()通知pC/OS-n一個(gè)中斷服務(wù)已執(zhí)行完畢,這有助于科C/OS-n掌握中斷嵌套的情況。通常OSIntExit()和OSIntEnter()聯(lián)合使用。當(dāng)最后一層嵌套的中斷執(zhí)行完畢后,如果有更高優(yōu)先級的任務(wù)準(zhǔn)備就緒,WC/OS-n會調(diào)用任務(wù)調(diào)度函數(shù),在這種情況下,中斷返回到更高優(yōu)先級的任務(wù)而不是被中斷了的任務(wù)。參數(shù)無返回值無注意/警告在任務(wù)級不能調(diào)用該函數(shù)。并且即使沒有調(diào)用OSIntEnter()而是使用直接遞增OSIn

5、tNesting的方法,也必須調(diào)用OSIntExit()函數(shù)。范例:(Intel80x86的實(shí)模式,在大模式下編譯,realmode,largemodel)ISRxPROCFARPUSHA;保存中斷現(xiàn)場PUSHESPUSHDS.CALLFARPTR_OSIntExit;通知內(nèi)核進(jìn)入中斷POPDS;恢復(fù)中斷現(xiàn)場POPESPOPAIRET;中斷返回ISRxENDPOSMboxAccept()Void*OSMboxAccept(OS_EVENT*pevent);所屬文件調(diào)用者開關(guān)量OS_MBOX.C任務(wù)或中斷OS_MBOX_ENOSMboxAccept()函數(shù)查看指定的消息郵箱是否有需要的消息。不同

6、于OSMboxPend()函數(shù),如果沒有需要的消息,OSMboxAccept()函數(shù)并不掛起任務(wù)。如果消息已經(jīng)到達(dá),該消息被傳遞到用戶任務(wù)并且從消息郵箱中清除。通常中斷調(diào)用該函數(shù),因?yàn)橹袛嗖辉试S掛起等待消息。參數(shù)pevent是指向需要查看的消息郵箱的指針。當(dāng)建立消息郵箱時(shí),該指針返回到用戶程序。(參考OSMboxCreate()函數(shù))。返回值如果消息已經(jīng)到達(dá),返回指向該消息的指針;如果消息郵箱沒有消息,返回空指針。注意/警告必須先建立消息郵箱,然后使用。范例:OS_EVENT*CommMbox;voidTask(void*pdata)void*msg;pdata=pdata;for(;)msg

7、=OSMboxAccept(CommMbox);/*檢查消息郵箱是否有消息*/if(msg!=(void*)0)./*處理消息*/.else./*沒有消息*/OSMboxCreate()OS_EVENT*OSMboxCreate(void*msg);所屬文件調(diào)用者開關(guān)量OS_MBOX.C任務(wù)或啟動(dòng)代碼OS_MBOX_ENOSMboxCreate()建立并初始化一個(gè)消息郵箱。消息郵箱允許任務(wù)或中斷向其他一個(gè)或幾個(gè)任務(wù)發(fā)送消息。參數(shù)msg參數(shù)用來初始化建立的消息郵箱。如果該指針不為空,建立的消息郵箱將含有消息。返回值如果沒有可用的事件控制塊,返回空指針。指向分配給所建立的消息郵箱的事件控制塊的指針

8、。注意/警告必須先建立消息郵箱,然后使用。范例:OS_EVENT*CommMbox;voidmain(void)OSInit();/*初始化gc/os-n*/OSStart();建立消息郵箱*/啟動(dòng)多任務(wù)內(nèi)核*/CommMbox=OSMboxCreate(void*)0);/*/*OSMboxPend()Void*OSMboxPend(OS_EVNNT*pevent,INT16Utimeout,int8u*err);所屬文件調(diào)用者開關(guān)量OS_MBOX.C任務(wù)OS_MBOX_ENOSMboxPend()用于任務(wù)等待消息。消息通過中斷或另外的任務(wù)發(fā)送給需要的任務(wù)。消息是一個(gè)以指針定義的變量,在不同

9、的程序中消息的使用也可能不同。如果調(diào)用OSMboxPend()函數(shù)時(shí)消息郵箱已經(jīng)存在需要的消息,那么該消息被返回給OSMboxPend()的調(diào)用者,消息郵箱中清除該消息。如果調(diào)用OSMboxPend()函數(shù)時(shí)消息郵箱中沒有需要的消息,OSMboxPend()函數(shù)掛起當(dāng)前任務(wù)直到得到需要的消息或超出定義等待超時(shí)的時(shí)間。如果同時(shí)有多個(gè)任務(wù)等待同一個(gè)消息,科C/OS-n默認(rèn)最高優(yōu)先級的任務(wù)取得消息并且任務(wù)恢復(fù)執(zhí)行。一個(gè)由OSTaskSuspend()函數(shù)掛起的任務(wù)也可以接受消息,但這個(gè)任務(wù)將一直保持掛起狀態(tài)直到通過調(diào)用OSTaskResume()函數(shù)恢復(fù)任務(wù)的運(yùn)行。參數(shù)pevent是指向即將接受消息

10、的消息郵箱的指針。該指針的值在建立該消息郵箱時(shí)可以得到。(參考OSMboxCreate()函數(shù))。Timeout允許一個(gè)任務(wù)在經(jīng)過了指定數(shù)目的時(shí)鐘節(jié)拍后還沒有得到需要的消息時(shí)恢復(fù)運(yùn)行。如果該值為零表示任務(wù)將持續(xù)的等待消息。最大的等待時(shí)間為65,535個(gè)時(shí)鐘節(jié)拍。這個(gè)時(shí)間長度并不是非常嚴(yán)格的,可能存在一個(gè)時(shí)鐘節(jié)拍的誤差,因?yàn)橹挥性谝粋€(gè)時(shí)鐘節(jié)拍結(jié)束后才會減少定義的等待超時(shí)時(shí)鐘節(jié)拍。Err是指向包含錯(cuò)誤碼的變量的指針。OSMboxPend()函數(shù)返回的錯(cuò)誤碼可能為下述幾種:OS_NO_ERR:消息被正確的接受。OS_TIMEOUT:消息沒有在指定的周期數(shù)內(nèi)送到。OS_ERR_PEND_ISR:從中斷

11、調(diào)用該函數(shù)。雖然規(guī)定了不允許從中斷調(diào)用該函數(shù),但科C/OS-n仍然包含了檢測這種情況的功能。OS_ERR_EVENT_TYPE:pevent不是指向消息郵箱的指針。返回值OSMboxPend()函數(shù)返回接受的消息并將*err置為OS_NO_ERR。如果沒有在指定數(shù)目的時(shí)鐘節(jié)拍內(nèi)接受到需要的消息,OSMboxPend()函數(shù)返回空指針并且將*err設(shè)置為OS_TIMEOUT。注意/警告必須先建立消息郵箱,然后使用。不允許從中斷調(diào)用該函數(shù)。范例:OS_EVENT*CommMbox;voidCommTask(void*pdata)INT8Uerr;void*msg;pdata=pdata;for(;

12、).msg=OSMboxPend(CommMbox,10,&err);if(err=OS_NO_ERR)./*消息正確的接受*/.else./*在指定時(shí)間內(nèi)沒有接受到消息*/.OSMboxPost()INT8UOSMboxPost(OS_EVENT*pevent,void*msg);所屬文件調(diào)用者開關(guān)量OS_MBOX.C任務(wù)或中斷OS_MBOX_ENOSMboxPost()函數(shù)通過消息郵箱向任務(wù)發(fā)送消息。消息是一個(gè)指針長度的變量,在不同的程序中消息的使用也可能不同。如果消息郵箱中已經(jīng)存在消息,返回錯(cuò)誤碼說明消息郵箱已滿。OSMboxPost()函數(shù)立即返回調(diào)用者,消息也沒有能夠發(fā)到消息

13、郵箱。如果有任何任務(wù)在等待消息郵箱的消息,最高優(yōu)先級的任務(wù)將得到這個(gè)消息。如果等待消息的任務(wù)優(yōu)先級比發(fā)送消息的任務(wù)優(yōu)先級高,那么高優(yōu)先級的任務(wù)將得到消息而恢復(fù)執(zhí)行,也就是說,發(fā)生了一次任務(wù)切換。參數(shù)pevent是指向即將接受消息的消息郵箱的指針。該指針的值在建立該消息郵箱時(shí)可以得到。(參考OSMboxCreate()函數(shù))。Msg是即將實(shí)際發(fā)送給任務(wù)的消息。消息是一個(gè)指針長度的變量,在不同的程序中消息的使用也可能不同。不允許傳遞一個(gè)空指針,因?yàn)檫@意味著消息郵箱為空。返回值OSMboxPost()函數(shù)的返回值為下述之一:OS_NO_ERR:消息成功的放到消息郵箱中。OS_MBOX_FULL:消息

14、郵箱已經(jīng)包含了其他消息,不空。OS_ERR_EVENT_TYPE:pevent不是指向消息郵箱的指針。注意/警告必須先建立消息郵箱,然后使用。不允許傳遞一個(gè)空指針,因?yàn)檫@意味著消息郵箱為空。范例:OS_EVENT*CommMbox;INT8UCommRxBuf100;voidCommTaskRx(void*pdata)INT8Uerr;pdata=pdata;for(;).err=OSMboxPost(CommMbox,(void*)&CommRxBuf0);OSMboxQuery()INT8UOSMboxQuery(OS_EVENT*pevent,OS_MBOX_DATA*pdata

15、);所屬文件調(diào)用者開關(guān)量OS_MBOX.C任務(wù)或中斷OS_MBOX_ENOSMboxQuery()函數(shù)用來取得消息郵箱的信息。用戶程序必須分配一個(gè)OS_MBOX_DATA的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來從消息郵箱的事件控制塊接受數(shù)據(jù)。通過調(diào)用OSMboxQuery()函數(shù)可以知道任務(wù)是否在等待消息以及有多少個(gè)任務(wù)在等待消息,還可以檢查消息郵箱現(xiàn)在的消息。參數(shù)pevent是指向即將接受消息的消息郵箱的指針。該指針的值在建立該消息郵箱時(shí)可以得到。(參考OSMboxCreate()函數(shù))。Pdata是指向OS_MBOX_DATA數(shù)據(jù)結(jié)構(gòu)的指針,該數(shù)據(jù)結(jié)構(gòu)包含下述成員:Void*OSMsg;/*消息郵箱中消息的

16、復(fù)制*/INT8UOSEventTblOS_EVENT_TBL_SIZE;/*消息郵箱等待隊(duì)列的復(fù)制*/INT8UOSEventGrp;返回值OSMboxQuery()函數(shù)的返回值為下述之一:OS_NO_ERR:調(diào)用成功OS_ERR_EVENT_TYPE:pevent不是指向消息郵箱的指針。注意/警告必須先建立消息郵箱,然后使用。范例:OS_EVENT*CommMbox;voidTask(void*pdata)OS_MBOXDATAmbox_data;INT8Uerr;pdata=pdata;for(;).err=OSMboxQuery(CommMbox,&mbox_data);if(

17、err=OS_NO_ERR)./*如果mbox_data.OSMsg為非空指針,說明消息郵箱非空*/OSMemCreate()OS_MEM*OSMemCreate(void*addr,INT32Unblks,INT32Ublksize,INT8U*err);所屬文件調(diào)用者開關(guān)量OS_MEM.C任務(wù)或初始代碼OS_/MEM_ENOSMemCreate()函數(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需要的內(nèi)存塊的數(shù)目。

18、每一個(gè)內(nèi)存區(qū)最少需要定義兩個(gè)內(nèi)存塊。Blksize每個(gè)內(nèi)存塊的大小,最少應(yīng)該能夠容納一個(gè)指針。Err是指向包含錯(cuò)誤碼的變量的指針。OSMemCreate()函數(shù)返回的錯(cuò)誤碼可能為下述幾種:OS_NO_ERR:成功建立內(nèi)存區(qū)。OS_MEM_INVALID_PART:沒有空閑的內(nèi)存區(qū)。OS_MEM_INVALID_BLKS:沒有為每一個(gè)內(nèi)存區(qū)建立至少兩個(gè)內(nèi)存塊。OS_MEM_INVALID_SIZE:內(nèi)存塊大小不足以容納一個(gè)指針變量。返回值OSMemCreate()函數(shù)返回指向內(nèi)存區(qū)控制塊的指針。如果沒有剩余內(nèi)存區(qū),OSMemCreate()函數(shù)返回空指針。注意/警告必須首先建立內(nèi)存區(qū),然后使用。

19、范例:OS_MEM*CommMem;INT8UCommBuf16128;voidmain(void)INT8Uerr;OSInit();/*初始化gC/OS-n*/.CommMem=OSMemCreate(&CommBuf00,16,128,&err);.OSStart();/*啟動(dòng)多任務(wù)內(nèi)核*/OSMemGet()Void*OSMemGet(OS_MEM*pmem,INT8U*err);所屬文件調(diào)用者開關(guān)量OS_MEM.C任務(wù)或中斷OS_MEM_ENOSMemGet()函數(shù)用于從內(nèi)存區(qū)分配一個(gè)內(nèi)存塊。用戶程序必須知道所建立的內(nèi)存塊的大小,同時(shí)用戶程序必須在使用完內(nèi)存塊后釋放內(nèi)

20、存塊??梢远啻握{(diào)用OSMemGet()函數(shù)。參數(shù)pmem是指向內(nèi)存區(qū)控制塊的指針,可以從OSMemCreate()函數(shù)返回得到。Err是指向包含錯(cuò)誤碼的變量的指針。OSMemGet(函數(shù)返回的錯(cuò)誤碼可能為下述幾種:OS_NO_ERR:成功得到一個(gè)內(nèi)存塊。OS_MEM_NO_FREE_BLKS:內(nèi)存區(qū)已經(jīng)沒有空間分配給內(nèi)存塊。返回值OSMemGet()函數(shù)返回指向內(nèi)存區(qū)塊的指針。如果沒有空間分配給內(nèi)存塊,OSMemGet()函數(shù)返回空指針。注意/警告必須首先建立內(nèi)存區(qū),然后使用。范例:OS_MEM*CommMem;voidTask(void*pdata)INT8U*msg;pdata=pdata

21、;for(;)msg=OSMemGet(CommMem,&err);if(msg!=(INT8U*)0)./*內(nèi)存塊已經(jīng)分配*/.OSMemPut()INT8UOSMemPut(OS_MEM*pmem,void*pblk);所屬文件調(diào)用者開關(guān)量OS_MEM.C任務(wù)或中斷OS_MEM_ENOSMemPut()函數(shù)釋放一個(gè)內(nèi)存塊,內(nèi)存塊必須釋放回原先申請的內(nèi)存區(qū)。參數(shù)pmem是指向內(nèi)存區(qū)控制塊的指針,可以從OSMemCreate()函數(shù)返回得到。Pblk是指向?qū)⒈会尫诺膬?nèi)存塊的指針。返回值OSMemPut()函數(shù)的返回值為下述之一:OS_NO_ERR:成功釋放內(nèi)存塊OS_MEM_FULL:

22、內(nèi)存區(qū)已經(jīng)不能再接受更多釋放的內(nèi)存塊。這種情況說明用戶程序出現(xiàn)了錯(cuò)誤,釋放了多于用OSMemGet()函數(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);

23、所屬文件調(diào)用者開關(guān)量OS_MEM.C任務(wù)或中斷OS_MEM_ENOSMemQuery()函數(shù)得到內(nèi)存區(qū)的信息。該函數(shù)返回OS_MEM結(jié)構(gòu)包含的信息,但使用了一個(gè)新的OS_MEM_DATA的數(shù)據(jù)結(jié)構(gòu)。OS_MEM_DATA數(shù)據(jù)結(jié)構(gòu)還包含了正被使用的內(nèi)存塊數(shù)目的域。參數(shù)pmem是指向內(nèi)存區(qū)控制塊的指針,可以從OSMemCreate()函數(shù)返回得到。Pdata是指向OS_MEM_DATA數(shù)據(jù)結(jié)構(gòu)的指針,該數(shù)據(jù)結(jié)構(gòu)包含了以下的域:VoidOSAddr;/*指向內(nèi)存區(qū)起始地址的指針*/VoidOSFreeList;/*指向空閑內(nèi)存塊列表起始地址的指針*/INT32UOSBlkSize;/*母個(gè)內(nèi)存塊的大

24、小*/INT32UOSNBlks;/*該內(nèi)存區(qū)的內(nèi)存塊總數(shù)*/INT32UOSNFree;/*空閑的內(nèi)存塊數(shù)目*/INT32UOSNUsed;/*使用的內(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)

25、;所屬文件調(diào)用者開關(guān)量OS_Q.C任務(wù)或中斷OS_Q_ENOSQAccept()函數(shù)檢查消息隊(duì)列中是否已經(jīng)有需要的消息。不同于OSQPend()函數(shù),如果沒有需要的消息,OSQAccept()函數(shù)并不掛起任務(wù)。如果消息已經(jīng)到達(dá),該消息被傳遞到用戶任務(wù)。通常中斷調(diào)用該函數(shù),因?yàn)橹袛嗖辉试S掛起等待消息。參數(shù)pevent是指向需要查看的消息隊(duì)列的指針。當(dāng)建立消息隊(duì)列時(shí),該指針返回到用戶程序。(參考OSMboxCreate()函數(shù))。返回值如果消息已經(jīng)到達(dá),返回指向該消息的指針;如果消息隊(duì)列沒有消息,返回空指針。注意/警告必須先建立消息隊(duì)列,然后使用。范例:OS_EVENT*CommQ;voidTas

26、k(void*pdata)void*msg;pdata=pdata;for(;)msg=OSQAccept(CommQ);/*檢查消息隊(duì)列*/if(msg!=(void*)0)./*處理接受的消息*/.else./*沒有消息*/.OSQCreate()OS_EVENT*OSQCreate(void*start,INT8Usize);所屬文件調(diào)用者開關(guān)量OS_Q.C任務(wù)或啟動(dòng)代碼OS_Q_ENOSQCreate()函數(shù)建立一個(gè)消息隊(duì)列。任務(wù)或中斷可以通過消息隊(duì)列向其他一個(gè)或多個(gè)任務(wù)發(fā)送消息。消息的含義是和具體的應(yīng)用密切相關(guān)的。參數(shù)start是消息內(nèi)存區(qū)的基地址,消息內(nèi)存區(qū)是一個(gè)指針數(shù)組。Size

27、是消息內(nèi)存區(qū)的大小。返回值OSQCreate()函數(shù)返回一個(gè)指向消息隊(duì)列事件控制塊的指針。如果沒有空余的事件空閑塊,OSQCreate()函數(shù)返回空指針。注意/警告必須先建立消息隊(duì)列,然后使用。范例:OS_EVENT*CommQ;void*CommMsg10;voidmain(void)OSInit();/*初始化gC/OS-n*/CommQ=OSQCreate(&CommMsg0,10);/*建立消息隊(duì)列*/.OSStart();/*啟動(dòng)多任務(wù)內(nèi)核*/OSQFlush()INT8U*SOQFlush(OS_EVENT*pevent);所屬文件調(diào)用者開關(guān)量OS_Q.C任務(wù)或中斷OS_Q

28、_ENOSQFlush()函數(shù)清空消息隊(duì)列并且忽略發(fā)送往隊(duì)列的所有消息。不管隊(duì)列中是否有消息,這個(gè)函數(shù)的執(zhí)行時(shí)間都是相同的。參數(shù)pevent是指向消息隊(duì)列的指針。該指針的值在建立該隊(duì)列時(shí)可以得到。(參考OSQCreate()函數(shù))。返回值OSQFlush()函數(shù)的返回值為下述之一:OS_NO_ERR:消息隊(duì)歹U被成功清空OS_ERR_EVENT_TYPE:試圖清除不是消息隊(duì)歹U的對象注意/警告必須先建立消息隊(duì)列,然后使用。范例:OS_EVENT*CommQ;voidmain(void)INT8Uerr;OSInit();/*初始化gC/OS-n*/.err=OSQFlush(CommQ);.O

29、SStart();/*啟動(dòng)多任務(wù)內(nèi)核*/OSQPend()Void*OSQPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err);所屬文件調(diào)用者開關(guān)量OS_Q.C任務(wù)OS_Q_ENOSQPend()函數(shù)用于任務(wù)等待消息。消息通過中斷或另外的任務(wù)發(fā)送給需要的任務(wù)。消息是一個(gè)以指針定義的變量,在不同的程序中消息的使用也可能不同。如果調(diào)用OSQPend()函數(shù)時(shí)隊(duì)列中已經(jīng)存在需要的消息,那么該消息被返回給OSQPend()函數(shù)的調(diào)用者,隊(duì)列中清除該消息。如果調(diào)用OSQPend()函數(shù)時(shí)隊(duì)列中沒有需要的消息,OSQPend()函數(shù)掛起當(dāng)前任務(wù)直到得到需要的消息或超出

30、定義的超時(shí)時(shí)間。如果同時(shí)有多個(gè)任務(wù)等待同一個(gè)消息,科C/OS-n默認(rèn)最高優(yōu)先級的任務(wù)取得消息并且任務(wù)恢復(fù)執(zhí)行。一個(gè)由OSTaskSuspend()函數(shù)掛起的任務(wù)也可以接受消息,但這個(gè)任務(wù)將一直保持掛起狀態(tài)直到通過調(diào)用OSTaskResume()函數(shù)恢復(fù)任務(wù)的運(yùn)行。參數(shù)pevent是指向即將接受消息的隊(duì)列的指針。該指針的值在建立該隊(duì)列時(shí)可以得到。(參考OSMboxCreate()函數(shù))。Timeout允許一個(gè)任務(wù)在經(jīng)過了指定數(shù)目的時(shí)鐘節(jié)拍后還沒有得到需要的消息時(shí)恢復(fù)運(yùn)行狀態(tài)。如果該值為零表示任務(wù)將持續(xù)的等待消息。最大的等待時(shí)間為65535個(gè)時(shí)鐘節(jié)拍。這個(gè)時(shí)間長度并不是非常嚴(yán)格的,可能存在一個(gè)時(shí)鐘

31、節(jié)拍的誤差,因?yàn)橹挥性谝粋€(gè)時(shí)鐘節(jié)拍結(jié)束后才會減少定義的等待超時(shí)時(shí)鐘節(jié)拍。Err是指向包含錯(cuò)誤碼的變量的指針。OSQPend()函數(shù)返回的錯(cuò)誤碼可能為下述幾種:OS_NO_ERR:消息被正確的接受。OS_TIMEOUT:消息沒有在指定的周期數(shù)內(nèi)送到。OS_ERR_PEND_ISR:從中斷調(diào)用該函數(shù)。雖然規(guī)定了不允許從中斷調(diào)用該函數(shù),但科C/OS-n仍然包含了檢測這種情況的功能。OS_ERR_EVENT_TYPE:pevent不是指向消息隊(duì)列的指針。返回值OSQPend()函數(shù)返回接受的消息并將*err置為OS_NO_ERR。如果沒有在指定數(shù)目的時(shí)鐘節(jié)拍內(nèi)接受到需要的消息,OSQPend()函數(shù)返

32、回空指針并且將*err設(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)./*在指定時(shí)間內(nèi)接受到消息*/.else./*在指定的時(shí)間內(nèi)沒有接受到指定的消息*/.OSQPost()INT8UOSQPost(OS_EVENT*pevent,void*msg);所屬文件調(diào)用者開關(guān)量OS_Q.C任務(wù)或中斷OS_Q

33、_ENOSQPost()函數(shù)通過消息隊(duì)列向任務(wù)發(fā)送消息。消息是一個(gè)指針長度的變量,在不同的程序中消息的使用也可能不同。如果隊(duì)列中已經(jīng)存滿消息,返回錯(cuò)誤碼。OSQPost()函數(shù)立即返回調(diào)用者,消息也沒有能夠發(fā)到隊(duì)列。如果有任何任務(wù)在等待隊(duì)列中的消息,最高優(yōu)先級的任務(wù)將得到這個(gè)消息。如果等待消息的任務(wù)優(yōu)先級比發(fā)送消息的任務(wù)優(yōu)先級高,那么高優(yōu)先級的任務(wù)將得到消息而恢復(fù)執(zhí)行,也就是說,發(fā)生了一次任務(wù)切換。消息隊(duì)列是先入先出(FIFO)機(jī)制的,先進(jìn)入隊(duì)列的消息先被傳遞給任務(wù)。參數(shù)pevent是指向即將接受消息的消息隊(duì)列的指針。該指針的值在建立該隊(duì)列時(shí)可以得到。(參考OSQCreate()函數(shù))。Msg

34、是即將實(shí)際發(fā)送給任務(wù)的消息。消息是一個(gè)指針長度的變量,在不同的程序中消息的使用也可能不同。不允許傳遞一個(gè)空指針。返回值OSQPost()函數(shù)的返回值為下述之一:OS_NO_ERR:消息成功的放到消息隊(duì)列中。OS_MBOX_FULL:消息隊(duì)列已滿。OS_ERR_EVENT_TYPE:pevent不是指向消息隊(duì)列的指針。注意/警告必須先建立消息隊(duì)列,然后使用。不允許傳遞一個(gè)空指針。范例:OS_EVENT*CommQ;INT8UCommRxBuf100;voidCommTaskRx(void*pdata)INT8Uerr;pdata=pdata;for(;)err=OSQPost(CommQ,(vo

35、id*)&CommRxBuf0);if(err=OS_NO_ERR)./*將消息放入消息隊(duì)列.else./*消息隊(duì)列已滿.*/*/OSQPostFront()INT8UOSQPostFront(OS_EVENT*pevent,void*msg);所屬文件調(diào)用者開關(guān)量OS_Q.C任務(wù)或中斷OS_Q_ENOSQPostFront()函數(shù)通過消息隊(duì)列向任務(wù)發(fā)送消息。OSQPostFront()函數(shù)和OSQPost()函數(shù)非常相似,不同之處在于OSQPostFront()函數(shù)將發(fā)送的消息插到消息隊(duì)列的最前端。也就是說,OSQPostFront()函數(shù)使得消息隊(duì)列按照后入先出(LIFO)的方式工

36、作,而不是先入先出(FIFO)。消息是一個(gè)指針長度的變量,在不同的程序中消息的使用也可能不同。如果隊(duì)列中已經(jīng)存滿消息,返回錯(cuò)誤碼。OSQPost()函數(shù)立即返回調(diào)用者,消息也沒能發(fā)到隊(duì)列。如果有任何任務(wù)在等待隊(duì)列中的消息,最高優(yōu)先級的任務(wù)將得到這個(gè)消息。如果等待消息的任務(wù)優(yōu)先級比發(fā)送消息的任務(wù)優(yōu)先級高,那么高優(yōu)先級的任務(wù)將得到消息而恢復(fù)執(zhí)行,也就是說,發(fā)生了一次任務(wù)切換參數(shù)pevent是指向即將接受消息的消息隊(duì)列的指針。該指針的值在建立該隊(duì)列時(shí)可以得到。(參考OSQCreate()函數(shù))。Msg是即將實(shí)際發(fā)送給任務(wù)的消息。消息是一個(gè)指針長度的變量,在不同的程序中消息的使用也可能不同。不允許傳遞

37、一個(gè)空指針。返回值OSQPost()函數(shù)的返回值為下述之一:OS_NO_ERR:消息成功的放到消息隊(duì)列中。OS_MBOX_FULL:消息隊(duì)列已滿。OS_ERR_EVENT_TYPE:pevent不是指向消息隊(duì)列的指針。注意/警告必須先建立消息隊(duì)列,然后使用。不允許傳遞一個(gè)空指針。范例:OS_EVENT*CommQ;INT8UCommRxBuf100;voidCommTaskRx(void*pdata)INT8Uerr;pdata=pdata;for(;)err=OSQPostFront(CommQ,(void*)&CommRxBuf0);if(err=OS_NO_ERR)./*將消息放

38、入消息隊(duì)列*/else./*消息隊(duì)列已滿*/OSQQuery()INT8UOSQQuery(OS_EVENT*pevent,OS_Q_DATA*pdata);所屬文件調(diào)用者開關(guān)量OS_Q.C任務(wù)或中斷OS_Q_EN該結(jié)構(gòu)用來保存從消息隊(duì)列的事件控制塊得到的數(shù)據(jù)。通過調(diào)用OSQQuery()函數(shù)可以知道OSQQuery。函數(shù)用來取得消息隊(duì)列的信息。用戶程序必須建立一個(gè)OS_Q_DATA的數(shù)據(jù)結(jié)構(gòu),任務(wù)是否在等待消息、有多少個(gè)任務(wù)在等待消息、隊(duì)列中有多少消息以及消息隊(duì)列可以容納的消息數(shù)。OSQQuery()函數(shù)還可以得到即將被傳遞給任務(wù)的消息的信息。參數(shù)pevent是指向即將接受消息的消息郵箱的指

39、針。該指針的值在建立該消息郵箱時(shí)可以得到。Pdata是指向(參考OSQCreate()函數(shù))。返回值OSQQuery()函數(shù)的返回值為下述之一:Void*OSMsg;/*下一個(gè)可用的消息*/INT16UOSNMsgs;/*隊(duì)列中的消息數(shù)目*/INT16UOSQSize;/*消息隊(duì)列的大小*/INT8UOSEventTblOS_EVENT_TBL_SIZE;/*消息隊(duì)列的等待隊(duì)列*/INT8UOSEventGrp;OS_Q_DATA數(shù)據(jù)結(jié)構(gòu)的指針,該數(shù)據(jù)結(jié)構(gòu)包含下述成員:OS_NO_ERR:調(diào)用成功OS_ERR_EVENT_TYPE:pevent不是指向消息隊(duì)列的指針。注意/警告必須先建立消息隊(duì)

40、列,然后使用。范例:OS_EVENT*CommQ;voidTask(void*pdata)OS_Q_DATAqdata;INT8Uerr;pdata=pdata;for(;)err=OSQQuery(CommQ,&qdata);if(err=OS_NO_ERR)./*取得消息隊(duì)列的信息*/OSSchedLock()VoidOSSchedLock(void);所屬文件調(diào)用者開關(guān)量OS_CORE.C任務(wù)或中斷N/AOSSchedLock()函數(shù)停止任務(wù)調(diào)度,只有使用配對的函數(shù)OSSchedUnlock()才能重新開始內(nèi)核的任務(wù)調(diào)度。調(diào)用OSSchedLock()函數(shù)的任務(wù)獨(dú)占CPU,不管有

41、沒有其他高優(yōu)先級的就緒任務(wù)。在這種情況下,中斷仍然可以被接受和執(zhí)行(中斷必須允許)。OSSchedLock()函數(shù)和OSSchedUnlock()函數(shù)必須配對使用??艭/OS-n可以支持多達(dá)254層白OOSSchedLock()函數(shù)嵌套,必須調(diào)用同樣次數(shù)的OSSchedUnlock()函數(shù)才能恢復(fù)任務(wù)調(diào)度。參數(shù)無返回值無注意/警告任務(wù)調(diào)用了OSSchedLock()函數(shù)后,決不能再調(diào)用可能導(dǎo)致當(dāng)前任務(wù)掛起的系統(tǒng)函數(shù):OSTimeDly(),OSTimeDlyHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。因?yàn)槿蝿?wù)調(diào)度已經(jīng)被禁止,其他任務(wù)不能運(yùn)行,這會導(dǎo)致系統(tǒng)

42、死鎖。范例:voidTaskX(void*pdata)pdata=pdata;for(;).停止任務(wù)調(diào)度*/不允許被打斷的執(zhí)行代碼*/恢復(fù)任務(wù)調(diào)度*/OSSchedLock();/*./*.OSSchedUnlock。;/*.OSSchedUnlock()VoidOSSchedUnlock(void);所屬文件調(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)致當(dāng)前任務(wù)掛起的系統(tǒng)函數(shù):OSTimeDly(),OSTimeDl

43、yHMSM(),OSSemPend(),OSMboxPend(),OSQPend()。因?yàn)槿蝿?wù)調(diào)度已經(jīng)被禁止,其他任務(wù)不能運(yùn)行,這會導(dǎo)致系統(tǒng)死鎖。范例:voidTaskX(void*pdata)pdata=pdata;for(;).停止任務(wù)調(diào)度*/不允許被打斷的執(zhí)行代碼*/恢復(fù)任務(wù)調(diào)度*/OSSchedLock();/*./*.OSSchedUnlock();/*OSSemAccept()INT16U*OSSemAccept(OS_EVENT*pevent);所屬文件調(diào)用者開關(guān)量OS_SEM.C任務(wù)或中斷OS_SEM_ENOSSemAccept()函數(shù)查看設(shè)備是否就緒或事件是否發(fā)生。不同于OS

44、SemPend()函數(shù),如果設(shè)備沒有就緒,OSSemAccept()函數(shù)并不掛起任務(wù)。中斷調(diào)用該函數(shù)來查詢信號量。參數(shù)pevent是指向需要查詢的設(shè)備的信號量。當(dāng)建立信號量時(shí),該指針返回到用戶程序。OSSemCreate()函數(shù))。返回值當(dāng)調(diào)用OSSemAccept()函數(shù)時(shí),設(shè)備信號量的值大于零,說明設(shè)備就緒,這個(gè)值被返回調(diào)用者,設(shè)備信號量的值減一。如果調(diào)用OSSemAccept()函數(shù)時(shí),設(shè)備信號量的值等于零,說明設(shè)備沒有就緒,返回零。注意/警告必須先建立信號量,然后使用。范例:OS_EVENT*DispSem;voidTask(void*pdata)INT16Uvalue;pdata=p

45、data;for(;)value=OSSemAccept(DispSem);/*if(value>0)./*.查看設(shè)備是否就緒或事件是否發(fā)生*/就緒,執(zhí)行處理代碼*/OSSemCreate()OS_EVENT*OSSemCreate(WORDvalue);所屬文件調(diào)用者開關(guān)量OS_SEM.C任務(wù)或啟動(dòng)代碼OS_SEM_ENOSSemCreate()函數(shù)建立并初始化一個(gè)信號量。信號量的作用如下:允許一個(gè)任務(wù)和其他任務(wù)或者中斷同步。取得設(shè)備的使用權(quán)標(biāo)志事件的發(fā)生參數(shù)value參數(shù)是建立的信號量的初始值,可以取0到65535之間的任何值。返回值OSSemCreate()函數(shù)返回指向分配給所建立

46、的消息郵箱的事件控制塊的指針。事件控制塊,OSSemCreate()函數(shù)返回空指針。如果沒有可用的注意/警告必須先建立信號量,然后使用。范例:OS_EVENT*DispSem;voidmain(void).OSInit();/*.DispSem=OSSemCreate(1);/*初始化gc/os-n*/建立顯示設(shè)備的信號量*/OSStart();/*啟動(dòng)多任務(wù)內(nèi)核*/OSSemPend()VoidOSSemPend(OS_EVNNT*pevent,INT16Utimeout,int8u*err);所屬文件調(diào)用者開關(guān)量OS_SEM.C任務(wù)OS_SEM_ENOSSemPend()函數(shù)用于任務(wù)試圖取

47、得設(shè)備的使用權(quán),任務(wù)需要和其他任務(wù)或中斷同步,任務(wù)需要等待特定事件的發(fā)生的場合。如果任務(wù)調(diào)用OSSemPend()函數(shù)時(shí),信號量的值大于零,OSSemPend()函數(shù)遞減該值并返回該值。如果調(diào)用時(shí)信號量等于零,OSSemPend()函數(shù)函數(shù)將任務(wù)加入該信號量的等待隊(duì)列。OSSemPend()函數(shù)掛起當(dāng)前任務(wù)直到其他的任務(wù)或中斷置起信號量或超出等待的預(yù)期時(shí)間。如果在預(yù)期的時(shí)鐘節(jié)拍內(nèi)信號量被置起,WC/OS-n默認(rèn)最高優(yōu)先級的任務(wù)取得信號量恢復(fù)執(zhí)行。一個(gè)被OSTaskSuspend()函數(shù)掛起的任務(wù)也可以接受信號量,但這個(gè)任務(wù)將一直保持掛起狀態(tài)直到通過調(diào)用OSTaskResume()函數(shù)恢復(fù)任務(wù)的

48、運(yùn)行。參數(shù)pevent是指向信號量的指針。該指針的值在建立該信號量時(shí)可以得到。(參考OSSemCreate()函數(shù))。Timeout允許一個(gè)任務(wù)在經(jīng)過了指定數(shù)目的時(shí)鐘節(jié)拍后還沒有得到需要的信號量時(shí)恢復(fù)運(yùn)行狀態(tài)。如果該值為零表示任務(wù)將持續(xù)的等待信號量。最大的等待時(shí)間為65535個(gè)時(shí)鐘節(jié)拍。這個(gè)時(shí)間長度并不是非常嚴(yán)格的,可能存在一個(gè)時(shí)鐘節(jié)拍的誤差,因?yàn)橹挥性谝粋€(gè)時(shí)鐘節(jié)拍結(jié)束后才會減少定義的等待超時(shí)時(shí)鐘節(jié)拍。Err是指向包含錯(cuò)誤碼的變量的指針。OSSemPend()函數(shù)返回的錯(cuò)誤碼可能為下述幾種:OS_NO_ERR:信號量不為零。OS_TIMEOUT:信號量沒有在指定的周期數(shù)內(nèi)置起。OS_ERR_P

49、END_ISR:從中斷調(diào)用該函數(shù)。雖然規(guī)定了不允許從中斷調(diào)用該函數(shù),但科C/OS-n仍然包含了檢測這種情況的功能。OS_ERR_EVENT_TYPE:pevent不是指向信號量的指針。返回值注意/警告必須先建立信號量,然后使用。不允許從中斷調(diào)用該函數(shù)。范例:OS_EVENT*DispSem;voidDispTask(void*pdata)INT8Uerr;pdata=pdata;for(;)OSSemPend(DispSem,0,&err);./*只有信號量置起,該任務(wù)才能執(zhí)行*/.OSSemPost()INT8UOSSemPost(OS_EVENT*pevent);所屬文件調(diào)用者開關(guān)

50、量OS_SEM.C任務(wù)或中斷OS_SEM_ENOSSemPost()函數(shù)置起指定的信號量。如果指定的信號量是零或大于零,OSSemPost。函數(shù)遞增該信號量并返回。如果有任何任務(wù)在等待信號量,最高優(yōu)先級的任務(wù)將得到信號量并進(jìn)入就緒狀態(tài)。任務(wù)調(diào)度函數(shù)將進(jìn)行任務(wù)調(diào)度,決定當(dāng)前運(yùn)行的任務(wù)是否仍然為最高優(yōu)先級的就緒狀態(tài)的任務(wù)。參數(shù)pevent是指向信號量的指針。該指針的值在建立該信號量時(shí)可以得到。(參考OSSemCreate()函數(shù))。返回值OSSemPost()函數(shù)的返回值為下述之一:OS_NO_ERR:信號量成功的置起OS_SEM_OVF:信號量的值溢出OS_ERR_EVENT_TYPE:peve

51、nt不是指向信號量的指針。注意/警告必須先建立信號量,然后使用。范例:OS_EVENT*DispSem;voidTaskX(void*pdata)INT8Uerr;pdata=pdata;for(;).err=OSSemPost(DispSem);if(err=OS_NO_ERR)./*信號量置起*/.else./*信號量溢出*/OSSemQuery()INT8UOSSemQuery(OS_EVENT*pevent,OS_SEM_DATA*pdata);所屬文件調(diào)用者開關(guān)量OS_SEM.C任務(wù)或中斷OS_SEM_ENOSSemQuery()函數(shù)用于獲取某個(gè)信號量的信息。使用OSSemQuery

52、()之前,應(yīng)用程序需要先創(chuàng)立類型為OS_SEM_DATA的數(shù)據(jù)結(jié)構(gòu),用來保存從信號量的事件控制塊中取得的數(shù)據(jù)。使用OSSemQuery()可以得知是否有,以及有多少任務(wù)位于信號量的任務(wù)等待隊(duì)列中(通過查詢.OSEventTbl域),還可以獲取信號量的標(biāo)識號碼。OSEventTbl域的大小由語句:#defineconstantOS_ENENT_TBL_SIZE定義(參閱文件uCOS_II.H)。參數(shù)pevent是一個(gè)指向信號量的指針。該指針在信號量建立后返回調(diào)用程序參見OSSemCreat()函數(shù)。Pdata是一個(gè)指向數(shù)據(jù)結(jié)構(gòu)OS_SEM_DATA的指針,該數(shù)據(jù)結(jié)構(gòu)包含下述域:INT16UOSCnt;/*當(dāng)前信號量標(biāo)識號碼*/INT8UOSEventTblOS_EVENT_TBL_SIZE;/*信號量等待隊(duì)歹U*/INT8UOSEventGrp;返回值OSSemQuery()函數(shù)有下述兩個(gè)返回值:OS_NO_ERR表示調(diào)用成功。OS_ERR_EVENT_TYPE表示未向信號量傳遞指針。注意/警告被操作的信號量必須是已經(jīng)建立了的。范例:在本例中,應(yīng)用程序檢查信號量,查找等待隊(duì)列中優(yōu)先級最高的任務(wù)。OS_EVENT*DispSem;voidTask(void*pdata)OS_SEM_DATAsem_data;INT8Uerr;INT

溫馨提示

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

最新文檔

評論

0/150

提交評論