實驗二UCOSII任務(wù)管理(DOC)_第1頁
實驗二UCOSII任務(wù)管理(DOC)_第2頁
實驗二UCOSII任務(wù)管理(DOC)_第3頁
實驗二UCOSII任務(wù)管理(DOC)_第4頁
實驗二UCOSII任務(wù)管理(DOC)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗二UCOS-II任務(wù)管理(DOC)實驗二UCOS-II任務(wù)管理(DOC)11/11實驗二UCOS-II任務(wù)管理(DOC)班級學(xué)號姓名同組人實驗日期室溫大氣壓成績實驗二UCOS-II任務(wù)管理一、實驗?zāi)康?、掌握UCOS-II中任務(wù)管理的函數(shù)的應(yīng)用。2、掌握UCOS-II在STM32平臺下對硬件的控制。3、掌握開發(fā)UCOS-II應(yīng)用的程序構(gòu)造。二、實驗步驟1、UCOSII工作原理UCOSII供給系統(tǒng)時鐘節(jié)拍,實現(xiàn)任務(wù)切換和任務(wù)延時等功能。這個時鐘節(jié)拍由OS_TICKS_PER_SEC(在os_cfg.h中定義)設(shè)置,一般我們設(shè)置UCOSII的系統(tǒng)時鐘節(jié)拍為1ms100ms。本次實驗利用STM3

2、2的SYSTICK準(zhǔn)時器來供給UCOSII時鐘節(jié)拍。UCOSII的任何任務(wù)都是經(jīng)過一個叫任務(wù)控制塊(TCB)的東西來控制的,每個任務(wù)管理塊有3個最重要的參數(shù):(1)任務(wù)函數(shù)指針;(2)任務(wù)貨倉指針;(3)任務(wù)優(yōu)先級。在UCOSII中,使用CPU的時候,優(yōu)先級高(數(shù)值?。┑娜蝿?wù)比優(yōu)先級低的任務(wù)擁有優(yōu)先使用權(quán),即任務(wù)就緒表中老是優(yōu)先級最高的任務(wù)獲取CPU使用權(quán),只有高優(yōu)先級的任務(wù)讓出CPU使用權(quán)(比方延時)時,低優(yōu)先級的任務(wù)才能獲取CPU使用權(quán)。UCOSII不支持多個任務(wù)優(yōu)先級相同,也就是每個任務(wù)的優(yōu)先級必然不一樣樣。任務(wù)的調(diào)動其實就是CPU運轉(zhuǎn)環(huán)境的切換,即:PC指針、SP指針和存放器組等內(nèi)容的

3、存取過程UCOSII的每個任務(wù)都是一個死循環(huán)。每個任務(wù)都處在以下5種狀態(tài)之一的狀態(tài)下,這5種狀態(tài)是:睡眠狀態(tài)、就緒狀態(tài)、運轉(zhuǎn)狀態(tài)、等候狀態(tài)(等候某一事件發(fā)生)和中斷服務(wù)狀態(tài)。睡眠狀態(tài),任務(wù)在沒有被裝備任務(wù)控制塊或被剝奪了任務(wù)控制塊時的狀態(tài)。就緒狀態(tài),系統(tǒng)為任務(wù)裝備了任務(wù)控制塊且在任務(wù)就緒表中進行了就緒登記,任務(wù)已經(jīng)準(zhǔn)備好了,但因為該任務(wù)的優(yōu)先級比正在運轉(zhuǎn)的任務(wù)的優(yōu)先級低,還臨時不可以夠運轉(zhuǎn),這時任務(wù)的狀態(tài)叫做就緒狀態(tài)。運轉(zhuǎn)狀態(tài),該任務(wù)獲取CPU使用權(quán),并正在運轉(zhuǎn)中,此時的任務(wù)狀態(tài)叫做運轉(zhuǎn)狀態(tài)等候狀態(tài),正在運轉(zhuǎn)的任務(wù),需要等候一段時間或需要等候一個事件發(fā)生再運轉(zhuǎn)時,該任務(wù)就會把CPU的使用權(quán)讓給

