畢業(yè)論文μCOSII下任務(wù)調(diào)度的實驗方法_第1頁
畢業(yè)論文μCOSII下任務(wù)調(diào)度的實驗方法_第2頁
畢業(yè)論文μCOSII下任務(wù)調(diào)度的實驗方法_第3頁
畢業(yè)論文μCOSII下任務(wù)調(diào)度的實驗方法_第4頁
畢業(yè)論文μCOSII下任務(wù)調(diào)度的實驗方法_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、c/os-ii下任務(wù)調(diào)度的實驗方法作者姓名: 指導(dǎo)教師:摘要:c/os-ii是一個基于搶占式的實時多任務(wù)內(nèi)核,其優(yōu)點就是代碼量小、便于移植和維護(hù),從而得到了廣泛的應(yīng)用和研究。而任務(wù)調(diào)度是一個實時操作系統(tǒng)的核心功能,關(guān)系到整個操作系統(tǒng)的性能。本文對c/os-ii的任務(wù)調(diào)度通過實驗的方式讓讀者更加直觀的了解c/os-ii下的任務(wù)調(diào)度,c/os-ii內(nèi)核基于優(yōu)先級的搶占式調(diào)度算法,本文系統(tǒng)的分析了任務(wù)調(diào)度的具體流程,設(shè)計了任務(wù)調(diào)度的實驗方法,編寫一段源程序運行并得到結(jié)果。關(guān)鍵詞:搶占式;任務(wù)調(diào)度;實驗 1引言c/os-ii是一個完整的,可移植,可固化,可剪裁的嵌入式實時操作系統(tǒng)。它采用占先式調(diào)度方式

2、,即最高優(yōu)先級的任務(wù)一旦就緒,總能立刻得到cpu的使用權(quán),從而保證系統(tǒng)的實時性。在任務(wù)調(diào)度過程中,c/os-ii內(nèi)核能快速、準(zhǔn)確的從眾多的就緒態(tài)任務(wù)中找出優(yōu)先級最高的任務(wù),減少系統(tǒng)的響應(yīng)時間,保證系統(tǒng)的實時性。本文首先介紹與任務(wù)有關(guān)的概念和有關(guān)任務(wù)調(diào)度重要的域,接著詳細(xì)分析c/os-ii的最高優(yōu)先級查找算法和任務(wù)調(diào)度原理并結(jié)合實例加以說明。在分析最高優(yōu)先級查找算法時首先分析將任務(wù)置于就緒態(tài)的過程,這樣更抑郁理解內(nèi)核的查找。接著討論為實時操作系統(tǒng)c/os-ii下任務(wù)調(diào)度設(shè)計出實驗方法并運行一段源程序同時得到的結(jié)果。 2整體研究思路 作者首先介紹與任務(wù)有關(guān)的概念和有關(guān)任務(wù)調(diào)度重要的域,接著詳細(xì)分析

3、c/os-ii的最高優(yōu)先級查找算法和任務(wù)調(diào)度原理并結(jié)合實例加以說明。在分析最高優(yōu)先級查找算法時首先分析將任務(wù)置于就緒態(tài)的過程,這樣更抑郁理解內(nèi)核的查找。接著討論為實時操作系統(tǒng)c/os-ii下任務(wù)調(diào)度設(shè)計出實驗方法并運行一段源程序同時得到的結(jié)果 3嵌入式實時操作系統(tǒng)c/os-ii31c/os-ii簡介c/os-ii是一個公開源代碼的搶占先式多任務(wù)的微內(nèi)核實時操作系統(tǒng)。其特點概括為:源代碼公開,代碼結(jié)構(gòu)清晰;可移植性好;可裁剪性;內(nèi)核屬于搶占式;它可以管理64個任務(wù)。c/os-ii提供很多系統(tǒng)服務(wù),例如郵箱、消息隊列、信號量、塊大小固定的內(nèi)存的申請與釋放、時間相關(guān)函數(shù)等。c/os-ii自1992年

