ucos-ii操作系統(tǒng)習題(嵌入式方向)(共23頁)_第1頁
ucos-ii操作系統(tǒng)習題(嵌入式方向)(共23頁)_第2頁
ucos-ii操作系統(tǒng)習題(嵌入式方向)(共23頁)_第3頁
ucos-ii操作系統(tǒng)習題(嵌入式方向)(共23頁)_第4頁
ucos-ii操作系統(tǒng)習題(嵌入式方向)(共23頁)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、ucos-ii操作系統(tǒng)習題一 填空題1 uC/OS-II是一個簡潔、易用的 基于優(yōu)先級的嵌入式【 搶占式 】多任務(wù)實時內(nèi)核。2 任務(wù)是一個無返回的無窮循環(huán)。uc/os-ii總是運行進入就緒狀態(tài)的【 最高優(yōu)先級 】的任務(wù) 。3 因為uc/os-ii總是運行進入就緒狀態(tài)的最高優(yōu)先級的任務(wù)。所以,確定哪個任務(wù)優(yōu)先級最高,下面該哪個任務(wù)運行,這個工作就是由【調(diào)度器(scheduler)】來完成的。4 【 任務(wù)級 】的調(diào)度是由函數(shù)OSSched()完成的,而【 中斷級 】的調(diào)度是由函數(shù)OSIntExt() 完成。對于OSSched(),它內(nèi)部調(diào)用的是【 OS_TASK_SW()】 完成實際的調(diào)度;OSI

2、ntExt()內(nèi)部調(diào)用的是【 OSCtxSw() 】實現(xiàn)調(diào)度。5 任務(wù)切換其實很簡單,由如下2步完成:(1)將被掛起任務(wù)的處理器寄存器推入自己的【 任務(wù)堆棧 】。(2)然后將進入就緒狀態(tài)的最高優(yōu)先級的任務(wù)的寄存器值從堆棧中恢復到【寄存器 】中。6 任務(wù)的5種狀態(tài)。【睡眠態(tài)(task dormat) 】:任務(wù)駐留于程序空間(rom或ram)中,暫時沒交給ucos-ii處理。【就緒態(tài)(task ready)】:任務(wù)一旦建立,這個任務(wù)就進入了就緒態(tài)?!具\行態(tài)(task running)】:調(diào)用OSStart()可以啟動多任務(wù)。OSStart()函數(shù)只能調(diào)用一次,一旦調(diào)用,系統(tǒng)將運行進入就緒態(tài)并且優(yōu)先

3、級最高的任務(wù)?!镜却隣顟B(tài)(task waiting)】:正在運行的任務(wù),通過延遲函數(shù)或pend(掛起)相關(guān)函數(shù)后,將進入等待狀態(tài)?!局袛酄顟B(tài)(ISR running)】:正在運行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)閉或者ucos-ii將中斷關(guān)閉。7【 不可剝奪型 】內(nèi)核要求每個任務(wù)自我放棄CPU的所有權(quán)。不可剝奪型調(diào)度法也稱作合作型多任務(wù),各個任務(wù)彼此合作共享一個CPU。8當系統(tǒng)響應(yīng)時間很重要時,要使用【 可剝奪型 】內(nèi)核。最高優(yōu)先級的任務(wù)一旦就緒,總能得到CPU的控制權(quán)。9使用可剝奪型內(nèi)核時,應(yīng)用程序不應(yīng)直接使用不可重入型函數(shù)。調(diào)用不可重入型函數(shù)時,要滿足互斥條件,這一點可以用【 互斥型

4、信號量 】來實現(xiàn)。10【 可重入型 】函數(shù)可以被一個以上的任務(wù)調(diào)用,而不必擔心數(shù)據(jù)的破壞。11可重入型函數(shù)任何時候都可以被中斷,一段時間以后又可以運行,而相應(yīng)數(shù)據(jù)不會丟失??芍厝胄秃瘮?shù)或者只使用【 局部變量 】,即變量保存在CPU寄存器中或堆棧中。如果使用全局變量,則要對全局變量予以【 保護 】。12每個任務(wù)都有其優(yōu)先級。任務(wù)越重要,賦予的優(yōu)先級應(yīng)【 越高 】。13C/OS-初始化是通過調(diào)用系統(tǒng)函數(shù)【OSIint()】實現(xiàn)的,完成C/OS-所有的變量和數(shù)據(jù)結(jié)構(gòu)的初始化。14多任務(wù)的啟動是用戶通過調(diào)用【OSStart()】實現(xiàn)的。然而,啟動C/OS-之前,用戶至少要建立一個應(yīng)用【任務(wù)】。15.