4、其余任務(wù)而使任務(wù)進入等候狀態(tài)。中斷服務(wù)狀態(tài),一個正在運轉(zhuǎn)的任務(wù)一旦響應(yīng)中斷申請就會中斷運轉(zhuǎn)而去履行中斷服務(wù)程序,這時任務(wù)的狀態(tài)叫做中斷服務(wù)狀態(tài)。UCOSII任務(wù)的5個狀態(tài)變換關(guān)系以以下圖:與任務(wù)有關(guān)的幾個函數(shù):1)成立任務(wù)函數(shù)UCOSII供給了我們2個成立任務(wù)的函數(shù):OSTaskCreat和OSTaskCreatExt,我們一般用OSTaskCreat函數(shù)來創(chuàng)立任務(wù),該函數(shù)原型為:OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTUprio)該函數(shù)包含4個參數(shù):task:是指向任務(wù)代碼的指針;pdata:是任務(wù)開始履行時,傳

5、達(dá)給任務(wù)的參數(shù)的指針;ptos:是分派給任務(wù)的貨倉的棧頂指針;prio是分派給任務(wù)的優(yōu)先級。每個任務(wù)都有自己的貨倉,貨倉必然聲明為OS_STK種類,而且由連續(xù)的內(nèi)存空間組成。能夠靜態(tài)分派貨倉空間,也能夠動向分派貨倉空間。OSTaskCreatExt也能夠用來創(chuàng)建任務(wù)。2)任務(wù)刪除函數(shù)任務(wù)刪除,就是把任務(wù)置于睡眠狀態(tài),其實不是把任務(wù)代碼給刪除了。UCOSII供給的任務(wù)刪除函數(shù)原型為:INT8UOSTaskDel(INT8Uprio)此中參數(shù)prio就是我們要刪除的任務(wù)的優(yōu)先級。故該函數(shù)是經(jīng)過任務(wù)優(yōu)先級來實現(xiàn)任務(wù)刪除的。3)懇求任務(wù)刪除函數(shù)必然保證被刪除任務(wù)的資源被開釋的前提下才能將其刪除,所以我

6、們經(jīng)過向被刪除任務(wù)發(fā)送刪除懇求,來實現(xiàn)任務(wù)開釋自己占用資源后再刪除。UCOSII供給的懇求刪除任務(wù)函數(shù)原型為:INT8UOSTaskDelReq(INT8Uprio)相同仍是經(jīng)過優(yōu)先級來確立被懇求刪除任務(wù)。4)改變?nèi)蝿?wù)的優(yōu)先級函數(shù)UCOSII在成立任務(wù)時,會分派給任務(wù)一個優(yōu)先級,但是這個優(yōu)先級其實不是如出一轍的,而是能夠經(jīng)過調(diào)用UCOSII供給的函數(shù)改正。UCOSII供給的任務(wù)優(yōu)先級改正函數(shù)原型為:INT8UOSTaskChangePrio(INT8Uoldprio,INT8Unewprio)。5)任務(wù)掛起函數(shù)任務(wù)掛起和任務(wù)刪除有點近似,但是又有差別,任務(wù)掛起但是將被掛起任務(wù)的就緒標(biāo)記刪除,并