4、的第一版(c/os)以來已經(jīng)有幾百個應(yīng)用,是一個經(jīng)實踐證明好用且穩(wěn)定可靠的內(nèi)核。其代碼量很少,而且以條件編譯的形式來實現(xiàn)各部分功能,在最大程度上減少對存儲空間的浪費,非常適合低端嵌入。32c/os-ii組件321任務(wù)管理一個任務(wù)通常是一個無限的循環(huán),由程序和數(shù)據(jù)組成。在c/os-ii中,任務(wù)有5種狀態(tài):休眠態(tài)、就緒態(tài)、運行態(tài)、中斷態(tài)、等待態(tài),在任意時刻,任務(wù)處于這5種狀態(tài)之一。c/os-ii對任務(wù)的管理和調(diào)度主要是通過任務(wù)控制塊os_tcb和任務(wù)就緒表來實現(xiàn)。os_tcb是一個數(shù)據(jù)結(jié)構(gòu),與任務(wù)一一對應(yīng),它包括任務(wù)指針,任務(wù)堆棧信息,任務(wù)優(yōu)先級,任務(wù)狀態(tài),任務(wù)在任務(wù)就緒表中的位置等信息。在操作系

5、統(tǒng)初始化時,系統(tǒng)申請了一塊ram空間來存儲空閑os_tcb。一旦任務(wù)建立,系統(tǒng)就會分配一個os_tcb給該任務(wù)。當(dāng)任務(wù)的cpu使用權(quán)被剝奪時,c/os-ii用它來保存該任務(wù)的狀態(tài)。當(dāng)任務(wù)重新得到cpu使用權(quán)時,os_tcb能確保任務(wù)從被中斷的那一點繼續(xù)執(zhí)行下去。os_tcb全部駐留在ram中,在任務(wù)建立的時候,它被初始化。應(yīng)用程序中最多任務(wù)數(shù)是在文件os_cfg.h中定義的,所有的任務(wù)控制塊os_tcbs都是放在任務(wù)控制塊列表數(shù)組os_tcbtbl中的。c/os-ii占用了兩個任務(wù),一個用于空閑任務(wù),另一個用于任務(wù)統(tǒng)計。在c/os-ii初始化時, os_tcbs被鏈接成空任務(wù)控制塊的單向鏈表。

6、當(dāng)任務(wù)一旦建立,空任務(wù)塊指針ostcbfreelist指向的os_tcb便賦給了該任務(wù),然后ostcbfreelist的值調(diào)整為指向鏈表中下一個空的任務(wù)控制表。一旦任務(wù)被刪除,它的任務(wù)控制塊就回到空任務(wù)控制塊鏈表中。c/os-ii對任務(wù)的管理是通過一系列函數(shù)改變?nèi)蝿?wù)控制塊的鏈表和數(shù)組以及改變?nèi)蝿?wù)控制塊的信息實現(xiàn)。c/os-ii任務(wù)的調(diào)度是基于優(yōu)先級的調(diào)度,通過就緒表來實現(xiàn),每個任務(wù)被賦予一個優(yōu)先級,優(yōu)先級高的任務(wù)先運行,反之亦然。就緒表中有兩個變量osrdygrp和osrdytbl。任務(wù)按優(yōu)先級分組,8個任務(wù)為一組,osrdygrp中的每一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒態(tài)的任務(wù),同樣,

7、任務(wù)進(jìn)入就緒態(tài)時,就緒表osrdytbl中的相應(yīng)元素的相應(yīng)位也置位。322時間管理c/os-ii(其他內(nèi)核也一樣)要求用戶提供定時中斷來實現(xiàn)延時與超時控制等功能,這個定時中斷叫時鐘節(jié)拍,它應(yīng)該每秒發(fā)生10至100次。時鐘節(jié)拍的頻率實際上是由用戶應(yīng)用程序決定的,時鐘頻率越高,系統(tǒng)的負(fù)荷就越重。時間管理提供如下功能:產(chǎn)生時鐘節(jié)拍、任務(wù)延時、結(jié)束延時、系統(tǒng)時間。323任務(wù)之間的通訊與同步大多數(shù)操作系統(tǒng)中,通常用多個任務(wù)來完成一個復(fù)雜任務(wù),這就要考慮任務(wù)之間的通訊與同步。在c/os-ii中,任務(wù)之間通訊的方法有三種:信號量、郵箱、消息對列,它們被看作是事件,用一個數(shù)據(jù)結(jié)構(gòu)來表示,稱為事件控制塊。所有的