5、C/OS-的參數(shù)配置文件名為【OS_CFG.H】。16 刪除任務(wù),是說任務(wù)將返回并處于【休眠狀態(tài)】,并不是說任務(wù)的代碼被刪除了,只是任務(wù)的代碼不再被C/OS-調(diào)用。17C/OS-要求用戶提供【定時中斷】來實現(xiàn)延時與超時控制等功能。18定時中斷也叫做【時鐘節(jié)拍】,它應(yīng)該每秒發(fā)生10至100次。19. 時鐘節(jié)拍的實際頻率是由用戶的應(yīng)用程序決定的。時鐘節(jié)拍的頻率越高,系統(tǒng)的負荷就【越重】。20C/OS-II中的信號量由兩部分組成:一個是信號量的【計數(shù)值】,它是一個16位的無符號整數(shù)(0 到65,535之間);另一個是由等待該信號量的任務(wù)組成的【等待任務(wù)表】。用戶要在OS_CFG.H中將OS_SEM_

6、EN開關(guān)量常數(shù)置成【 1 】,這樣C/OS-II才能支持信號量。21. C/OS-II中表示當前已經(jīng)創(chuàng)建的任務(wù)數(shù)全局變量名為:【 OSTaskCtr 】。21. C/OS-II中表示當前內(nèi)核運行的標記全局變量名為:【 OSRunning 】。22在使用OSTaskCreate創(chuàng)建任務(wù)時,若需要TaskData作偽參數(shù)傳遞給任務(wù)Task,并從任務(wù)Task中獲得傳入的字符參數(shù)值,請在下面【 】填上合適的代碼。 char TaskData=A; OSTaskCreate(Task, 【(void *)& TaskData 】, &TaskStk0TASK_STK_SIZE - 1, 1);void