7、做任務(wù)掛起記錄,并無將任務(wù)控制塊任務(wù)控制塊鏈表里面刪除,也不需要開釋其資源,而任務(wù)刪除則必然先開釋被刪除任務(wù)的資源,并將被刪除任務(wù)的任務(wù)控制塊也給刪了。被掛起的任務(wù),在恢復(fù)(解掛)后能夠連續(xù)運轉(zhuǎn)。UCOSII供給的任務(wù)掛起函數(shù)原型為:INT8UOSTaskSuspend(INT8Uprio)6)任務(wù)恢復(fù)函數(shù)有任務(wù)掛起函數(shù),就有任務(wù)恢復(fù)函數(shù),經(jīng)過該函數(shù)將被掛起的任務(wù)恢復(fù),讓調(diào)動器能夠從頭調(diào)動該函數(shù)。UCOSII供給的任務(wù)恢復(fù)函數(shù)原型為:INT8UOSTaskResume(INT8Uprio)三、實驗內(nèi)容在UCOSII里面創(chuàng)立3個任務(wù):開始任務(wù)、LED0任務(wù)和LED1任務(wù),開始任務(wù)用于創(chuàng)立其余(L

8、ED0和LED1)任務(wù),今后掛起;LED0任務(wù)用于控制DS0的亮滅,DS0每秒鐘亮80ms;LED1任務(wù)用于控制DS1的亮滅,DS1亮300ms,滅300ms,挨次循環(huán)。所要用到的硬件資源以下:指示燈DS0、DS1的硬件電路圖如圖此中PWR是系統(tǒng)電源指示燈,為藍(lán)色。LED0和LED1分別接在PB5和PE5上。為了方便大家判斷,我們選擇了DS0為紅色的LED,DS1為綠色的LED。2)軟件參數(shù)設(shè)置在os_cfg.h里面定義OS_TICKS_PER_SEC=200,也就是設(shè)置UCOSII的時鐘節(jié)拍為5ms。OS_MAX_TASKS=10,也就是最多10個任務(wù)(包含安閑任務(wù)和統(tǒng)計任務(wù)在內(nèi))。前面提到

9、,我們需要在sys.h里面設(shè)置SYSTEM_SUPPORT_UCOS為1,以支持UCOSII,經(jīng)過這個設(shè)置,不只好夠?qū)崿F(xiàn)利用delay_init來初始化SYSTICK,產(chǎn)生UCOSII的系統(tǒng)時鐘節(jié)拍,還能夠夠讓delay_us和delay_ms函數(shù)在UCOSII下能夠正常使用,這使得我們以前的代碼能夠十分方便的移植到UCOSII下。固然UCOSII也供給了延時函數(shù):OSTimeDly和OSTimeDLyHMSM,但是這兩個函數(shù)的最少延時單位只好是1個UCOSII時鐘節(jié)拍,在本次實驗中,即5ms,明顯不可以夠?qū)崿F(xiàn)us級的延時,而us級的延時在好多時候特別合用:比方IIC模擬時序,DS18B20等

10、單總線器件操作等。而經(jīng)過delay_us和delay_ms,則能夠方便的供給us和ms的延時服務(wù),這比UCOSII自己供給的延時函數(shù)更好用。在設(shè)置SYSTEM_SUPPORT_UCOS為1今后,UCOSII的時鐘節(jié)拍由SYSTICK的中斷服務(wù)函數(shù)提供,該部分代碼以下:systick中斷服務(wù)函數(shù),使用ucos時用到voidSysTick_Handler(void)OSIntEnter();/OSTimeTick();/OSIntExit();/進入中斷調(diào)用ucos的時鐘服務(wù)程序觸發(fā)任務(wù)切換軟中斷以上代碼,此中OSIntEnter是進入中斷服務(wù)函數(shù),用來記錄中斷嵌套層數(shù)OSIntNesting增添

11、1);OSTimeTick是系統(tǒng)時鐘節(jié)拍服務(wù)函數(shù),在每個時鐘節(jié)拍認(rèn)識每個任務(wù)的延時狀態(tài),使已經(jīng)抵達(dá)延不時限的非掛起任務(wù)進入就緒狀態(tài);OSIntExit是退出中斷服務(wù)函數(shù),該函數(shù)可能觸發(fā)一次任務(wù)切換(當(dāng)OSIntNesting=0&調(diào)動器未上鎖&就緒表最高優(yōu)先級任務(wù)!=被中斷的任務(wù)優(yōu)先級時),不然連續(xù)返回本來的任務(wù)履行代碼(假如OSIntNesting不為0,則減1)。事實上,任何中斷服務(wù)函數(shù),都應(yīng)當(dāng)加上OSIntEnter和OSIntExit函數(shù),這是因為UCOSII是一個可剝奪型的內(nèi)核,中斷服務(wù)子程序運轉(zhuǎn)今后,系統(tǒng)會依據(jù)狀況進行一次任務(wù)調(diào)動去運轉(zhuǎn)優(yōu)先級別最高的就緒任務(wù),而其實不用然接著運轉(zhuǎn)被

