淺析μC/OS-ⅡAPI的設計思想及實(shí)現機制
任何一個(gè)操作系統都會(huì )提供大量的API供程序員使用,μC/OS-Ⅱ也不例外。由于μC/OS-Ⅱ面向的是嵌入式開(kāi)發(fā),并不要求大而全,所以?xún)群颂峁┑?a class="contentlabel" href="http://dyxdggzs.com/news/listbylabel/label/API">API也就大多和多任務(wù)息息相關(guān)。本文通過(guò)分析μC/OS-Ⅱ中提供的API來(lái)引出μC/OS-Ⅱ中API的設計思路和實(shí)現機制。
本文引用地址:http://dyxdggzs.com/article/148546.htmAPI全稱(chēng)ApplicaTION Programming Interface,中文是應用程序編程接口的意思。API是操作系統提供給用戶(hù)的一組函數,供用戶(hù)在編寫(xiě)應用程序時(shí)調用,可以完成應用程序對操作系統的各種調用,包括進(jìn)程調度、存儲管理、圖形設備接口及文件管理等。μC/OS-Ⅱ作為一個(gè)嵌入式操作系統,相對于其他操作系統,有很多自己的特色,在設計思路和實(shí)現機制上都和一般操作系統有很大的不同。
1. 簡(jiǎn)介
任何一個(gè)操作系統都會(huì )提供大量的API供程序員使用,μC/OS-Ⅱ也不例外。由于μC/OS-Ⅱ面向的是嵌入式開(kāi)發(fā),并不要求大而全,所以?xún)群颂峁┑腁PI也就大多和多任務(wù)息息相關(guān)。μC/OS-Ⅱ的API主要分以下幾類(lèi):(1)任務(wù)類(lèi)、(2)消息類(lèi)、(3)同步類(lèi)、(4)時(shí)間類(lèi)、(5)臨界區與事件類(lèi)等。下面分別從這幾類(lèi)API分析各自的設計思路和實(shí)現機制。
2. 任務(wù)類(lèi)API的設計思路和實(shí)現機制
μC/OS-Ⅱ可以管理多達64個(gè)任務(wù),并從中保留了四個(gè)最高優(yōu)先級和四個(gè)最低優(yōu)先級的任務(wù)供自己使用,所以用戶(hù)可以使用的只有56個(gè)任務(wù)。任務(wù)類(lèi)API包括如何在用戶(hù)的應用程序中建立任務(wù)、刪除任務(wù)、改變任務(wù)的優(yōu)先級、掛起和恢復任務(wù),以及獲得有關(guān)任務(wù)的信息等。
2.1 建立任務(wù)API
想讓μC/OS-Ⅱ管理用戶(hù)的任務(wù),用戶(hù)必須要先建立任務(wù)。用戶(hù)可以通過(guò)傳遞任務(wù)地址和其它參數到以下兩個(gè)函數之一來(lái)建立任務(wù):OSTaskCreate() 或 OSTaskCreateExt()。
OSTaskCreate()與μC/OS是向下兼容的,OSTaskCreateExt()是OSTaskCreate()的擴展版本,提供了一些附加的功能。用兩個(gè)函數中的任何一個(gè)都可以建立任務(wù)。任務(wù)可以在多任務(wù)調度開(kāi)始前建立,也可以在其它任務(wù)的執行過(guò)程中被建立。在開(kāi)始多任務(wù)調度(即調用OSStart())前,用戶(hù)必須建立至少一個(gè)任務(wù)。任務(wù)不能由中斷服務(wù)程序(ISR)來(lái)建立。
OSTaskCreate()的函數定義如下。從中可以知道,OSTaskCreate()需要四個(gè)參數:task是任務(wù)代碼的指針,pdata是當任務(wù)開(kāi)始執行時(shí)傳遞給任務(wù)的參數的指針,ptos是分配給任務(wù)的堆棧的棧頂指針,prio是分配給任務(wù)的優(yōu)先級。
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
用OSTaskCreateExt()函數來(lái)建立任務(wù)會(huì )更加靈活,但會(huì )增加一些額外的開(kāi)銷(xiāo)。
OSTaskCreateExt()需要九個(gè)參數!前四個(gè)參數(task,pdata,ptos和prio)與OSTaskCreate()的四個(gè)參數完全相同,連先后順序都一樣。這樣做的目的是為了使用戶(hù)能夠更容易地將用戶(hù)的程序從OSTaskCreate()移植到OSTaskCreateExt()上去。函數的定義如下:
INT8U OSTaskCreateExt (void (*task)(void *pd),
void *pdata,
OS_STK *ptos,
INT8U prio,
INT16U id,
OS_STK *pbos,
INT32U stk_size,
void *pext,
INT16U opt)
2.2 刪除任務(wù)API
有時(shí)候刪除任務(wù)是很有必要的。刪除任務(wù),是說(shuō)任務(wù)將返回并處于休眠狀態(tài),并不是說(shuō)任務(wù)的代碼被刪除了,只是任務(wù)的代碼不再被μC/OS-Ⅱ調用。通過(guò)調用OSTaskDel()就可以完成刪除任務(wù)的功能。OSTaskDel()一開(kāi)始應確保用戶(hù)所要刪除的任務(wù)并非是空閑任務(wù),因為刪除空閑任務(wù)是不允許的。不過(guò),用戶(hù)可以刪除statistic任務(wù)。接著(zhù),OSTaskDel()還應確保用戶(hù)不是在ISR例程中去試圖刪除一個(gè)任務(wù),因為這也是不被允許的。調用此函數的任務(wù)可以通過(guò)指定OS_PRIO_SELF參數來(lái)刪除自己。接下來(lái)OSTaskDel()會(huì )保證被刪除的任務(wù)是確實(shí)存在的。該函數的入口參數很簡(jiǎn)單,只需要知道要刪除任務(wù)的優(yōu)先級即可。
INT8U OSTaskDel (INT8U prio)
2.3 改變任務(wù)優(yōu)先級API
在用戶(hù)建立任務(wù)的時(shí)候會(huì )分配給任務(wù)一個(gè)優(yōu)先級。在程序運行期間,用戶(hù)可以通過(guò)調用OSTaskChangePrio()來(lái)改變任務(wù)的優(yōu)先級。換句話(huà)說(shuō),就是μC/OS-Ⅱ允許用戶(hù)動(dòng)態(tài)的改變任務(wù)的優(yōu)先級。函數定義如下:
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
用戶(hù)不能改變空閑任務(wù)的優(yōu)先級,但用戶(hù)可以改變調用本函數的任務(wù)或者其它任務(wù)的優(yōu)先級。為了改變調用本函數的任務(wù)的優(yōu)先級,用戶(hù)可以指定該任務(wù)當前的優(yōu)先級或OS_PRIO_SELF,OSTaskChangePrio()會(huì )決定該任務(wù)的優(yōu)先級。用戶(hù)還必須指定任務(wù)的新(即想要的)優(yōu)先級。因為μC/OS-Ⅱ不允許多個(gè)任務(wù)具有相同的優(yōu)先級,所以OSTaskChangePrio()需要檢驗新優(yōu)先級是否是合法的(即不存在具有新優(yōu)先級的任務(wù))。如果新優(yōu)先級是合法的,μC/OS-Ⅱ通過(guò)將某些東西儲存到OSTCBPrioTbl[newprio]中保留這個(gè)優(yōu)先級。如此就使得OSTaskChangePrio()可以重新允許中斷,因為此時(shí)其它任務(wù)已經(jīng)不可能建立擁有該優(yōu)先級的任務(wù),也不能通過(guò)指定相同的新優(yōu)先級來(lái)調用OSTaskChangePrio()。接下來(lái)OSTaskChangePrio()可以預先計算新優(yōu)先級任務(wù)的OS_TCB中的某些值。而這些值用來(lái)將任務(wù)放入就緒表或從該表中移除。
2.4 掛起任務(wù)和恢復任務(wù)API
有時(shí)候將任務(wù)掛起是很有用的。掛起任務(wù)可通過(guò)調用OSTaskSuspend()函數來(lái)完成。被掛起的任務(wù)只能通過(guò)調用OSTaskResume()函數來(lái)恢復。任務(wù)掛起是一個(gè)附加功能。也就是說(shuō),如果任務(wù)在被掛起的同時(shí)也在等待延時(shí)的期滿(mǎn),那么,掛起操作需要被取消,而任務(wù)繼續等待延時(shí)期滿(mǎn),并轉入就緒狀態(tài)。任務(wù)可以?huà)炱鹱约夯蛘咂渌蝿?wù)。
OSTaskSuspend()函數的函數定義如下:
INT8U OSTaskSuspend (INT8U prio)
恢復任務(wù)OSTaskResume()函數定義為:
INT8U OSTaskResume (INT8U prio)
被掛起的任務(wù)只有通過(guò)調用OSTaskResume()才能恢復。因為OSTaskSuspend()不能掛起空閑任務(wù),所以必須得確認用戶(hù)的應用程序不是在恢復空閑任務(wù)。注意,這個(gè)測試也可以確保用戶(hù)不是在恢復優(yōu)先級為OS_PRIO_SELF的任務(wù)(OS_PRIO_SELF被定義為0xFF,它總是比OS_LOWEST_PRIO大)。
2.5 獲得任務(wù)信息API
用戶(hù)的應用程序可以通過(guò)調用OSTaskQuery()來(lái)獲得自身或其它應用任務(wù)的信息。實(shí)際上,OSTaskQuery()獲得的是對應任務(wù)的OS_TCB中內容的拷貝。用戶(hù)能訪(fǎng)問(wèn)的OS_TCB的數據域的多少決定于用戶(hù)的應用程序的配置(參看OS_CFG.H)。由于μC/OS-Ⅱ是可裁剪的,它只包括那些用戶(hù)的應用程序所要求的屬性和功能。
評論