7、Task (void *pdata) char value = 【 *(char *)pdata 】; for (;) OSSemPend(RandomSem, 0, &err); y = (int) (*(char *)pdata - A); OSSemPost(RandomSem); PC_DispChar(10, 25, value, DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(1); 23. 在C/OS-II在任務(wù)Task1中使用郵箱函數(shù)OSMboxPost()發(fā)送字符;而在Task2中接收OSMboxPost()字符, 請在下面【 】填上

8、合適的代碼。void Task1 (void *data) char txmsg;INT8U err; txmsg = A; for (;) OSMboxPost(TxMbox, 【 (void *)&txmsg】); /* Send message to Task2*/ OSMboxPend(AckMbox, 0, &err); txmsg+; if (txmsg = Z) txmsg = A; void Task5 (void *data) char *rxmsg; INT8U err; data = data; for (;) rxmsg = 【(char *)】OSMboxPend(T

9、xMbox, 0, &err); PC_DispChar(70, 18, *rxmsg, DISP_FGND_YELLOW + DISP_BGND_BLUE); OSMboxPost(AckMbox, (void *)1); 24. 在Task1中使用消息隊列OSQPend()函數(shù)接收消息“Hello World!”,而在Task2中使用消息隊列OSQPost()函數(shù)發(fā)送消息“Hello World!”, 請在下面【 】填上合適的代碼.void Task1 (void *pdata) char *msg; INT8U err; pdata = pdata; for (;) msg = 【(ch

10、ar *)】OSQPend(MsgQueue, 0, &err); PC_DispStr(70, 13, msg, DISP_FGND_YELLOW + DISP_BGND_BLUE); OSTimeDlyHMSM(0, 0, 0, 100); void Task2 (void *pdata) char msg20; pdata = pdata; strcpy(&msg0, Hello World!); for (;) OSQPost(MsgQueue, 【(void *)】&msg0); OSTimeDlyHMSM(0, 0, 0, 500); 25. C/OS-II操作系統(tǒng)使用OSSche

11、dLock()函數(shù)和OSSchedUnlock()函數(shù)進行鎖定(不允許任務(wù)級調(diào)度)和解鎖(重新允許任務(wù)級調(diào)度)調(diào)度器,在用戶應(yīng)用程序中OSSchedLock()和OSSchedUnlock()是 【成對出現(xiàn)的】,否則系統(tǒng)有可能出錯。26.OSTaskSuspend(self)可把正在運行的任務(wù)【(_掛起_)】,參數(shù)self指【(_任務(wù)本身_)】。用此函數(shù)掛起的任務(wù)可通過【( OSTaskResume )】函數(shù)喚醒。27.創(chuàng)建信號量OSSemCreat(0)函數(shù)中,參數(shù)0表示【( 信號量的初始值 )】。二 名詞解釋1代碼的臨界段代碼的臨界段也稱為臨界區(qū),指處理時不可分割的代碼。2資源任何為任務(wù)所

12、占用的實體都可稱為資源。資源可以是輸入輸出設(shè)備;資源也可以是一個變量,一個結(jié)構(gòu)或一個數(shù)組等。3共享資源可以被一個以上任務(wù)使用的資源叫做共享資源。4任務(wù)一個任務(wù),也稱作一個線程,是一個簡單的程序,該程序可以認為CPU完全只屬該程序自己。典型地、每個任務(wù)都是一個無限的循環(huán)。5任務(wù)切換指Context Switch,其含義是CPU寄存器內(nèi)容切換。當多任務(wù)內(nèi)核決定運行另外的任務(wù)時,它保存正在運行任務(wù)的當前狀態(tài)(Context),即CPU寄存器中的全部內(nèi)容。6內(nèi)核多任務(wù)系統(tǒng)中,內(nèi)核負責管理各個任務(wù),或者說為每個任務(wù)分配CPU時間,并且負責任務(wù)之間的通訊。內(nèi)核提供的基本服務(wù)是任務(wù)切換。7調(diào)度(Schedu

13、ler)內(nèi)核的主要職責之一,就是要決定該輪到哪個任務(wù)運行了。多數(shù)實時內(nèi)核是基于優(yōu)先級調(diào)度法的。8可剝奪型內(nèi)核最高優(yōu)先級的任務(wù)一旦就緒,總能得到CPU的控制權(quán)。當一個運行著的任務(wù)使一個比它優(yōu)先級高的任務(wù)進入了就緒態(tài),當前任務(wù)的CPU使用權(quán)就被剝奪了,或者說被掛起了,那個高優(yōu)先級的任務(wù)立刻得到了CPU的控制權(quán)。如果是中斷服務(wù)子程序使一個高優(yōu)先級的任務(wù)進入就緒態(tài),中斷完成時,中斷了的任務(wù)被掛起,優(yōu)先級高的那個任務(wù)開始運行。 三簡答題1. 舉例說明COS-II可移植型數(shù)據(jù)類型的定義方式 答:因為不同的微處理器有不同的字長,C/OS-II的移植文件包括很多類型定義以確保可移植性。COS-II不使用C語言

14、中的short,int,long等數(shù)據(jù)類型的定義,因為它們與處理器類型有關(guān),隱含著不可移植性。C/OS-II代之以移植性強的整數(shù)數(shù)據(jù)類型,這樣,既直觀又可移植(該數(shù)據(jù)類型不依賴于編譯),舉例如下:typedef unsigned char BOOLEAN;typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned int INT16U;typedef signed int INT16S;typedef unsigned long INT32U;typedef signed long INT32S;2. COS-I

15、I如何定義全局變量?答:眾所周知,全局變量應(yīng)該是得到內(nèi)存分配且可以被其他模塊通過C語言中extern關(guān)鍵字調(diào)用的變量。因此,必須在 .C 和 .H 文件中定義。這種重復的定義很容易導致錯誤。COS-II采用的方法只需用在頭文件中定義一次。uC/OS_II.H 頭文件中包括以下定義全局宏定義:#ifdef OS_GLOBALS#define OS_EXT#else#define OS_EXT extern#endifOS_EXT INT32U OSIdleCtr;同時,uCOS_II.H有中以下定義:#define OS_GLOBALS#include “includes.h”當編譯器處理uCO

16、S_II.C時,它使得頭文件變成如下所示,因為OS_EXT被設(shè)置為空。INT32U OSIdleCtr;這樣編譯器就會將這些全局變量分配在內(nèi)存中。當編譯器處理其他.C文件時,頭文件變成了如下的樣子,因為OS_GLOBAL沒有定義,所以O(shè)S_EXT被定義為extern。extern INT32U OSIdleCtr;在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H 文件中定義一次就可以了。3. OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()的含義及作用?答:OS_ENTER_CRITICAL() :關(guān)中斷;OS_EXIT_C

17、RITICAL():開中斷。關(guān)中斷和開中斷是為了保護臨界段代碼。用戶的應(yīng)用代碼可以使用這兩個宏來開中斷和關(guān)中斷。很明顯,關(guān)中斷會影響中斷延遲,所以要特別小心。用戶還可以用信號量來保護臨界段代碼。4基于PC的服務(wù)中如何測量PC_DisplayChar()的執(zhí)行時間?答:測量PC_DisplayChar()的執(zhí)行時間的代碼如下:INT16U time; /定義時間變量PC_ElapsedInit(); /時鐘初始化PC_ElapsedStart(); /開始計時PC_DispChar(40, 24, A, DISP_FGND_WHITE); /執(zhí)行代碼time = PC_ElapsedStop()

18、; /結(jié)束計時5uC/OS-II的任務(wù)框架答:void task_xxx(void *pData)/* 該任務(wù)的初始化工作 */* 進入該任務(wù)的死循環(huán) */while(1) 每個用戶的任務(wù)都必須符合事件驅(qū)動的編程模型,即uC/OS-II的應(yīng)用程序都必須是“事件驅(qū)動的編程模型”。一個任務(wù)首先等待一個事件的發(fā)生,事件可以是系統(tǒng)中斷發(fā)出的,也可以是其它任務(wù)發(fā)出的,又可以是任務(wù)自身等待的時間片。當一個事件發(fā)生了,任務(wù)再作相應(yīng)處理,處理結(jié)束后又開始等待下一個事件的發(fā)生。如此周而復始的任務(wù)處理模型就是“事件驅(qū)動的編程模型”。事件驅(qū)動模型也涵蓋了中斷驅(qū)動模型,uC/OS-II事件歸根結(jié)底來自三個方面:(1)

19、中斷服務(wù)函數(shù)發(fā)送的事件(2)系統(tǒng)延時時間到所引起的(3)其它任務(wù)發(fā)送的事件。6 與共享資源打交道時,使之滿足互斥條件最一般的方法包括哪些?答: 包括:關(guān)中斷、使用測試并置位指令、禁止做任務(wù)切換、利用信號量等。7. 描述利用C/OS_ 宏調(diào)用關(guān)中斷和開中斷處理共享數(shù)據(jù)的示意性代碼程序。答: OS_ENTER_CRITICAL();/*在這里處理共享數(shù)據(jù)*/OS_EXIT_CRITICAL();8. 信號量的典型應(yīng)用包括哪些?答:信號量(Semaphores) 是一種約定機制,在多任務(wù)內(nèi)核中的典型應(yīng)用包括:(1) 控制共享資源的使用權(quán)(滿足互斥條件);(2) 標志某事件的發(fā)生(3) 使兩個任務(wù)的行

20、為同步9對信號量只能實施哪三種操作?答:一般地說,對信號量只能實施三種操作:(1) 初始化(INITIALIZE),也可稱作建立(CREATE);(2) 等信號(WAIT)也可稱作掛起(PEND);(3) 給信號(SIGNAL)或發(fā)信號(POST)。10.給出C/OS-中如何用信號量處理共享數(shù)據(jù)的示意代碼?答:通過獲得信號量處理共享數(shù)據(jù)的示意代碼如下:OS_EVENT *SharedDataSem;void Function (void)INT8U err;OSSemPend(SharedDataSem, 0, &err);/*共享數(shù)據(jù)的處理在此進行,(中斷是開著的)*/OSSemPost(S

21、haredDataSem);11.給出初始化和啟動C/OS-的示意代碼。答:void main (void) OSInit(); /* 初始化uC/OS-II */ . 通過調(diào)用OSTaskCreate()或OSTaskCreateExt()創(chuàng)建至少一個任務(wù); . OSStart(); /* 開始多任務(wù)調(diào)度!OSStart()永遠不會返回 */12 描述建立任務(wù)OSTaskCreate()的函數(shù)原型。答:建立任務(wù)OSTaskCreate()的函數(shù)原型為:INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos,

22、INT8U prio)其中,task: 任務(wù)代碼的指針;pdata: 當任務(wù)開始執(zhí)行時傳遞給任務(wù)的參數(shù)的指針;ptos: 分配給任務(wù)的堆棧的棧頂指針;prio: 分配給任務(wù)的優(yōu)先級。13任務(wù)可以是一個無限的循環(huán),也可以是在一次執(zhí)行完畢后被刪除掉。請給出示意代碼結(jié)構(gòu)。答:C/OS-描述的任務(wù)示意代碼必須是以下兩種結(jié)構(gòu)之一:void YourTask (void *pdata) for (;) /* 用戶代碼 */ 調(diào)用C/OS-的服務(wù)例程之一: OSMboxPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend

