新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > μC/OS-II的內核結構

μC/OS-II的內核結構

作者: 時間:2016-10-08 來源:網(wǎng)絡 收藏

μC/OS-Ⅱ是怎樣處理臨界段代碼的;

本文引用地址:http://www.2s4d.com/article/201610/305744.htm

什么是任務,怎樣把用戶的任務交給μC/OS-Ⅱ;

任務是怎樣調度的;

應用程序CPU的利用率是多少,μC/OS-Ⅱ是怎樣知道的;

怎樣寫中斷服務子程序;

什么是時鐘節(jié)拍,μC/OS-Ⅱ是怎樣處理時鐘節(jié)拍的;

μC/OS-Ⅱ是怎樣初始化的,以及

怎樣啟動多任務;

本章還描述以下函數(shù),這些服務于應用程序:

OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL(),

OSInit(),

OSSTart(),

OSIntEnter() 和 OSIntExit(),

OSSchedLock() 和 OSSchedUnlock(), 以及

OSVersiON().

3.0 臨界段(CriticalSections)

和其它內核一樣,μC/OS-Ⅱ為了處理臨界段代碼需要關中斷,處理完畢后再開中斷。這使得μC/OS-Ⅱ能夠避免同時有其它任務或中斷服務進入臨界段代碼。關中斷的時間是實時內核開發(fā)商應提供的最重要的指標之一,因為這個指標影響用戶系統(tǒng)對實時事件的響應性。μC/OS-Ⅱ努力使關中斷時間降至最短,但就使用μC/OS-Ⅱ而言,關中斷的時間很大程度上取決于微處理器的架構以及編譯器所生成的代碼質量。

微處理器一般都有關中斷/開中斷指令,用戶使用的C語言編譯器必須有某種機制能夠在C中直接實現(xiàn)關中斷/開中斷地操作。某些C編譯器允許在用戶的C源代碼中插入?yún)R編語言的語句。這使得插入微處理器指令來關中斷/開中斷很容易實現(xiàn)。而有的編譯器把從C語言中關中斷/開中斷放在語言的擴展部分。μC/OS-Ⅱ定義兩個宏(macros)來關中斷和開中斷,以便避開不同C編譯器廠商選擇不同的方法來處理關中斷和開中斷。μC/OS-Ⅱ中的這兩個宏調用分別是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。因為這兩個宏的定義取決于所用的微處理器,故在文件OS_CPU.H中可以找到相應宏定義。每種微處理器都有自己的OS_CPU.H文件。

3.1 任務

一個任務通常是一個無限的循環(huán)[L3.1(2)],如程序清單3.1所示。一個任務看起來像其它C的函數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變量,但是任務是絕不會返回的。故返回參數(shù)必須定義成void[L3.1(1)]。

程序清單L3.1任務是一個無限循環(huán)

voidYourTask(void*pdata)(1)

{

for(;;){(2)

/* 用戶代碼 */

調用uC/OS-II的某種系統(tǒng)服務:

OSMboxPend();

OSQPend();

OSSemPend();

OSTaskDel(OS_PRIO_SELF);

OSTaskSuspend(OS_PRIO_SELF);

OSTimeDly();

OSTimeDlyHMSM();

/* 用戶代碼 */

}

}

不同的是,當任務完成以后,任務可以自我刪除,如清單L3.2所示。注意任務代碼并非真的刪除了,μC/OS-Ⅱ只是簡單地不再理會這個任務了,這個任務的代碼也不會再運行,如果任務調用了OSTaskDel(),這個任務絕不會返回什么。

程序清單 L3.2. 任務完成后自我刪除

voidYourTask(void*pdata)

{

/* 用戶代碼 */

OSTaskDel(OS_PRIO_SELF);

}

形式參數(shù)變量[L3.1(1)]是由用戶代碼在第一次執(zhí)行的時候帶入的。請注意,該變量的類型是一個指向void的指針。這是為了允許用戶應用程序傳遞任何類型的數(shù)據(jù)給任務。這個指針好比一輛萬能的車子,如果需要的話,可以運載一個變量的地址,或一個結構,甚至是一個函數(shù)的地址。也可以建立許多相同的任務,所有任務都使用同一個函數(shù)(或者說是同一個任務代碼程序),見第一章的例1。例如,用戶可以將四個串行口安排成每個串行口都是一個單獨的任務,而每個任務的代碼實際上是相同的。并不需要將代碼復制四次,用戶可以建立一個任務,向這個任務傳入一個指向某數(shù)據(jù)結構的指針變量,這個數(shù)據(jù)結構定義串行口的參數(shù)(波特率、I/O口地址、中斷向量號等)。

μC/OS-Ⅱ可以管理多達64個任務,但目前版本的μC/OS-Ⅱ有兩個任務已經(jīng)被系統(tǒng)占用了。作者保留了優(yōu)先級為0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0這8個任務以被將來使用。OS_LOWEST_PRI0是作為定義的常數(shù)在OS_CFG.H文件中用定義常數(shù)語句#defineconstant定義的。因此用戶可以有多達56個應用任務。必須給每個任務賦以不同的優(yōu)先級,優(yōu)先級可以從0到OS_LOWEST_PR10-2。優(yōu)先級號越低,任務的優(yōu)先級越高。μC/OS-Ⅱ總是運行進入就緒態(tài)的優(yōu)先級最高的任務。目前版本的μC/OS-Ⅱ中,任務的優(yōu)先級號就是任務編號(ID)。優(yōu)先級號(或任務的ID號)也被一些內核服務函數(shù)調用,如改變優(yōu)先級函數(shù)OSTaskChangePrio(),以及任務刪除函數(shù)OSTaskDel()。

為了使μC/OS-Ⅱ能管理用戶任務,用戶必須在建立一個任務的時候,將任務的起始地址與其它參數(shù)一起傳給下面兩個函數(shù)中的一個:OSTastCreat或OSTaskCreatExt()。

OSTaskCreateExt()是OSTaskCreate()的擴展,擴展了一些附加的功能。,這兩個函數(shù)的解釋見第四章,任務管理。

3.2 任務狀態(tài)

圖3.1是μC/OS-Ⅱ控制下的任務狀態(tài)轉換圖。在任一給定的時刻,任務的狀態(tài)一定是在這五種狀態(tài)之一。

睡眠態(tài)(DORMANT)指任務駐留在程序空間之中,還沒有交給μC/OS-Ⅱ管理,(見程序清單L3.1或L3.2)。把任務交給μC/OS-Ⅱ是通過調用下述兩個函數(shù)之一:

OSTaskCreate()或OSTaskCreateExt()。當任務一旦建立,這個任務就進入就緒態(tài)準備運行。任務的建立可以是在多任務運行開始之前,也可以是動態(tài)地被一個運行著的任務建立。如果一個任務是被另一個任務建立的,而這個任務的優(yōu)先級高于建立它的那個任務,則這個剛剛建立的任務將立即得到CPU的控制權。一個任務可以通過調用OSTaskDel()返回到睡眠態(tài),或通過調用該函數(shù)讓另一個任務進入睡眠態(tài)。

調用OSStart()可以啟動多任務。OSStart()函數(shù)運行進入就緒態(tài)的優(yōu)先級最高的任務。就緒的任務只有當所有優(yōu)先級高于這個任務的任務轉為等待狀態(tài),或者是被刪除了,才能進入運行態(tài)。


上一頁 1 2 3 4 5 6 7 8 9 下一頁

關鍵詞:

評論


相關推薦

技術專區(qū)

關閉