12、中斷的任務(wù)!最后,翻開test.c,輸入以下代碼:#includesys.h#includeusart.h#includedelay.h#includeled.h#includeincludes.h/UCOSII任務(wù)設(shè)/START任務(wù)設(shè)置任務(wù)優(yōu)先級#defineSTART_TASK_PRIO10/開始任務(wù)的優(yōu)先級設(shè)置為最低設(shè)置任務(wù)貨倉大小#defineSTART_STK_SIZE64任務(wù)貨倉OS_STKSTART_TASK_STKSTART_STK_SIZE;任務(wù)函數(shù)voidstart_task(void*pdata);/LED0任務(wù)設(shè)置任務(wù)優(yōu)先級#defineLED0_TASK_PRIO7設(shè)

13、置任務(wù)貨倉大小#defineLED0_STK_SIZE64任務(wù)貨倉OS_STKLED0_TASK_STKLED0_STK_SIZE;任務(wù)函數(shù)voidled0_task(void*pdata);/LED1任務(wù)設(shè)置任務(wù)優(yōu)先級#defineLED1_TASK_PRIO6設(shè)置任務(wù)貨倉大小#defineLED1_STK_SIZE64任務(wù)貨倉OS_STKLED1_TASK_STKLED1_STK_SIZE;任務(wù)函數(shù)voidled1_task(void*pdata);intmain(void)Stm32_Clock_Init(9);/系統(tǒng)時鐘設(shè)置delay_init(72);/延時初始化LED_Init()

14、;LED_Init();/初始化與LED連結(jié)的硬件接口OSInit();OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STKSTART_STK_SIZE-1,START_TASK_PRIO);/創(chuàng)立初步任務(wù)OSStart();開始任務(wù)voidstart_task(void*pdata)OS_CPU_SRcpu_sr=0;pdata=pdata;OS_ENTER_CRITICAL();/進入臨界區(qū)(沒法被中斷打斷)OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STKLED0_S

15、TK_SIZE-1,LED0_TASK_PRIO);OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STKLED1_STK_SIZE-1,LED1_TASK_PRIO);OSTaskSuspend(START_TASK_PRIO);/掛開初步任務(wù).OS_EXIT_CRITICAL();/退出臨界區(qū)(能夠被中斷打斷)/LED0任務(wù)voidled0_task(void*pdata)while(1)LED0=0;delay_ms(80);LED0=1;delay_ms(920);/LED1任務(wù)voidled1_task(void*pdata)w

16、hile(1)LED1=0;delay_ms(300);LED1=1;delay_ms(300);該部分代碼我們創(chuàng)立了3個任務(wù):start_task、led0_task和led1_task,優(yōu)先級分別是10、7和6,貨倉大小都是64(注意OS_STK為32位數(shù)據(jù))。我們在main函數(shù)只創(chuàng)立了start_task一個任務(wù),此后在start_task再創(chuàng)立其余兩個任務(wù),在創(chuàng)立今后將自己start_task)掛起。這里,我們獨自創(chuàng)立start_task,是為了供給一個單調(diào)任務(wù),實現(xiàn)應(yīng)用程序開始運轉(zhuǎn)以前的準(zhǔn)備工作。在應(yīng)用程序中常常有一些代碼段必然不受任何攪亂地連續(xù)運轉(zhuǎn),這樣的代碼段叫做臨界段。所以,為了使臨界段在運轉(zhuǎn)時不受中斷所打斷,在臨界段代碼前必然用關(guān)中斷指令使CPU障蔽中斷懇求,而在臨界段代碼后必然用開中斷指令消除障蔽使得CPU能夠響應(yīng)中斷懇求。UCOSII供給OS_ENTER_CRITICAL和OS_EXIT_CRITICAL兩個宏來實現(xiàn),這兩個宏需要在移植UCOSII的時候?qū)崿F(xiàn),采納OS_CRITICAL_METHOD為3來實現(xiàn)這兩個宏。因為臨界段代碼不可以夠被中斷,將嚴(yán)重影響系統(tǒng)的及時性,所以臨界段代碼越短越好!在start_task任務(wù)中,我們在創(chuàng)立led0_task和led1_task的時候,不希望中斷打斷

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論