




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、OSInit()第11章本章提供了 c/os-n的用戶指南。每一個用戶可以調用的內核函數都按字母順序加 以說明,包括:函數的功能描述函數原型函數名稱及源代碼函數使用到的常量函數參數函數返回值特殊說明和注意點Void OSInit(void);所屬文件調用者開關量OS_CORE.C啟動代碼無OSinit ()初始化科c/os-n,對這個函數的調用必須在調用OSStart ()函數之前,而 OSStart()函數真正開始運行多任務。參數無返回值無注意暗告必須先于OSStart ()函數的調用范例: void main (void) .OSInit(); /*初始化 uC/OS-II */.OSSt
2、art(); /*啟動多任務內核 */OSIntEnter()參考手冊-269Void OSIntEnter (void);所屬文件調用者開關量OS_CORE.C中斷無OSIntEnter ()通知科C/OS- n 一個中斷處理函數正在執行,這有助于科C/OS- n掌握中斷嵌套的情況。OSIntEnter ()函數通常和 OSIntExit ()函數聯合使用。參數無返回值 無注意暗告在任務級不能調用該函數。如果系統使用的處理器能夠執行自動的獨立執行讀取-修改-寫入的操作,那么就可以直接遞增中斷嵌套層數(OSIntNesting ),這樣可以避免調用函數所帶來的額外的開銷。范例一:(Intel
3、80x86 的實模式,在大模式下編譯,real mode , large model)ISRx PROC FARPUSHA;保存中斷現場PUSH ESPUSH DS ;MOV AX, DGROUP ;讀入數據段MOV DS, AX ;CALL FAR PTR _OSIntEnter ;通知內核進入中斷恢復中斷現場中斷返回POP DSPOP ESPOPAIRETISRx ENDP范例二:(Intel 80x86 的實模式,在大模式下編譯,real mode , large model )ISRx PROC FARPUSHA;保存中斷現場PUSHPUSHESDS;MOVMOVAX, DGROUP;
4、DS, AX讀入數據段;INC .BYTE PTR _OSIntNesting ;通知內核進入中斷.POP DS;POP ESPOPAIRET;ISRx ENDP恢復中斷現場中斷返回OSIntExit()Void OSIntExit (void);所屬文件調用者開關量OS_CORE.C中斷無OSIntExit()通知科c/os-n一個中斷服務已執行完畢,這有助于科C/OS-n掌握中斷嵌套的情況。通常OSIntExit ()和OSIntEnter ()聯合使用。當最后一層嵌套的中斷執行完畢后,如果 有更高優先級的任務準備就緒,WC/OS- n會調用任務調度函數,在這種情況下,中斷返回到更高優先級
5、的任務而不是被中斷了的任務。參數無返回值 無注意暗告OSIntEnter ()而是使用直接遞增OSIntNestingreal mode , large model )保存中斷現場在任務級不能調用該函數。并且即使沒有調用 的方法,也必須調用 OSIntExit ()函數。 范例:(Intel 80x86的實模式,在大模式下編譯,ISRx PROC FARPUSHAPUSH ESPUSH DS通知內核進入中斷恢復中斷現場CALL FAR PTR _OSIntExit ;POP DS;POP ESPOPAIRET;中斷返回ISRx ENDPOSMboxAccept()Void *OSMboxAcc
6、ept (OS_EVENT *pevent );所屬文件調用者開關量OS_MBOX.C任務或中斷OS_MBOX_ENOSMboxAccept ()函數查看指定的消息郵箱是否有需要的消息。不同于OSMboxPend ()函數,如果沒有需要的消息,OSMboxAccept ()函數并不掛起任務。如果消息已經到達,該消息被傳遞到用戶任務并且從消息郵箱中清除。通常中斷調用該函數,因為中斷不允許掛起等待消息。參數pevent是指向需要查看的消息郵箱的指針。當建立消息郵箱時,該指針返回到用戶程序。(參考OSMboxCreate ()函數)。返回值如果消息已經到達,返回指向該消息的指針;如果消息郵箱沒有消息
7、,返回空指針。注意暗告必須先建立消息郵箱,然后使用。范例:OS_EVENT *CommMbox;void Task (void *pdata)void *msg;pdata = pdata;for (;) */msg = OSMboxAccept(CommMbox); /*檢查消息郵箱是否有消息if (msg != (void *)0) ./*處理消息*/. else ./*沒有消息*/.OSMboxCreate()OS_EVENT *OSMboxCreate (void *msg );所屬文件調用者開關量OS_MBOX.C任務或啟動代碼OS_MBOX_ENOSMboxCreate ()建立并
8、初始化一個消息郵箱。消息郵箱允許任務或中斷向其他一個或幾個任 務發送消息。參數msg參數用來初始化建立的消息郵箱。如果該指針不為空,建立的消息郵箱將含有消息。返回值指向分配給所建立的消息郵箱的事件控制塊的指針。注意暗告必須先建立消息郵箱,然后使用。范例:OS_EVENT *CommMbox;void main(void).OSInit();/*.CommMbox = OSMboxCreate(void *)0);/*OSStart();/*如果沒有可用的事件控制塊,返回空指針。初始化v c/os- n */建立消息郵箱 */啟動多任務內核*/OSMboxPend()Void *OSMboxPe
9、nd ( OS_EVNNT *pevent, INT16U timeout, int8u *err );所屬文件調用者開關量OS_MBOX.C任務OS_MBOX_ENOSMboxPend ()用于任務等待消息。消息通過中斷或另外的任務發送給需要的任務。消息是一個以指針定義的變量,在不同的程序中消息的使用也可能不同。如果調用OSMboxPend ()函數時消息郵箱已經存在需要的消息,那么該消息被返回給OSMboxPend ()的調用者,消息郵箱中清除該消息。如果調用 OSMboxPend ()函數時消息郵箱中沒有需要的消息,OSMboxPend()函數掛起當前任務直到得到需要的消息或超出定義等待
10、超時的時間。如果同時有多個任務等待同一個消息,科 C/OS-n默認最高優先級的任務取得消息并且任務恢復執行。一個由 OSTaskSuspend ()函數掛起的任務也可以接受消息,但這個任務將一直保持掛起狀態直到通過調用OSTaskResume ()函數恢復任務的運行。參數pevent是指向即將接受消息的消息郵箱的指針。該指針的值在建立該消息郵箱時可以得到。(參考 OSMboxCreate ()函數)。Timeout允許一個任務在經過了指定數目的時鐘節拍后還沒有得到需要的消息時恢復運行。如果該值為零表示任務將持續的等待消息。最大的等待時間為65,535個時鐘節拍。這個時間長度并不是非常嚴格的,可
11、能存在一個時鐘節拍的誤差,因為只有在一個時鐘節拍結束后才會減少 定義的等待超時時鐘節拍。Err是指向包含錯誤碼的變量的指針。OSMboxPend ()函數返回的錯誤碼可能為下述幾種:OS_NO_ERR :消息被正確的接受。OS_TIMEOUT :消息沒有在指定的周期數內送到。OS_ERR_PEND_ISR :從中斷調用該函數。雖然規定了不允許從中斷調用該函數,但科C/OS- n仍然包含了檢測這種情況的功能。OS_ERR_EVENT_TYPE : pevent不是指向消息郵箱的指針。返回值OSMboxPend ()函數返回接受的消息并將*err置為OS_NO_ERR。如果沒有在指定數目的時鐘節拍
12、內接受到需要的消息,OSMboxPend ()函數返回空指針并且將*err設置為OS_TIMEOUT 。注意暗告必須先建立消息郵箱,然后使用。不允許從中斷調用該函數。范例:OS_EVENT *CommMbox;void CommTask(void *pdata)INT8U err;void *msg;pdata = pdata;for (;) . .msg = OSMboxPend(CommMbox, 10, &err);if (err = OS_NO_ERR) ./*消息正確的接受*/. else ./*在指定時間內沒有接受到消息*/. . .OSMboxPost()INT8U OSMbox
13、Post (OS_EVENT *pevent, void *msg );所屬文件調用者開關量OS_MBOX.C任務或中斷OS_MBOX_ENOSMboxPost ()函數通過消息郵箱向任務發送消息。消息是一個指針長度的變量,在不同的程 序中消息的使用也可能不同。如果消息郵箱中已經存在消息,返回錯誤碼說明消息郵箱已滿。OSMboxPost ()函數立即返回調用者,消息也沒有能夠發到消息郵箱。如果有任何任務在等待 消息郵箱的消息,最高優先級的任務將得到這個消息。如果等待消息的任務優先級比發送消息 的任務優先級高,那么高優先級的任務將得到消息而恢復執行,也就是說,發生了一次任務切 換。271-心C/
14、OS-II:實時操作系統內核參數pevent是指向即將接受消息的消息郵箱的指針。該指針的值在建立該消息郵箱時可以得到。(參考 OSMboxCreate ()函數)。Msg是即將實際發送給任務的消息。消息是一個指針長度的變量,在不同的程序中消息的使用 也可能不同。不允許傳遞一個空指針,因為這意味著消息郵箱為空。返回值OSMboxPost ()函數的返回值為下述之一:OS_NO_ERR :消息成功的放到消息郵箱中。OS_MBOX_FULL :消息郵箱已經包含了其他消息,不空。OS_ERR_EVENT_TYPE : pevent不是指向消息郵箱的指針。注意函告必須先建立消息郵箱,然后使用。不允許傳遞
15、一個空指針,因為這意味著消息郵箱為空。參考手冊-279范例:OS_EVENT *CommMbox;INT8U CommRxBuf100;void CommTaskRx(void *pdata) INT8U err;pdata = pdata;for (;) .err = OSMboxPost(CommMbox, (void *)&CommRxBuf0); .OSMboxQuery()INT8U OSMboxQuery (OS_EVENT *pevent, OS_MBOX_DATA *pdata );所屬文件調用者開關量OS_MBOX.C任務或中斷OS_MBOX_ENOSMboxQuery ()
16、函數用來取得消息郵箱的信息。 用戶程序必須分配一個 OS_MBOX_DATA的 數據結構,該結構用來從消息郵箱的事件控制塊接受數據。通過調用OSMboxQuery ()函數可以知道任務是否在等待消息以及有多少個任務在等待消息,還可以檢查消息郵箱現在的消息。參數pevent是指向即將接受消息的消息郵箱的指針。該指針的值在建立該消息郵箱時可以得到。 (參考 OSMboxCreate ()函數)。Pdata 是指向OS_MBOX_DATA數據結構的指針,該數據結構包含下述成員:Void *OSMsg; /*消息郵箱中消息的復制*/INT8U OSEventTblOS_EVENT_TBL_SIZE;/
17、* 消息郵箱等待隊列的復制 */INT8U OSEventGrp ;返回值OSMboxQuery ()函數的返回值為下述之一:OS_NO_ERR :調用成功OS_ERR_EVENT_TYPE : pevent不是指向消息郵箱的指針。注意而告必須先建立消息郵箱,然后使用。范例:OS_EVENT *CommMbox;void Task (void *pdata)OS_MBOXDATA mbox_data;INT8U err;pdata = pdata;for (;) .err = OSMboxQuery(CommMbox, &mbox_data);if (err = OS_NO_ERR) ./*如
18、果mbox_data.OSMsg 為非空指針,說明消息郵箱非空*/ .OSMemCreate()OS_MEM *OSMemCreate( void *addr, INT32U nblks ,INT32U blksize, INT8U *err);所屬文件調用者開關量OS_MEM.C任務或初始代碼OS_/MEM_ENOSMemCreate ()函數建立并初始化一塊內存區。一塊內存區包含指定數目的大小確定的內存 塊。程序可以包含這些內存塊并在用完后釋放回內存區。參數addr 建立的內存區的起始地址。內存區可以使用靜態數組或在初始化時使用malloc ()函數建立。Nblks 需要的內存塊的數目。每
19、一個內存區最少需要定義兩個內存塊。Blksize每個內存塊的大小,最少應該能夠容納一個指針。Err是指向包含錯誤碼的變量的指針。OSMemCreate ()函數返回的錯誤碼可能為下述幾種:OS_NO_ERR :成功建立內存區。OS_MEM_INV ALID_PART :沒有空閑的內存區。OS_MEM_INV ALID_BLKS :沒有為每一個內存區建立至少兩個內存塊。OS_MEM_INV ALID_SIZE :內存塊大小不足以容納一個指針變量。返回值OSMemCreate ()函數返回指向內存區控制塊的指針。如果沒有剩余內存區,OSMemCreate ()函數返回空指針。注意暗告必須首先建立內
20、存區,然后使用。范例:OS_MEM *CommMem; INT8U CommBuf16128;void main(void) INT8U err;OSInit();/*初始化 v C/OS- n */. CommMem = OSMemCreate(&CommBuf00, 16, 128, &err); .OSStart();/*啟動多任務內核*/OSMemGet()Void *OSMemGet(OS_MEM *pmem, INT8U *err);所屬文件調用者開關量OS_MEM.C任務或中斷OS_MEM_ENOSMemGet ()函數用于從內存區分配一個內存塊。用戶程序必須知道所建立的內存塊的
21、大小, 同時用戶程序必須在使用完內存塊后釋放內存塊??梢远啻握{用OSMemGet ()函數。參數pmem 是指向內存區控制塊的指針,可以從 OSMemCreate ()函數返回得到。Err是指向包含錯誤碼的變量的指針。OSMemGet (函數返回的錯誤碼可能為下述幾種:OS_NO_ERR :成功得到一個內存塊。OS_MEM_NO_FREE_BLKS :內存區已經沒有空間分配給內存塊。返回值OSMemGet ()函數返回指向內存區塊的指針。如果沒有空間分配給內存塊,OSMemGet ()函數返回空指針。注意暗告必須首先建立內存區,然后使用。范例:OS_MEM *CommMem;void Task
22、 (void *pdata)INT8U *msg;pdata = pdata;for (;) msg = OSMemGet(CommMem, &err);if (msg != (INT8U *)0) ./*內存塊已經分配*/.OSMemPut()INT8U OSMemPut( OS_MEM *pmem, void *pblk);所屬文件調用者開關量OS_MEM.C任務或中斷OS_MEM_ENOSMemPut ()函數釋放一個內存塊,內存塊必須釋放回原先申請的內存區。參數pmem 是指向內存區控制塊的指針,可以從 OSMemCreate ()函數 返回得到。Pblk是指向將被釋放的內存塊的指針。
23、返回值OSMemPut ()函數的返回值為下述之一:OS_NO_ERR :成功釋放內存塊OS_MEM_FULL :內存區已經不能再接受更多釋放的內存塊。這種情況說明用戶程序出現了錯誤,釋放了多于用 OSMemGet ()函數得到的內存塊。注意暗告必須首先建立內存區,然后使用。內存塊必須釋放回原先申請的內存區。范例:OS_MEM *CommMem;INT8U *CommMsg;void Task (void *pdata) INT8U err;pdata = pdata;for (;) err = OSMemPut(CommMem, (void *)CommMsg);if (err = OS_N
24、O_ERR) ./*釋放內存塊 */.OSMemQuery()INT8U OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);所屬文件調用者開關量OS_MEM.C任務或中斷OS_MEM_ENOSMemQuery ()函數得到內存區的信息。該函數返回 OS_MEM結構包含的信息,但使用了一 個新的OS_MEM_DATA的數據結構。OS_MEM_DATA數據結構還包含了正被使用的內存塊數 目的域。參數pmem 是指向內存區控制塊的指針,可以從 OSMemCreate ()函數 返回得到。Pdata是指向OS_MEM_DA TA數據結構的指針,該數據結構包含了以
25、下的域:VoidOSAddr;/*指向內存區起始地址的指針*/VoidOSFreeList;/*指向空閑內存塊列表起始地址的指針*/INT32UOSBlkSize;/*母個內存塊的大小*/INT32UOSNBlks;/*該內存區的內存塊總數*/INT32UOSNFree;/*空閑的內存塊數目*/INT32UOSNUsed;/*使用的內存塊數目*/返回值OSMemQuery ()函數返回值總是 OS_NO_ERR。注意暗告必須首先建立內存區,然后使用。范例:OS_MEM *CommMem;void Task (void *pdata)INT8U err;OS_MEM_DATA mem_data;
26、pdata = pdata;for (;) err = OSMemQuery(CommMem, &mem_data);OSQAccept()Void *OSQAccept(OS_EVENT *pevent);所屬文件調用者開關量OS Q.C任務或中斷OS Q ENOSQAccept ()函數檢查消息隊列中是否已經有需要的消息。不同于 OSQPend ()函數,如果 沒有需要的消息,OSQAccept ()函數并不掛起任務。如果消息已經到達,該消息被傳遞到用戶任務。通常中斷調用該函數,因為中斷不允許掛起等待消息。參數pevent是指向需要查看的消息隊列的指針。當建立消息隊列時,該指針返回到用戶程
27、序。(參考OSMboxCreate ()函數)。返回值如果消息已經到達,返回指向該消息的指針;如果消息隊列沒有消息,返回空指針。必須先建立消息隊列,然后使用。范例:OS_EVENT *CommQ;void Task (void *pdata) void *msg;pdata = pdata;for (;) msg = OSQAccept(CommQ); /*檢查消息隊列 */if (msg != (void *)0) ./*處理接受的消息*/. else ./*沒有消息*/.OSQCreate()OS_EVENT *OSQCreate( void *start, INT8U size);所屬文
28、件調用者開關量OS_Q.C任務或啟動代碼OS_Q_ENOSQCreate ()函數建立一個消息隊列。任務或中斷可以通過消息隊列向其他一個或多個任務發送消息。消息的含義是和具體的應用密切相關的。參數start 是消息內存區的基地址,消息內存區是一個指針數組。Size是消息內存區的大小。返回值OSQCreate ()函數返回一個指向消息隊列事件控制塊的指針。如果沒有空余的事件空閑塊, OSQCreate ()函數返回空指針。注意暗告必須先建立消息隊列,然后使用。范例:OS_EVENT *CommQ;void *CommMsg10;void main(void)OSInit();/*初始化 v C/
29、OS- n */.OSStart();/*啟動多任務內核 */CommQ = OSQCreate(&CommMsg0, 10);/*建立消息隊列 */OSQFlush()INT8U *SOQFlush (OS_EVENT *pevent );所屬文件調用者開關量OS_Q.C任務或中斷OS_Q_ENOSQFlush ()函數清空消息隊列并且忽略發送往隊列的所有消息。不管隊列中是否有消息,這 個函數的執行時間都是相同的。參數pevent 是指向消息隊列的指針。該指針的值在建立該隊列時可以得到。(參考OSQCreate ()函數)。返回值OSQFlush ()函數的返回值為下述之一:OS_NO_ER
30、R :消息隊歹U被成功清空OS_ERR_EVENT_TYPE :試圖清除不是消息隊歹U的對象 注意於告 必須先建立消息隊列,然后使用。范例:OS_EVENT *CommQ;void main(void) INT8U err;OSInit();/*初始化 v C/OS- n */. err = OSQFlush(CommQ); . OSStart();/*啟動多任務內核 */OSQPend()Void *OSQPend( OS_EVENT *pevent, INT16U timeout, INT8U *err);所屬文件調用者開關量OS_Q.C任務OS_Q_ENOSQPend ()函數用于任務等
31、待消息。消息通過中斷或另外的任務發送給需要的任務。消息是一個以指針定義的變量,在不同的程序中消息的使用也可能不同。如果調用OSQPend ()函數時隊列中已經存在需要的消息,那么該消息被返回給OSQPend ()函數的調用者,隊列中清除該消息。如果調用 OSQPend ()函數時隊列中沒有需要的消息,OSQPend ()函數掛起當前任務直到得到需要的消息或超出定義的超時時間。如果同時有多個任務等待同一個消息,科C/OS-n默認最高優先級的任務取得消息并且任務恢復執行。一個由 OSTaskSuspend ()函數掛起的 任務也可以接受消息,但這個任務將一直保持掛起狀態直到通過調用OSTaskRe
32、sume ()函數恢復任務的運行。參數pevent 是指向即將接受消息的隊列的指針。該指針的值在建立該隊列時可以得到。(參考OSMboxCreate ()函數)。Timeout 允許一個任務在經過了指定數目的時鐘節拍后還沒有得到需要的消息時恢復運行狀態。如果該值為零表示任務將持續的等待消息。最大的等待時間為65535個時鐘節拍。這個時間長度并不是非常嚴格的,可能存在一個時鐘節拍的誤差,因為只有在一個時鐘節拍結束后才 會減少定義的等待超時時鐘節拍。Err是指向包含錯誤碼的變量的指針。OSQPend ()函數返回的錯誤碼可能為下述幾種:OS_NO_ERR :消息被正確的接受。OS_TIMEOUT
33、:消息沒有在指定的周期數內送到。OS_ERR_PEND_ISR :從中斷調用該函數。雖然規定了不允許從中斷調用該函數,但科C/OS- n仍然包含了檢測這種情況的功能。OS_ERR_EVENT_TYPE : pevent不是指向消息隊列的指針。返回值OSQPend ()函數返回接受的消息并將 *err置為OS_NO_ERR。如果沒有在指定數目的時鐘節 拍內接受到需要的消息, OSQPend ()函數返回空指針并且將 *err設置為OS_TIMEOUT 。注意暗告必須先建立消息郵箱,然后使用。不允許從中斷調用該函數。范例:OS_EVENT *CommQ;void CommTask(void *da
34、ta) INT8U err;void *msg;pdata = pdata;for (;) 參考手冊-285msg = OSQPend(CommQ, 100, &err);if (err = OS_NO_ERR) ./*在指定時間內接受到消息*/. else ./*在指定的時間內沒有接受到指定的消息*/.OSQPost()INT8U OSQPost(OS_EVENT *pevent, void *msg);所屬文件調用者開關量OS_Q.C任務或中斷OS_Q_ENOSQPost ()函數通過消息隊列向任務發送消息。消息是一個指針長度的變量,在不同的程序中消息的使用也可能不同。如果隊列中已經存滿消
35、息,返回錯誤碼。OSQPost ()函數立即返回調用者,消息也沒有能夠發到隊列。如果有任何任務在等待隊列中的消息,最高優先級的任 務將得到這個消息。如果等待消息的任務優先級比發送消息的任務優先級高,那么高優先級的任務將得到消息而恢復執行,也就是說,發生了一次任務切換。消息隊列是先入先出(FIFO)機制的,先進入隊列的消息先被傳遞給任務。參數pevent是指向即將接受消息的消息隊列的指針。該指針的值在建立該隊列時可以得到。(參考OSQCreate ()函數)。Msg是即將實際發送給任務的消息。消息是一個指針長度的變量,在不同的程序中消息的使用也可能不同。不允許傳遞一個空指針。返回值OSQPost
36、 ()函數的返回值為下述之一:OS_NO_ERR :消息成功的放到消息隊列中。OS_MBOX_FULL :消息隊列已滿。OS_ERR_EVENT_TYPE : pevent不是指向消息隊列的指針。注意/#告必須先建立消息隊列,然后使用。不允許傳遞一個空指針。范例:OS_EVENT *CommQ;INT8U CommRxBuf100;void CommTaskRx(void *pdata) INT8U err;pdata = pdata;for (;) err = OSQPost(CommQ, (void *)&CommRxBuf0);if (err = OS_NO_ERR) ./*將消息放入消
37、息隊列*/. else ./*消息隊列已滿*/.OSQPostFront()INT8U OSQPostFront(OS_EVENT *pevent, void *msg);所屬文件調用者開關量OS_Q.C任務或中斷OS_Q_ENOSQPostFront ()函數通過消息隊列向任務發送消息。OSQPostFront ()函數和 OSQPost ()函數非常相似,不同之處在于OSQPostFront ()函數將發送的消息插到消息隊列的最前端。也就是說,OSQPostFront ()函數使得消息隊列按照后入先出( LIFO)的方式工作,而不是先入先出(FIFO)。消息是一個指針長度的變量,在不同的程
38、序中消息的使用也可能不同。如果隊列中已經存滿消息,返回錯誤碼。OSQPost ()函數立即返回調用者,消息也沒能發到隊列。如果有任何任務在等待隊列中的消息,最高優先級的任務將得到這個消息。如果等待消息的任務優先級比發送消息的任務優先級高,那么高優先級的任務將得到消息而恢復執行,也就是說,發生了一次任務切換參數pevent是指向即將接受消息的消息隊列的指針。該指針的值在建立該隊列時可以得到。(參考OSQCreate ()函數)。Msg是即將實際發送給任務的消息。消息是一個指針長度的變量,在不同的程序中消息的使用 也可能不同。不允許傳遞一個空指針。返回值OSQPost ()函數的返回值為下述之一:
39、OS_NO_ERR :消息成功的放到消息隊列中。OS_MBOX_FULL :消息隊列已滿。OS_ERR_EVENT_TYPE : pevent不是指向消息隊列的指針。注意函告必須先建立消息隊列,然后使用。不允許傳遞一個空指針。范例:OS_EVENT *CommQ;INT8U CommRxBuf100;void CommTaskRx(void *pdata) INT8U err;pdata = pdata; for (;) .err = OSQPostFront(CommQ, (void *)&CommRxBuf0);if (err = OS_NO_ERR) ./*將消息放入消息隊列 */ el
40、se ./*消息隊列已滿*/OSQQuery()INT8U OSQQuery(OS_EVENT *pevent, OS_Q_DATA *pdata);所屬文件調用者開關量OS_Q.C任務或中斷OS_Q_EN該結構用來保存從消息隊列的事件控制塊得到的數據。通過調用OSQQuery ()函數可以知道OSQQuery。函數用來取得消息隊列的信息。用戶程序必須建立一個 OS_Q_DATA的數據結構,參數pevent(參考任務是否在等待消息、有多少個任務在等待消息、隊列中有多少消息以及消息隊列可以容納的 消息數。OSQQuery ()函數還可以得到即將被傳遞給任務的消息的信息。是指向即將接受消息的消息郵
41、箱的指針。該指針的值在建立該消息郵箱時可以得到。PdataOSQCreate ()函數)。返回值OSQQuery ()函數的返回值為下述之一:Void*OSMsg;/*下一個可用的消息*/INT16UOSNMsgs;/* 隊列中的消息數目*/INT16UOSQSize;/* 消息隊列的大小 */INT8UOSEventTblOS_EVENT_TBL_SIZE;/*消息隊列的等待隊列*/INT8UOSEventGrp;OS_Q_DATA數據結構的指針,該數據結構包含下述成員:是指向OS_NO_ERR :調用成功OS_ERR_EVENT_TYPE : pevent不是指向消息隊列的指針。注意暗告必
42、須先建立消息隊列,然后使用。范例:OS_EVENT *CommQ;void Task (void *pdata)OS_Q_DATA qdata;INT8U err;pdata = pdata;for (;) 參考手冊-#err = OSQQuery(CommQ, &qdata);if (err = OS_NO_ERR) ./*取得消息隊列的信息*/. .OSSchedLock()Void OSSchedLock(void);所屬文件調用者開關量OS_CORE.C任務或中斷N/AOSSchedLock ()函數停止任務調度,只有使用配對的函數 OSSchedUnlock ()才能重新開始 內核的
43、任務調度。調用 OSSchedLock ()函數的任務獨占 CPU,不管有沒有其他高優先級的就 緒任務。在這種情況下,中斷仍然可以被接受和執行(中斷必須允許) 。OSSchedLock ()函數 和OSSchedUnlock ()函數必須配對使用??艭/OS-n可以支持多達 254層白O OSSchedLock ()函數嵌套,必須調用同樣次數的OSSchedUnlock ()函數才能恢復任務調度。參數無返回值無注意暗告任務調用了 OSSchedLock ()函數后,決不能再調用可能導致當前任務掛起的系統函數:OSTimeDly () , OSTimeDlyHMSM () , OSSemPend
44、 () , OSMboxPend () , OSQPend ()。因 為任務調度已經被禁止,其他任務不能運行,這會導致系統死鎖。范例:void TaskX(void *pdata) pdata = pdata;for (;) OSSchedLock(); /*停止任務調度 */./*不允許被打斷的執行代碼*/.OSSchedUnlock(); /*恢復任務調度*/.OSSchedUnlock()Void OSSchedUnlock(void);所屬文件調用者開關量OS_CORE.C任務或中斷N/A在調用了 OSSchedLock ()函數后,OSSchedUnlock ()函數恢復任務調度。參
45、數無 返回值 無注意暗告任務調用了 OSSchedLock ()函數后,決不能再調用可能導致當前任務掛起的系統函數:OSTimeDly () , OSTimeDlyHMSM () , OSSemPend () , OSMboxPend () , OSQPend ()。因 為任務調度已經被禁止,其他任務不能運行,這會導致系統死鎖。范例:void TaskX(void *pdata) pdata = pdata;for C) OSSchedLock(); /*停止任務調度 */*不允許被打斷的執行代碼*/OSSchedUnlock(); /*恢復任務調度 */參考手冊-291OSSemAccept
46、()INT16U *OSSemAccept (OS_EVENT *pevent );所屬文件調用者開關量OS_SEM.C任務或中斷OS_SEM_ENOSSemAccept ()函數查看設備是否就緒或事件是否發生。不同于 OSSemPend ()函數,如果 設備沒有就緒,OSSemAccept ()函數并不掛起任務。中斷調用該函數來查詢信號量。參數pevent是指向需要查詢的設備的信號量。當建立信號量時,該指針返回到用戶程序。OSSemCreate ()函數)。返回值當調用OSSemAccept ()函數時,設備信號量的值大于零,說明設備就緒,這個值被返回調用 者,設備信號量的值減一。如果調用
47、OSSemAccept ()函數時,設備信號量的值等于零,說明 設備沒有就緒,返回零。注意暗告必須先建立信號量,然后使用。范例:OS_EVENT *DispSem;void Task (void *pdata) INT16U value;pdata = pdata;for (;) value = OSSemAccept(DispSem); /* if (value 0) ./*.查看設備是否就緒或事件是否發生*/就緒,執行處理代碼*/OSSemCreate()OS_EVENT *OSSemCreate (WORD value );所屬文件調用者開關量OS_SEM.C任務或啟動代碼OS_SEM_
48、ENOSSemCreate ()函數建立并初始化一個信號量。信號量的作用如下: 允許一個任務和其他任務或者中斷同步。取得設備的使用權標志事件的發生參數value參數是建立的信號量的初始值,可以取 0到65535之間的任何值。返回值如果沒有可用的OSSemCreate ()函數返回指向分配給所建立的消息郵箱的事件控制塊的指針。 事件控制塊,OSSemCreate ()函數返回空指針。注意暗告必須先建立信號量,然后使用。范例:OS_EVENT *DispSem ;void main(void) . . OSInit();/*. . DispSem = OSSemCreate(1); /* . .
49、OSStart();/*初始化v c/os- n */建立顯示設備的信號量*/啟動多任務內核*/OSSemPend()Void OSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err );所屬文件調用者開關量OSSEM.COSSEMENOSSemPend ()函數用于任務試圖取得設備的使用權,任務需要和其他任務或中斷同步,任務 需要等待特定事件的發生的場合。如果任務調用OSSemPend ()函數時,信號量的值大于零,OSSemPend ()函數遞減該值并返回該值。如果調用時信號量等于零,OSSemPend ()函數函數將任務加入該信號
50、量的等待隊列。OSSemPend ()函數掛起當前任務直到其他的任務或中斷置起信號量或超出等待的預期時間。如果在預期的時鐘節拍內信號量被置起,WC/OS- n默認最高優先級的任務取得信號量恢復執行。一個被OSTaskSuspend ()函數掛起的任務也可以接受信號量,但這個任務將一直保持掛起狀態直到通過調用OSTaskResume()函數恢復任務的運行。參數pevent 是指向信號量的指針。 該指針的值在建立該信號量時可以得到。(參考OSSemCreate()函數)。Timeout 允許一個任務在經過了指定數目的時鐘節拍后還沒有得到需要的信號量時恢復運行 狀態。如果該值為零表示任務將持續的等待
51、信號量。最大的等待時間為65535個時鐘節拍。這個時間長度并不是非常嚴格的,可能存在一個時鐘節拍的誤差,因為只有在一個時鐘節拍結束 后才會減少定義的等待超時時鐘節拍。Err是指向包含錯誤碼的變量的指針。OSSemPend ()函數返回的錯誤碼可能為下述幾種:OS_NO_ERR :信號量不為零。OS_TIMEOUT :信號量沒有在指定的周期數內置起。OS_ERR_PEND_ISR :從中斷調用該函數。雖然規定了不允許從中斷調用該函數,但科 C/OS- n仍然包含了檢測這種情況的功能。OS_ERR_EVENT_TYPE : pevent不是指向信號量的指針。返回值注意暗告必須先建立信號量,然后使用
52、。不允許從中斷調用該函數。范例:OS_EVENT *DispSem;void DispTask(void *pdata)INT8U err;pdata = pdata;for (;) .OSSemPend(DispSem, 0, &err);./*只有信號量置起,該任務才能執行*/.OSSemPost()INT8U OSSemPost (OS_EVENT *pevent );所屬文件調用者開關量OS_SEM.C任務或中斷OS_SEM_ENOSSemPost ()函數置起指定的信號量。如果指定的信號量是零或大于零,OSSemPost。函數遞增該信號量并返回。如果有任何任務在等待信號量,最高優先級的任務將得到信號量并進入 就緒狀態。任務調度函數將進行任務調度,決定當前運行的任務是否仍然為最高優先級的就緒 狀態的任務。參數pevent 是指向信號量的指針。 該指針的值在建立該信號量時可以得到。(參考OSSemCreate()函數)。返回值OSSe
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南通市海安縣2025年數學四下期末預測試題含解析
- 云南省怒江市重點中學2024-2025學年高考物理試題模擬題及解析(全國卷Ⅱ)含解析
- 焦作工貿職業學院《中國近代軍事史》2023-2024學年第二學期期末試卷
- 上海工程技術大學《口腔循證醫學》2023-2024學年第二學期期末試卷
- 石家莊工程職業學院《西方文論導讀》2023-2024學年第二學期期末試卷
- 廊坊衛生職業學院《跨境電子商務專業英語》2023-2024學年第二學期期末試卷
- 四川電子機械職業技術學院《英語文學作品漢譯》2023-2024學年第一學期期末試卷
- 江蘇省無錫市北塘區2025年數學四下期末學業質量監測模擬試題含解析
- 連云港職業技術學院《西方哲學史》2023-2024學年第二學期期末試卷
- 江蘇省邗江實驗校2025年初三零模語文試題含解析
- 2021年國家公務員考試行測真題答案及解析
- 人口社會學(第二版) 課件 第八章 婚姻家庭
- 露天礦山邊坡穩定性分析與防治措施
- 農產品質量安全農產品質量安全風險分析
- 25題電控工程師崗位常見面試問題含HR問題考察點及參考回答
- 基于深度學習的文本生成技術
- 新人教版高中英語必修二課文原文及翻譯
- 家長要求學校換老師的申請書
- 生產異常報告單
- 函授小學教育畢業論文-函授小學教育畢業論文題目
- 小升初語文閱讀考點 專題六 寫景狀物類文章閱讀指導 課件 人教統編版
評論
0/150
提交評論