a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 淺析μC/OS-ⅡAPI的設計思想及實現機制

淺析μC/OS-ⅡAPI的設計思想及實現機制

作者: 時間:2012-08-24 來源:網絡 收藏

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

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

API全稱ApplicaTION Programming Interface,中文是應用程序編程接口的意思。API是操作系統提供給用戶的一組函數,供用戶在編寫應用程序時調用,可以完成應用程序對操作系統的各種調用,包括進程調度、存儲管理、圖形設備接口及文件管理等。μC/OS-Ⅱ作為一個嵌入式操作系統,相對于其他操作系統,有很多自己的特色,在設計思路和上都和一般操作系統有很大的不同。

1. 簡介

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

2. 任務類API的設計思路和實現機制

μC/OS-Ⅱ可以管理多達64個任務,并從中保留了四個最高優先級和四個最低優先級的任務供自己使用,所以用戶可以使用的只有56個任務。任務類API包括如何在用戶的應用程序中建立任務、刪除任務、改變任務的優先級、掛起和恢復任務,以及獲得有關任務的信息等。

2.1 建立任務API

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

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

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

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

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

OSTaskCreateExt()需要九個參數!前四個參數(task,pdata,ptos和prio)與OSTaskCreate()的四個參數完全相同,連先后順序都一樣。這樣做的目的是為了使用戶能夠更容易地將用戶的程序從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 刪除任務API

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

INT8U OSTaskDel (INT8U prio)

2.3 改變任務優先級API

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

INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)

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

2.4 掛起任務和恢復任務API

有時候將任務掛起是很有用的。掛起任務可通過調用OSTaskSuspend()函數來完成。被掛起的任務只能通過調用OSTaskResume()函數來恢復。任務掛起是一個附加功能。也就是說,如果任務在被掛起的同時也在等待延時的期滿,那么,掛起操作需要被取消,而任務繼續等待延時期滿,并轉入就緒狀態。任務可以掛起自己或者其它任務。

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

INT8U OSTaskSuspend (INT8U prio)

恢復任務OSTaskResume()函數定義為:

INT8U OSTaskResume (INT8U prio)

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

2.5 獲得任務信息API

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


上一頁 1 2 3 下一頁

評論


相關推薦

技術專區

關閉