8、事件控制塊組成一個事件控制塊鏈表或數(shù)組,該鏈表或數(shù)組在c/os-ii初始化時建立。c/os-ii對信號量、郵箱、消息對列的操作是通過一系列的函數(shù)來實現(xiàn)的。324內(nèi)存管理在c/os-ii中,操作系統(tǒng)把連續(xù)的大塊內(nèi)存按分區(qū)來管理,每個分區(qū)中包含有整數(shù)個大小相同的內(nèi)存塊。這樣,用戶的應(yīng)用程序就可以根據(jù)不同的應(yīng)用從不同的內(nèi)存分區(qū)中得到不同大小的內(nèi)存塊,當(dāng)特定的內(nèi)存塊釋放時必須重新放回它以前所屬的內(nèi)存分區(qū)。顯然,這種方法簡化了內(nèi)存分區(qū)算法,也解決了內(nèi)存碎片問題。在c/os-ii中使用內(nèi)存控制塊的數(shù)據(jù)結(jié)構(gòu)來跟蹤每一個內(nèi)存分區(qū),系統(tǒng)中的每個分區(qū)都有它自己的內(nèi)存控制塊。所有的內(nèi)存控制塊組成內(nèi)存控制塊鏈表,它在

9、c/os-ii初始化時建立。內(nèi)存管理主要是由以下幾個功能組成:建立內(nèi)存分區(qū)、分配內(nèi)存分區(qū)、釋放內(nèi)存分區(qū)、查詢內(nèi)存分區(qū)狀態(tài)、使用內(nèi)存分區(qū)、等待內(nèi)存分區(qū)。4 c/os-ii任務(wù)調(diào)度4.1 c/os-ii的任務(wù)4.1.1任務(wù)及其任務(wù)狀態(tài)任務(wù),也稱線程,是一個簡單的應(yīng)用程序,每個任務(wù)都是被賦予一定的優(yōu)先級,并有自己的一套cpu寄存器和??臻g。實時應(yīng)用程序的設(shè)計過程是如何把問題分割成多個任務(wù)。每個任務(wù)都是一個無限的循環(huán),都處在一下五種狀態(tài)之一,即休眠態(tài),就緒態(tài),運行態(tài),掛起態(tài)和被中斷態(tài)。1) 休眠態(tài):相當(dāng)于任務(wù)駐留在內(nèi)存中,但并不能被多任務(wù)內(nèi)核所調(diào)度;2) 就緒態(tài):意味著任務(wù)已經(jīng)準(zhǔn)備好,可以運行,但是由

10、于該任務(wù)的優(yōu)先級比正在運行的任務(wù)的優(yōu)先級低,還暫時不能運行;3) 運行態(tài):指任務(wù)掌握了cpu的使用權(quán),正在運行中;4) 掛起太:指任務(wù)在等待,等待某一事件的發(fā)生;5) 被中斷態(tài):指發(fā)生中斷時,cpu提供相應(yīng)的中斷服務(wù),原來正在運行的任務(wù)暫時不能運行,就進(jìn)入了中斷態(tài)。4.1.2任務(wù)控制塊(os_tcb) 任務(wù)控制塊是一個和任務(wù)息息相關(guān)的重要的結(jié)構(gòu)體。當(dāng)任務(wù)的cpu使用權(quán)被剝奪時,c/os-i用它來保存該任務(wù)的狀態(tài)。當(dāng)任務(wù)重新獲得cpu的使用權(quán)時,任務(wù)控制塊能確保任務(wù)從被中斷的那一點絲毫不差的繼續(xù)執(zhí)行。每個任務(wù)都擁有自己獨立的任務(wù)控制塊,一旦任務(wù)建立,與之相對應(yīng)的任務(wù)控制塊就被賦值。 任務(wù)控制塊結(jié)