23、(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用戶代碼 */ 或void YourTask (void *pdata) /* 用戶代碼 */ OSTaskDel(OS_PRIO_SELF);14C/OS-任務(wù)管理提供哪些服務(wù)?答:C/OS-任務(wù)管理提供的服務(wù)包括:(1)建立任務(wù):OSTaskCreate()或OSTaskCreateExt();(2)刪除任務(wù):OSTaskDel();(3)請求刪除任務(wù):OSTaskDelReq();(4)改變?nèi)蝿?wù)的優(yōu)先級:OSTaskChangePrio();(5)掛起任務(wù):OSTaskSuspend();(

24、6)恢復任務(wù):OSTaskResume();(7)獲得有關(guān)任務(wù)的信息:OSTaskQuery()。15C/OS-時間任務(wù)管理提供哪些服務(wù)?答:C/OS-時間任務(wù)管理提供的服務(wù)包括:(1) 任務(wù)延時函數(shù):OSTimeDly()(2) 按時分秒延時函數(shù):OSTimeDlyHMSM()(3) 讓處在延時期的任務(wù)結(jié)束延時:OSTimeDlyResume()(4) 設(shè)置系統(tǒng)時間:OSTimeGet()(5) 獲得系統(tǒng)時間:OSTimeSet()16. C/OS-提供的數(shù)據(jù)共享和任務(wù)通訊的方法包括哪些?答:C/OS-提供的數(shù)據(jù)共享和任務(wù)通訊的方法包括五種方法:(1) 利用宏OS_ENTER_CRITICA

