色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 淺析μC/OS-ⅡAPI的設(shè)計思想及實現(xiàn)機(jī)制

          淺析μC/OS-ⅡAPI的設(shè)計思想及實現(xiàn)機(jī)制

          作者: 時間:2012-08-24 來源:網(wǎng)絡(luò) 收藏

          任何一個操作系統(tǒng)都會提供大量的供程序員使用,μⅡ也不例外。由于μⅡ面向的是嵌入式開發(fā),并不要求大而全,所以內(nèi)核提供的也就大多和多任務(wù)息息相關(guān)。本文通過分析μⅡ中提供的來引出μC/OS-Ⅱ中API的設(shè)計思路和。

          本文引用地址:http://cafeforensic.com/article/148546.htm

          API全稱ApplicaTION Programming Interface,中文是應(yīng)用程序編程接口的意思。API是操作系統(tǒng)提供給用戶的一組函數(shù),供用戶在編寫應(yīng)用程序時調(diào)用,可以完成應(yīng)用程序?qū)Σ僮飨到y(tǒng)的各種調(diào)用,包括進(jìn)程調(diào)度、存儲管理、圖形設(shè)備接口及文件管理等。μC/OS-Ⅱ作為一個嵌入式操作系統(tǒng),相對于其他操作系統(tǒng),有很多自己的特色,在設(shè)計思路和上都和一般操作系統(tǒng)有很大的不同。

          1. 簡介

          任何一個操作系統(tǒng)都會提供大量的API供程序員使用,μC/OS-Ⅱ也不例外。由于μC/OS-Ⅱ面向的是嵌入式開發(fā),并不要求大而全,所以內(nèi)核提供的API也就大多和多任務(wù)息息相關(guān)。μC/OS-Ⅱ的API主要分以下幾類:(1)任務(wù)類、(2)消息類、(3)同步類、(4)時間類、(5)臨界區(qū)與事件類等。下面分別從這幾類API分析各自的設(shè)計思路和。

          2. 任務(wù)類API的設(shè)計思路和實現(xiàn)機(jī)制

          μC/OS-Ⅱ可以管理多達(dá)64個任務(wù),并從中保留了四個最高優(yōu)先級和四個最低優(yōu)先級的任務(wù)供自己使用,所以用戶可以使用的只有56個任務(wù)。任務(wù)類API包括如何在用戶的應(yīng)用程序中建立任務(wù)、刪除任務(wù)、改變?nèi)蝿?wù)的優(yōu)先級、掛起和恢復(fù)任務(wù),以及獲得有關(guān)任務(wù)的信息等。

          2.1 建立任務(wù)API

          想讓μC/OS-Ⅱ管理用戶的任務(wù),用戶必須要先建立任務(wù)。用戶可以通過傳遞任務(wù)地址和其它參數(shù)到以下兩個函數(shù)之一來建立任務(wù):OSTaskCreate() 或 OSTaskCreateExt()。

          OSTaskCreate()與μC/OS是向下兼容的,OSTaskCreateExt()是OSTaskCreate()的擴(kuò)展版本,提供了一些附加的功能。用兩個函數(shù)中的任何一個都可以建立任務(wù)。任務(wù)可以在多任務(wù)調(diào)度開始前建立,也可以在其它任務(wù)的執(zhí)行過程中被建立。在開始多任務(wù)調(diào)度(即調(diào)用OSStart())前,用戶必須建立至少一個任務(wù)。任務(wù)不能由中斷服務(wù)程序(ISR)來建立。

          OSTaskCreate()的函數(shù)定義如下。從中可以知道,OSTaskCreate()需要四個參數(shù):task是任務(wù)代碼的指針,pdata是當(dāng)任務(wù)開始執(zhí)行時傳遞給任務(wù)的參數(shù)的指針,ptos是分配給任務(wù)的堆棧的棧頂指針,prio是分配給任務(wù)的優(yōu)先級。

          INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)

          用OSTaskCreateExt()函數(shù)來建立任務(wù)會更加靈活,但會增加一些額外的開銷。

          OSTaskCreateExt()需要九個參數(shù)!前四個參數(shù)(task,pdata,ptos和prio)與OSTaskCreate()的四個參數(shù)完全相同,連先后順序都一樣。這樣做的目的是為了使用戶能夠更容易地將用戶的程序從OSTaskCreate()移植到OSTaskCreateExt()上去。函數(shù)的定義如下:

          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

          有時候刪除任務(wù)是很有必要的。刪除任務(wù),是說任務(wù)將返回并處于休眠狀態(tài),并不是說任務(wù)的代碼被刪除了,只是任務(wù)的代碼不再被μC/OS-Ⅱ調(diào)用。通過調(diào)用OSTaskDel()就可以完成刪除任務(wù)的功能。OSTaskDel()一開始應(yīng)確保用戶所要刪除的任務(wù)并非是空閑任務(wù),因為刪除空閑任務(wù)是不允許的。不過,用戶可以刪除statistic任務(wù)。接著,OSTaskDel()還應(yīng)確保用戶不是在ISR例程中去試圖刪除一個任務(wù),因為這也是不被允許的。調(diào)用此函數(shù)的任務(wù)可以通過指定OS_PRIO_SELF參數(shù)來刪除自己。接下來OSTaskDel()會保證被刪除的任務(wù)是確實存在的。該函數(shù)的入口參數(shù)很簡單,只需要知道要刪除任務(wù)的優(yōu)先級即可。

          INT8U OSTaskDel (INT8U prio)

          2.3 改變?nèi)蝿?wù)優(yōu)先級API

          在用戶建立任務(wù)的時候會分配給任務(wù)一個優(yōu)先級。在程序運(yùn)行期間,用戶可以通過調(diào)用OSTaskChangePrio()來改變?nèi)蝿?wù)的優(yōu)先級。換句話說,就是μC/OS-Ⅱ允許用戶動態(tài)的改變?nèi)蝿?wù)的優(yōu)先級。函數(shù)定義如下:

          INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)

          用戶不能改變空閑任務(wù)的優(yōu)先級,但用戶可以改變調(diào)用本函數(shù)的任務(wù)或者其它任務(wù)的優(yōu)先級。為了改變調(diào)用本函數(shù)的任務(wù)的優(yōu)先級,用戶可以指定該任務(wù)當(dāng)前的優(yōu)先級或OS_PRIO_SELF,OSTaskChangePrio()會決定該任務(wù)的優(yōu)先級。用戶還必須指定任務(wù)的新(即想要的)優(yōu)先級。因為μC/OS-Ⅱ不允許多個任務(wù)具有相同的優(yōu)先級,所以O(shè)STaskChangePrio()需要檢驗新優(yōu)先級是否是合法的(即不存在具有新優(yōu)先級的任務(wù))。如果新優(yōu)先級是合法的,μC/OS-Ⅱ通過將某些東西儲存到OSTCBPrioTbl[newprio]中保留這個優(yōu)先級。如此就使得OSTaskChangePrio()可以重新允許中斷,因為此時其它任務(wù)已經(jīng)不可能建立擁有該優(yōu)先級的任務(wù),也不能通過指定相同的新優(yōu)先級來調(diào)用OSTaskChangePrio()。接下來OSTaskChangePrio()可以預(yù)先計算新優(yōu)先級任務(wù)的OS_TCB中的某些值。而這些值用來將任務(wù)放入就緒表或從該表中移除。

          2.4 掛起任務(wù)和恢復(fù)任務(wù)API

          有時候?qū)⑷蝿?wù)掛起是很有用的。掛起任務(wù)可通過調(diào)用OSTaskSuspend()函數(shù)來完成。被掛起的任務(wù)只能通過調(diào)用OSTaskResume()函數(shù)來恢復(fù)。任務(wù)掛起是一個附加功能。也就是說,如果任務(wù)在被掛起的同時也在等待延時的期滿,那么,掛起操作需要被取消,而任務(wù)繼續(xù)等待延時期滿,并轉(zhuǎn)入就緒狀態(tài)。任務(wù)可以掛起自己或者其它任務(wù)。

          OSTaskSuspend()函數(shù)的函數(shù)定義如下:

          INT8U OSTaskSuspend (INT8U prio)

          恢復(fù)任務(wù)OSTaskResume()函數(shù)定義為:

          INT8U OSTaskResume (INT8U prio)

          被掛起的任務(wù)只有通過調(diào)用OSTaskResume()才能恢復(fù)。因為OSTaskSuspend()不能掛起空閑任務(wù),所以必須得確認(rèn)用戶的應(yīng)用程序不是在恢復(fù)空閑任務(wù)。注意,這個測試也可以確保用戶不是在恢復(fù)優(yōu)先級為OS_PRIO_SELF的任務(wù)(OS_PRIO_SELF被定義為0xFF,它總是比OS_LOWEST_PRIO大)。

          2.5 獲得任務(wù)信息API

          用戶的應(yīng)用程序可以通過調(diào)用OSTaskQuery()來獲得自身或其它應(yīng)用任務(wù)的信息。實際上,OSTaskQuery()獲得的是對應(yīng)任務(wù)的OS_TCB中內(nèi)容的拷貝。用戶能訪問的OS_TCB的數(shù)據(jù)域的多少決定于用戶的應(yīng)用程序的配置(參看OS_CFG.H)。由于μC/OS-Ⅱ是可裁剪的,它只包括那些用戶的應(yīng)用程序所要求的屬性和功能。


          上一頁 1 2 3 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