11、構(gòu)體在c/os-ii中定義,以下代碼是節(jié)選os_tcb中對本文分析相關(guān)的結(jié)構(gòu)體成員。/file: c/os-ii.htypedef struts os_tcbos_stk ostcbstkptr;.int8u ostcbprio;int8u ostcbx;int8u ostcby;int8u ostcbbitx;int8u ostcbbity;.os_tcb; ostcbstkptr是當(dāng)前任務(wù)的棧頂指針,每個任務(wù)都有自己的堆棧和指向棧頂指針。在上下文切換時,對于優(yōu)先級的任務(wù),要將任務(wù)當(dāng)前狀態(tài)保存于任務(wù)堆棧中(以便以后再次調(diào)度到此任務(wù)繼續(xù)執(zhí)行),然后ostcbstkptr指向棧頂;對于優(yōu)先級高的

12、任務(wù),通過ostcbstrptr找到任務(wù)的上次被切換是的狀態(tài),把保存的狀態(tài)恢復(fù)到cpu,這樣任務(wù)就毫無差錯的繼續(xù)執(zhí)行。 ostcbprio是任務(wù)的優(yōu)先級號。ostcbx,ostcbbitx,ostcby,ostcbbity用于加速任務(wù)進(jìn)入就緒態(tài)的過程或等待事件發(fā)生狀態(tài)的過程,這些值在任務(wù)建立時調(diào)用os_tcbinit進(jìn)行賦值。4.2 c/os-ii最高優(yōu)先級查找算法在c/os-ii中,每個就緒的任務(wù)都是放在就緒表(ready list)中,內(nèi)核通過就緒表找到就緒太最高優(yōu)先級的任務(wù)讓其占用cpu,進(jìn)入運行態(tài)。c/os-ii中最多運行任務(wù)是64哥,內(nèi)核把任務(wù)優(yōu)先級分組,八個為一組,如圖1所示。任務(wù)

13、優(yōu)先級號中y 是所屬組部分,x 是所在組部分,在就緒表中有2 個變量osrdygrp和osrdytbl ,osrdygrp 表示所屬組,每一位代表一個組內(nèi)是否有進(jìn)入就緒態(tài)的任務(wù),osrdytbl 表示所在組,一組八個任務(wù),即一位代表一個任務(wù)是否進(jìn)入就緒態(tài)。當(dāng)任務(wù)進(jìn)入就緒態(tài)時,就緒表osrdygrp 和osrdytbl 相應(yīng)位置1。osrdygrp 和osrdytbl 之間的關(guān)系見圖1,osrdygrp 的第n 位對應(yīng)osrdytbl n ,即osrdytbl n 中任何一位是1時,osrdygrp 的第n 位要置1。 任務(wù)創(chuàng)建成功后被置于就緒態(tài),這里就以任務(wù)被創(chuàng)建時為例來說明內(nèi)核是如何把任務(wù)置

14、于就緒態(tài)。首先,建立任務(wù),調(diào)用函數(shù)ostaskcreat( )或ostaskcreatext( ),ostaskcreat( )和ostaskcreatext( )都將調(diào)用os_tcbinit( )來初始化任務(wù)控制塊,函數(shù)os_tcbinit( )完成將任務(wù)優(yōu)先級放就緒表中,使任務(wù)置于就緒態(tài),函數(shù)os_tcbinit( )中有關(guān)將任務(wù)優(yōu)先級放就緒表的部分如下所示/ file : os_core.cint8u os_tcbinit(int8u prio,.)os_tcb* ptcb;/* 初始化os_tcb 中ostcbx,ostcbbitx, ostcby,ostcbbity */ptcb-o