25、L()和OS_EXIT_CRITICAL()來關(guān)閉中斷和打開中斷。(2) 利用函數(shù)OSSchedLock()和OSSchekUnlock()對C/OS-II中的任務(wù)調(diào)度函數(shù)上鎖和開鎖。(3) 信號量。(4) 郵箱。(5) 消息隊列。17對于事件控制塊進行的一些通用包括哪些操作?答:對于事件控制塊進行的一些通用操作包括:(1) 初始化一個事件控制塊: OSEventWaitListInit();(2) 使一個任務(wù)進入就緒態(tài):OSEventTaskRdy();(3) 使一個任務(wù)進入等待該事件的狀態(tài):OSEventTaskWait();(4) 因為等待超時而使一個任務(wù)進入就緒態(tài):OSEventTO(

26、)。18C/OS-信號量提供哪些服務(wù)?答:C/OS-信號量提供的服務(wù)包括:(1) 建立一個信號量:OSSemCreate();(2) 等待一個信號量:OSSemPend();(3)發(fā)送一個信號量:OSSemPost();(4)無等待地請求一個信號量:OSSemAccept();(5)查詢一個信號量的當前狀態(tài):OSSemQuery()。19C/OS-郵箱提供哪些服務(wù)?答:C/OS-郵箱提供的服務(wù)包括:(1)建立一個郵箱:OSMboxCreate();(2)等待一個郵箱中的消息:OSMboxPend();(3)發(fā)送一個消息到郵箱中:OSMboxPost();(4)無等待地從郵箱中得到一個消息:OS

27、MboxAccept();(5)查詢一個郵箱的狀態(tài):OSMboxQuery()20C/OS-消息隊列提供哪些服務(wù)?答:C/OS-消息隊列提供的服務(wù)包括:(1)建立一個消息隊列:OSQCreate();(2)等待一個消息隊列中的消息:OSQPend();(3)向消息隊列發(fā)送一個消息(FIFO):OSQPost();(4)向消息隊列發(fā)送一個消息(LIFO):OSQPostFront();(5)無等待地從一個消息隊列中取得消息:OSQAccept();(6)清空一個消息隊列:OSQFlush();(7)查詢一個消息隊列的狀態(tài):OSQQuery()。21C/OS-內(nèi)存管理提供哪些服務(wù)?答:C/OS-內(nèi)

28、存管理提供的服務(wù)包括:(1) 建立一個內(nèi)存分區(qū):OSMemCreate();(2) 分配一個內(nèi)存塊:OSMemGet();(3) 釋放一個內(nèi)存塊:OSMemPut();(4) 查詢一個內(nèi)存分區(qū)的狀態(tài):OSMemQuery()。22移植C/OS-時,要使C/OS-正常運行,處理器必須滿足哪些基本要求?答:要使C/OS-正常運行,處理器必須滿足以下要求:(1) 處理器的C編譯器能產(chǎn)生可重入代碼。(2) 用C語言就可以打開和關(guān)閉中斷。(3) 處理器支持中斷,并且能產(chǎn)生定時中斷(通常在10至100Hz之間)。(4) 處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。(5) 處理器有將堆棧指針和

29、其它CPU寄存器讀出和存儲到堆?;騼?nèi)存中的指令。23. 描繪不可剝奪型內(nèi)核中斷響應(yīng)示意圖答:24. 舉例描述C/OS-II基于任務(wù)的應(yīng)用程序設(shè)計方法 答:#include #define TASK_STK_SIZE 128 OS_STK AppStk_oneTASK_STK_SIZE; /任務(wù)one的堆棧OS_STK AppStk_twoTASK_STK_SIZE; /任務(wù)two的堆棧 OS_STK AppStk_threeTASK_STK_SIZE; /任務(wù)three的堆棧 static void App_one(void *p_arg); /任務(wù)one代碼 static void App_

30、two(void *p_arg); /任務(wù)two代碼 static void App_three(void *p_arg); /任務(wù)three代碼 void main(int argc, char *argv) OSInit(); /初始化系統(tǒng) /依次創(chuàng)建三個任務(wù) OSTaskCreate(App_one,NULL,(OS_STK*)&AppStk_oneTASK_STK_SIZE-1,(INT8U)10); OSTaskCreate(App_two,NULL,(OS_STK*)&AppStk_twoTASK_STK_SIZE-1,(INT8U)20); OSTaskCreate(App_th

31、ree,NULL,(OS_STK*)&AppStk_threeTASK_STK_SIZE-1,(INT8U)30); OSStart(); /啟動多任務(wù),將CPU控制權(quán)交給系統(tǒng) 25. C/OS-II調(diào)度算法原理及其和調(diào)度方式 答:(1)優(yōu)先級調(diào)度算法原理為:給每一個任務(wù)分配一個惟一優(yōu)先級,各優(yōu)先級用一個整形數(shù)值標識,某優(yōu)先級的值越大,其優(yōu)先級越低:某優(yōu)先級的值越小,其優(yōu)先級越高。也就是說,如果當前操作系統(tǒng)準備進行調(diào)度,當有兩個任務(wù)處于就緒狀態(tài),系統(tǒng)將優(yōu)先執(zhí)行優(yōu)先級別高的任務(wù)。 (2) C/OS-II操作系統(tǒng)有兩種調(diào)度方式:任務(wù)級任務(wù)調(diào)度和中斷級任務(wù)調(diào)度,C/OS-II操作系統(tǒng)在完成中斷后允許