15、stcby= prio 3;ptcb-ostcbbity = osmaptblptcb-ostcby;ptcb-ostcbx = prio & 0x07;ptcb-ostcbbitx = osmaptblptcb-ostcbx;osrdygrp|= ptcb-ostcbbity; /* 將任務(wù)加入就緒表 */osrdytblptcb-ostcby |= ptcb-ostcbbitx;os_tcbinit( )對ostcbx,ostcbbitx, ostcby,ostcbbity 提前做了運算,節(jié)約任務(wù)調(diào)度時。ostcbx 和ostcby 都要轉(zhuǎn)換為相應(yīng)位掩碼,這個是通過osmaptbl 實現(xiàn),

16、如圖2。內(nèi)核通過按位或運算把osrdygrp 和osrdytbl 的相應(yīng)位置1,這樣就完成了把任務(wù)置于就緒態(tài)的工作。 圖 2 osmaptbl 所有任務(wù)置于就緒態(tài)的工作都是通過上面的兩個或運算完成。最高優(yōu)先級任務(wù)置于就緒態(tài)和查找就緒態(tài)最高優(yōu)先級任務(wù)是相反的過程,通過把任務(wù)置于就緒態(tài)的分析知道了就緒表中是如何放置任務(wù)優(yōu)先級信息的,接下來就要把最高優(yōu)先級的任務(wù)從就緒表中查找出來。任務(wù)的優(yōu)先級越高,任務(wù)的優(yōu)先級號越小,在osrdygrp 和osrdytbl 中置1 的位越低,查找最高優(yōu)先級的任務(wù)就是查出osrdygrp osrdytbl 和最低的置1 位,然后再轉(zhuǎn)換為優(yōu)先級號,這樣就完成了最高優(yōu)先級

17、的查找工作。內(nèi)核調(diào)度任務(wù)時需要查找出最高優(yōu)先級的任務(wù)。內(nèi)核調(diào)用os_sched( )調(diào)度任務(wù)。os_sched( )找出就緒態(tài)最高ospriohighrdy,判斷是否需要調(diào)度,如果需要則調(diào)度任務(wù)。函數(shù)os_sched( )中有關(guān)查找最高優(yōu)先級的部分如下:/ file : os_core.cvoid os_sched (void)int8u y;y = osunmaptblosrdygrp; /* 找出最高優(yōu)先級 */ospriohighrdy = (int8u)(y 3) + osunmaptblosrdytbly);為了找到就緒態(tài)的優(yōu)先級最高的任務(wù),內(nèi)核并不是從osrdytbl 0 開始掃描

18、整個就緒任務(wù)表,只需查另外一張表即優(yōu)先級判定表osunmaptbl ,如圖3 所示,這樣設(shè)計為內(nèi)核調(diào)度節(jié)約了時間。優(yōu)先級判定表osunmaptbl 中的值由osrdygrp 和osrdytbl 的最低置1 位確定,舉例說明。假設(shè)osrdygrp0x6c(0b01101100),osrdygrp 的最后一位置1 是第2 位,osunmaptbl0x6c=2(圖3 中紅色標(biāo)注部分),反過來,知道osrdygrp0x6c 就可以通過osunmaptbl0x6c找到2,這樣通過osunmaptbl 把 osrdygrp 和osrdytbl 最低置1 位轉(zhuǎn)換為對應(yīng)優(yōu)先級號中的y 和x 部分,y 乘以8

19、加上x 就是就緒任務(wù)的最小優(yōu)先級號,即優(yōu)先級最高的任務(wù)的優(yōu)先級號,這樣內(nèi)核便完成了查找就緒態(tài)最高優(yōu)先級任務(wù)的工作。 int8u const osunmaptbl =0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x00 to 0x0f4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x10 to 0x1f5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x20 to 0x2f4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0,

20、 2, 0, 1, 0, /0x30 to 0x3f6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x40 to 0x4f4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x50 to 0x5f5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x60 to 0x6f4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x70 to 0x7f7, 0, 1, 0, 2, 0, 1, 0, 3, 0,

21、1, 0, 2, 0, 1, 0, /0x80 to 0x8f4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0x90 to 0x9f5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0xa0 to 0xaf4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0xb0 to 0xbf6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0xc0 to 0xcf4, 0, 1, 0, 2, 0, 1, 0, 3

22、, 0, 1, 0, 2, 0, 1, 0, /0xd0 to 0xdf5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /0xe0 to 0xef4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /0xf0 to 0xff;4.3 c /os-任務(wù)調(diào)度原理c /os-內(nèi)核調(diào)用函數(shù)os_sched( )來完成任務(wù)調(diào)度。函數(shù)os_sched( )首先找出最高優(yōu)先級任務(wù)的任務(wù)號,再與當(dāng)前任務(wù)的任務(wù)號比較判斷是否需要調(diào)度,如果兩個任務(wù)號不相等則說明有更高優(yōu)先級的任務(wù)進(jìn)入就緒態(tài)需要進(jìn)行任務(wù)調(diào)度,然后進(jìn)入上下文切換

23、完成任務(wù)調(diào)度,反之則說明當(dāng)前任務(wù)具有最高優(yōu)先級,退出os_sched( )繼續(xù)執(zhí)行當(dāng)前任務(wù)。有關(guān)內(nèi)核源碼如下:/ file : os_core.cvoid os_sched (void)int8u y;.os_enter_critical();if (osintnesting = 0) & (oslocknesting = 0) y= osunmaptblosrdygrp; /* 查找最高優(yōu)先級 */ospriohighrdy = (int8u)(y os_lowest_prio) (1) return (os_prio_invalid); os_enter_critical(); if (o

24、stcbpriotblprio = (os_tcb *)0) (2) ostcbpriotblprio = (os_tcb *)1; (3) os_exit_critical(); (4) psp = (void *)ostaskstkinit(task, pdata, ptos, 0); (5) err = ostcbinit(prio, psp, (void *)0, 0, 0, (void *)0, 0); (6) if (err = os_no_err) (7) os_enter_critical(); ostaskctr+; (8) ostaskcreatehook(ostcbpri

25、otblprio); (9) os_exit_critical(); if (osrunning) (10) ossched(); (11) else os_enter_critical(); ostcbpriotblprio = (os_tcb *)0; (12) os_exit_critical(); return (err); else os_exit_critical(); return (os_prio_exist); 掛起任務(wù),ostasksuspend()有時候?qū)⑷蝿?wù)掛起是很有用的。掛起任務(wù)可通過調(diào)用ostasksuspend()函數(shù)來完成。被掛起的任務(wù)只能通過調(diào)用ostaskr

26、esume()函數(shù)來恢復(fù)。任務(wù)掛起是一個附加功能。也就是說,如果任務(wù)在被掛起的同時也在等待延時的期滿,那么,掛起操作需要被取消,而任務(wù)繼恢復(fù)任務(wù),ostaskresume()在上一節(jié)中曾提到過,被掛起的任務(wù)只有通過調(diào)用ostaskresume()才能恢復(fù)。ostaskresume()函數(shù)的代碼如程序清單 l4.17所示。因為ostasksuspend()不能掛起空閑任務(wù),所以必須得確認(rèn)用戶的應(yīng)用程序不是在恢復(fù)空閑任務(wù)l4.17(1)。注意,這個測試也可以確保用戶不是在恢復(fù)優(yōu)先級為os_prio_self的任務(wù)(os_prio_self被定義為0xff,它總是比os_lowest_prio大)。

27、續(xù)等待延時期滿,并轉(zhuǎn)入就緒狀態(tài)。任務(wù)可以掛起自己或者其它任務(wù)。獲得有關(guān)任務(wù)的信息,ostaskquery()用戶的應(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)用程序所要求的屬性和功能。改變?nèi)蝿?wù)的優(yōu)先級,ostaskchangeprio()在用戶建立任務(wù)的時候會分配給任務(wù)一個優(yōu)先級。在程序運行期間,用戶可以通過調(diào)用ostaskchangeprio()來