32、進行新的調(diào)度。26. 描述C/OS-II操作系統(tǒng)的任務(wù)級任務(wù)調(diào)度OS_Sched()的主要功能 答:(1)查找當前就緒表中最高優(yōu)先級任務(wù)的優(yōu)先級值; (2)調(diào)用OS_TASK_SW()進行任務(wù)切換,切換到新任務(wù)執(zhí)行。 27.從消息郵箱中讀取消息的方式及其函數(shù)原型 ? 答:(1) 從消息郵箱中讀取消息的方式包括:非阻塞式讀取和阻塞式讀取兩種方式。 (2) 非阻塞式讀取是指無論消息郵箱中是否有數(shù)據(jù),讀取操作也不阻塞,直接返回。顯然,如果有數(shù)據(jù),將讀取出來;如果沒有數(shù)據(jù),將讀取為NULL。 其函數(shù)原型為:void *OSMboxAccept (OS_EVENT *pevent) (3) 阻塞式讀取是

33、指在消息郵箱中有數(shù)據(jù)時,直接讀取出來;如果沒有數(shù)據(jù),則使當前任務(wù)進入等待狀態(tài),系統(tǒng)執(zhí)行調(diào)度程序執(zhí)行新的任務(wù),當下一次消息到來時將激活等待表中的最高優(yōu)先級任務(wù),從而使該任務(wù)進入就緒狀態(tài)。為了避免任務(wù)一直處于等待狀態(tài)(所等待的資源一直未分配),可以設(shè)置一個等待的時間范圍,當超過該延遲時,則直接返回。 其函數(shù)原型為:void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)四論述題1. 論述C/OS-控制下的任務(wù)狀態(tài)轉(zhuǎn)換圖答:C/OS-控制下的任務(wù)狀態(tài)轉(zhuǎn)換圖如下圖所示。在任一給定的時刻,任務(wù)的狀態(tài)一定是在這五種狀態(tài)之一。(1) 睡眠

34、態(tài)(DORMANT):指任務(wù)駐留在程序空間之中,還沒有交給C/OS-管理。一個任務(wù)可以通過調(diào)用OSTaskDel()返回到睡眠態(tài),或通過調(diào)用該函數(shù)讓另一個任務(wù)進入睡眠態(tài)。(2) 就緒態(tài)(READY):當任務(wù)一旦建立,這個任務(wù)就進入就緒態(tài)準備運行。把任務(wù)交給C/OS-是通過調(diào)用下述兩個函數(shù)之一:OSTaskCreate()或OSTaskCreateExt()。(3) 運行態(tài)(RUN): 調(diào)用OSStart()可以啟動多任務(wù)。OSStart()函數(shù)運行進入就緒態(tài)的優(yōu)先級最高的任務(wù)。(4) 等待狀態(tài)(WAITING): 正在運行的任務(wù)可以通過調(diào)用兩個函數(shù)之一將自身延遲一段時間,這兩個函數(shù)是OSTim

35、eDly()或OSTimeDlyHMSM()。這個任務(wù)于是進入等待狀態(tài),等待這段時間過去,下一個優(yōu)先級最高的、并進入了就緒態(tài)的任務(wù)立刻被賦予了CPU的控制權(quán)。正在運行的任務(wù)期待某一事件的發(fā)生時也要等待,手段是調(diào)用以下3個函數(shù)之一:OSSemPend(),OSMboxPend(),或OSQPend()。調(diào)用后任務(wù)進入了等待狀態(tài)(WAITING)。(5) 中斷狀態(tài)(ISR): 正在運行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)了,或者C/OS-將中斷關(guān)了。被中斷了的任務(wù)就進入了中斷服務(wù)態(tài)(ISR)。2. 論述C/OS-的核心數(shù)據(jù)結(jié)構(gòu)任務(wù)控制塊(OS_TCBs)答:任務(wù)控制塊(OS_TCBs)是C/O

36、S-的核心數(shù)據(jù)結(jié)構(gòu),當任務(wù)的CPU使用權(quán)被剝奪時,C/OS-用它來保存該任務(wù)的狀態(tài)。當任務(wù)重新得到CPU使用權(quán)時,任務(wù)控制塊能確保任務(wù)從當時被中斷的那一點絲毫不差地繼續(xù)執(zhí)行。OS_TCBs全部駐留在RAM中。一旦任務(wù)建立了,任務(wù)控制塊OS_TCBs將被賦值。C/OS-II任務(wù)控制塊數(shù)據(jù)結(jié)構(gòu)定義如下:typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN void *OSTCBExtPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; I