28、改變?nèi)蝿?wù)的優(yōu)先級。換句話說,就是c/os-允許用戶動態(tài)的改變?nèi)蝿?wù)的優(yōu)先級。5.4 實驗步驟 5.4.1準(zhǔn)備實驗環(huán)境先在c盤上建一個名稱為bc31的目錄,然后到互聯(lián)網(wǎng)上下載一個borland c+3.1并安裝到目錄bc31中(因為書中的代碼是用borland c+3.1編譯的),接著再把實驗程序文件夾software復(fù)制到c盤上。bc31實驗環(huán)境的建立步驟如下: 5.4.2 編寫源程序源程序 1#include includes.h#define task_stk_size 512/任務(wù)堆棧長度os_stk mytaskstktask_stk_size;/定義任務(wù)堆棧區(qū)os_stk youtas

29、kstktask_stk_size;/定義任務(wù)堆棧區(qū)os_stk histaskstktask_stk_size;/定義任務(wù)堆棧區(qū)int16s key;/用于退出ucos_ii的鍵int8u x=0,y=0;/字符顯示位置int8u time=0;void mytask(void *data);/聲明任務(wù)void youtask(void *data);/聲明任務(wù)void histask(void *data);/*主函數(shù)*/void main (void) char* s_m=m;/定義要顯示的字符 osinit();/初始化ucos_ii pc_dossavereturn();/保存dos

30、環(huán)境 pc_vectset(ucos, osctxsw);/安裝ucos_ii中斷 ostaskcreate(mytask,/創(chuàng)建任務(wù)mytasks_m,/給任務(wù)傳遞參數(shù)&mytaskstktask_stk_size - 1,/設(shè)置任務(wù)堆棧棧頂指針0);/使任務(wù)mytask的優(yōu)先級別為0 osstart();/啟動ucos_ii的多任務(wù)管理/*任務(wù)mytask*/void mytask (void *pdata) char* s_y=y;/定義要顯示的字符#if os_critical_method = 3 os_cpu_sr cpu_sr;#endif pdata = pdata; os_e

31、nter_critical(); pc_vectset(0x08, ostickisr);/安裝ucos_ii時鐘中斷向量 pc_settickrate(os_ticks_per_sec);/設(shè)置ucos_ii時鐘頻率 os_exit_critical(); osstatinit();/初始化ucos_ii的統(tǒng)計任務(wù) ostaskcreate(youtask,/創(chuàng)建任務(wù)mytasks_y,/給任務(wù)傳遞參數(shù)&youtaskstktask_stk_size - 1,/設(shè)置任務(wù)堆棧棧頂指針2);/使任務(wù)mytask的優(yōu)先級別為2 for (;) if (x50) x=0; y+=2; pc_disp

32、char(x, y,/顯示字符的位置*(char*)pdata, disp_bgnd_black+disp_fgnd_red ); x += 1; /如果按下esc鍵則退出ucos_iiif (pc_getkey(&key) = true) if (key = 0x1b) pc_dosreturn(); ostimedlyhmsm(0, 0, 2, 0);/等待 void youtask (void *pdata) char* s_y=h;/定義要顯示的字符 ostaskcreate(histask,/創(chuàng)建任務(wù)mytasks_y,/給任務(wù)傳遞參數(shù)&histaskstktask_stk_size

33、 - 1,/設(shè)置任務(wù)堆棧棧頂指針3);/使任務(wù)mytask的優(yōu)先級別為0 for (;) if (x50) x=0; y+=2; pc_dispchar(x, y,/顯示字符的位置*(char*)pdata, disp_bgnd_black+disp_fgnd_white ); x += 1; /如果按下esc鍵則退出ucos_iiif (pc_getkey(&key) = true) if (key = 0x1b) pc_dosreturn(); ostimedlyhmsm(0, 0, 4, 0);/等待 /*任務(wù)youtask*/void histask (void *pdata) cha