37、NT16U OSTCBId;#endif struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev;#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr;#endif#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN void *OSTCBMsg;#endif INT16U OSTCBDly; INT8U OSTCBStat; INT8U OSTCBPrio; INT8U OSTCBX; INT8U OSTCB

38、Y; INT8U OSTCBBitX; INT8U OSTCBBitY;#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;其中:OSTCBStkPtr是指向當前任務(wù)棧頂?shù)闹羔?。OSTCBExtPtr 指向用戶定義的任務(wù)控制塊擴展。OSTCBStkBottom是指向任務(wù)棧底的指針。OSTCBStkSize存有棧中可容納的指針元數(shù)目而不是用字節(jié)(Byte)表示的棧容量總數(shù)。OSTCBId用于存儲任務(wù)的識別碼。OSTCBNext和OSTCBPrev用于任務(wù)控制塊OS_TCBs的雙重鏈接。OSTCBEventPtr是指向事件控制塊的指針。OSTC

39、BMsg是指向傳給任務(wù)的消息的指針。OSTCBStat是任務(wù)的狀態(tài)字。OSTCBPrio是任務(wù)優(yōu)先級。OSTCBDelReq是一個布爾量,用于表示該任務(wù)是否需要刪除。OSTCBX, OSTCBY, OSTCBBitX和 OSTCBBitY用于加速任務(wù)進入就緒態(tài)的過程或進入等待事件發(fā)生狀態(tài)的過程。3論述事件控制塊ECB數(shù)據(jù)結(jié)構(gòu)答:C/OS-II通過uCOS_II.H 中定義的OS_EVENT數(shù)據(jù)結(jié)構(gòu)來維護一個事件控制塊的所有信息。該事件控制塊ECB數(shù)據(jù)結(jié)構(gòu)的定義如下:typedef struct void *OSEventPtr; /* 指向消息或者消息隊列的指針 */ INT8U OSEven

40、tTblOS_EVENT_TBL_SIZE; /* 等待任務(wù)列表 */ INT16U OSEventCnt; /* 計數(shù)器(當事件是信號量時) */ INT8U OSEventType; /* 時間類型 */ INT8U OSEventGrp; /* 等待任務(wù)所在的組 */ OS_EVENT;其中:OSEventPtr指針: 只有在所定義的事件是郵箱或者消息隊列時才使用。當所定義的事件是郵箱時,它指向一個消息,而當所定義的事件是消息隊列時,它指向一個數(shù)據(jù)結(jié)構(gòu).OSEventTbl 和 OSEventGrp: 兩者包含的是系統(tǒng)中處于就緒狀態(tài)的任務(wù)。OSEventCnt:當事件是一個信號量時,用于

41、信號量的計數(shù)器。OSEventType:定義了事件的具體類型。4論述C/OS-II內(nèi)存的管理的內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu)答:為了便于內(nèi)存的管理,在C/OS-II中使用內(nèi)存控制塊(memory control blocks)的數(shù)據(jù)結(jié)構(gòu)來跟蹤每一個內(nèi)存分區(qū),系統(tǒng)中的每個內(nèi)存分區(qū)都有它自己的內(nèi)存控制塊。內(nèi)存控制塊的數(shù)據(jù)結(jié)構(gòu)定義如下:typedef struct void *OSMemAddr; void *OSMemFreeList; INT32U OSMemBlkSize; INT32U OSMemNBlks; INT32U OSMemNFree; OS_MEM;其中:OSMemAddr是指向內(nèi)存分區(qū)起始

42、地址的指針。OSMemFreeList是指向下一個空閑內(nèi)存控制塊或者下一個空閑的內(nèi)存塊的指針。OSMemBlkSize是內(nèi)存分區(qū)中內(nèi)存塊的大小,是用戶建立該內(nèi)存分區(qū)時指定的。OSMemNBlks是內(nèi)存分區(qū)中總的內(nèi)存塊數(shù)量,也是用戶建立該內(nèi)存分區(qū)時指定的。OSMemNFree是內(nèi)存分區(qū)中當前可以得空閑內(nèi)存塊數(shù)量。五、uC_OS-II程序題一、編寫一個uC/OS-II應(yīng)用程序,要求:(1)包含兩個用戶任務(wù)(MyTask、YouTask)和兩個系統(tǒng)任務(wù)(統(tǒng)計任務(wù)、空閑任務(wù));(2)把MyTask作為起始任務(wù),MyTask、YouTask的優(yōu)先級分別為0、2;(3)當MyTask運行10次后對調(diào)度器進

43、行加鎖,運行到80次時對調(diào)度器進行解鎖;(4)當MyTask運行的運行次數(shù)大于85次后,要求YouTask刪除它自己,YouTask接到要求后,等待15s鐘,然后刪除自己。(這個程序要仔細點看,注釋寫得最詳細,這個看懂了,后面的就應(yīng)該也能看懂了,這三個程序大部分代碼都是差不多的,藍色粗體字的部分是一些關(guān)鍵語句或可能隨著題目要求變化的語句)#include includes.h #define TASK_STK_SIZE 512 /任務(wù)堆棧長度 OS_STK MyTaskStkTASK_STK_SIZE; /定義MyTask任務(wù)堆棧區(qū) OS_STK YouTaskStkTASK_STK_SIZE

44、; /定義YouTask任務(wù)堆棧區(qū) INT8U x=0,y=0;/這兩個變量分別用來指定要顯示字符的橫縱坐標,即列和行,標準的DOS窗口是80x25,也就是可以顯示80行、25列字符, /有了這兩個變量就可以將字符精確的顯示在DOS窗口的某個地方。 INT8U times=0;/這個變量用了記錄MyTask任務(wù)的運行次數(shù) void MyTask(void* pdata); void YouTask(void* pdata); void main (void) char* s_M=M; OSInit(); /初始化uCOS_II PC_DOSSaveReturn(); /保存Dos環(huán)境 PC_V

45、ectSet(uCOS, OSCtxSw); /安裝uCOS_II中斷 OSTaskCreate(MyTask, s_M, &MyTaskStkTASK_STK_SIZE - 1, 0);/ 創(chuàng)建起始任務(wù)(此題中要求將MyTask作為起始任務(wù)), 將s_M /作為參數(shù)傳遞給MyTask函數(shù),并將該任務(wù)的優(yōu)先級設(shè)置為0(優(yōu)先級按照題目的規(guī)定去設(shè)置,一般起始任務(wù)要設(shè)置為最高數(shù)值越小,優(yōu)先級越高)。 OSStart(); /啟動系統(tǒng) void MyTask (void *pdata)char*s_M=M;OSInit();/初始化uCOS_IIPC_DOSSaveReturn();/保存Dos環(huán)境P

46、C_VectSet(uCOS,OSCtxSw);/安裝uCOS_II中斷OSTaskCreate(MyTask,s_M,&MyTaskStkTASK_STK_SIZE-1,0);/創(chuàng)建起始任務(wù)(此題中要求將MyTask作為起始任務(wù)),將s_M/作為參數(shù)傳遞給MyTask函數(shù),并將該任務(wù)的優(yōu)先級設(shè)置為0(優(yōu)先級按照題目的規(guī)定去設(shè)置,一般起始任務(wù)要設(shè)置為最高數(shù)值越小,優(yōu)先級越高)。OSStart();/啟動系統(tǒng)voidMyTask(void*pdata)char*s_Y=Y;char*s=MyTask:IaskingYouTasktodeletehisown!;#ifOS_CRITICAL_MET

47、HOD=3/如果使用的是第3種方法來開關(guān)中斷,則需要用到cpu_sr這個變量來保存程序狀態(tài)字OS_CPU_SRcpu_sr;/定義cpu_sr這個變量#endifpdata=pdata;/這句可以不寫,僅僅只是為了防止編譯器報錯OS_ENTER_CRITICAL();/進入臨界段(關(guān)中斷)PC_VectSet(0x08,OSTickISR);/安裝uCOS_II時鐘中斷向量PC_SetTickRate(OS_TICKS_PER_SEC);/設(shè)置uCOS_II時鐘頻率OS_EXIT_CRITICAL();/退出臨界段(開中斷)OSStatInit();/創(chuàng)建和初始化uCOS_II的統(tǒng)計任務(wù)(這條

48、語句一定不能掉,不然會扣很多分的)OSTaskCreate(YouTask,s_Y,&YouTaskStkTASK_STK_SIZE-1,2);/在MyTask任務(wù)中創(chuàng)建YouTask任務(wù),優(yōu)先級為2for(;)if(times85)/如果MyTask任務(wù)的運行次數(shù)大于了85次,就要求YouTask任務(wù)刪除它自己(這個數(shù)值也是由題目規(guī)定的,題目要求/MyTask運行多少次后刪除YouTask就將此處改成多少while(OSTaskDelReq(2)!=OS_TASK_NOT_EXIST)/要注意OSTaskDelReq后括號中的2,這個數(shù)值是所要刪除的任務(wù)的/優(yōu)先級,要刪除哪個任務(wù)就在此處填入該任務(wù)的優(yōu)先級,該程序中,優(yōu)先級2對應(yīng)的任務(wù)為YouTaskPC_DispStr(10,8,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);/在屏幕上的第10列、第8行顯示s所代表的字符/串,s在上面已經(jīng)定義了。(這些DOS窗口的打印函數(shù)在書本附錄Apage263都有介紹)OSTimeDly(1);if(x50)/當一行打印的字符數(shù)大于了50個后,換行,換到該行下面的第二行(因為y=y+2),然后從行首開始打印(因為x=0)x=0;y+=2;times+=1; /每運行一次times加1,以記錄下MyTask任務(wù)的運行次數(shù)if(times=10)

溫馨提示

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

評論

0/150

提交評論