34、r* s_y=g;/定義要顯示的字符 ostaskcreate(mytask,/創(chuàng)建任務(wù)mytasks_y,/給任務(wù)傳遞參數(shù)&mytaskstktask_stk_size - 1,/設(shè)置任務(wù)堆棧棧頂指針4);/使任務(wù)mytask的優(yōu)先級別為4 for (;) if (x50) x=0; y+=2; pc_dispchar(x, y,/顯示字符的位置*(char*)pdata, disp_bgnd_black+disp_fgnd_white ); x += 1; /如果按下esc鍵則退出ucos_iiif (pc_getkey(&key) = true) if (key = 0x1b) pc_d

35、osreturn(); ostimedlyhmsm(0, 0, 6, 0);/等待 源程序 2:#include includes.h#define task_stk_size 512/任務(wù)堆棧長度os_stk mytaskstktask_stk_size;/定義任務(wù)堆棧區(qū)os_stk youtaskstktask_stk_size; /定義任務(wù)堆棧區(qū)os_stk hertaskstktask_stk_size; /定義任務(wù)堆棧區(qū)int16s key;/用于退出ucos_ii的鍵int8u x=0,y=0;/字符顯示位置void mytask(void *data);/聲明任務(wù)void you

36、task(void *data); /聲明任務(wù)void hertask(void *data);/聲明任務(wù)/*主函數(shù)*/void main (void) char* s_m=m;/定義要顯示的字符 osinit();/初始化ucos_ii pc_dossavereturn();/保存dos環(huán)境 pc_vectset(ucos, osctxsw);/安裝ucos_ii中斷 ostaskcreate(mytask,/創(chuàng)建任務(wù)mytasks_m,/給任務(wù)傳遞參數(shù)&mytaskstktask_stk_size - 1, /設(shè)置任務(wù)堆棧棧頂指針0);/使任務(wù)mytask的優(yōu)先級別為0 osstart()

37、;/啟動ucos_ii的多任務(wù)管理/*任務(wù)mytask*/void mytask (void *pdata) char* s_y=y; /定義要顯示的字符 char* s_h=h; /定義要顯示的字符 char* s=you and her tasks delete themselve at the right time;#if os_critical_method = 3 os_cpu_sr cpu_sr;#endif pdata = pdata; os_enter_critical(); pc_vectset(0x08, ostickisr);/安裝ucos_ii時鐘中斷向量 pc_set

38、tickrate(os_ticks_per_sec);/設(shè)置ucos_ii時鐘頻率 os_exit_critical(); osstatinit();/初始化ucos_ii的統(tǒng)計任務(wù) ostaskcreate(youtask,/創(chuàng)建任務(wù)youtasks_y,/給任務(wù)傳遞參數(shù)&youtaskstktask_stk_size - 1,/設(shè)置任務(wù)堆棧棧頂指針1); /使任務(wù)youtask的優(yōu)先級別為1 ostaskcreate(hertask,/創(chuàng)建任務(wù)hertasks_h,/給任務(wù)傳遞參數(shù)&hertaskstktask_stk_size - 1,/設(shè)置任務(wù)堆棧棧頂指針2);/使任務(wù)hertask的

39、優(yōu)先級別為2 for (;) if(x18) while(ostaskdelreq(1)!=os_task_not_exist&ostaskdelreq(2)!=os_task_not_exist) pc_dispstr(10, 6,/顯示字符的位置s, disp_bgnd_black+disp_fgnd_red ); ostimedly(1); if (x50) x=0; y+=2; pc_dispchar(x, y,/顯示字符的位置*(char*)pdata, disp_bgnd_black+disp_fgnd_red ); x += 1;/如果按下esc鍵則退出ucos_iiif (pc_getkey(&key) = true) if (key = 0x1b) pc_dosreturn(); ostimedlyhmsm(0, 0, 4, 0);/等待 /*任務(wù)youtask*/void youtask (void *pdata)#if os_critical_method = 3 os_cpu_sr cpu_sr;#endif char *s1=youtask:i must delete myself; char *s2=youtask:i have delete myself; pdata = pdata; for (;) if(ostaskdelreq(os_pri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論