嵌入式程序設計復習題_第1頁
嵌入式程序設計復習題_第2頁
嵌入式程序設計復習題_第3頁
嵌入式程序設計復習題_第4頁
嵌入式程序設計復習題_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

嵌入式系統程序設計練習題;1.uC/OS-II是一個簡潔、易用的基于優先級的嵌入式搶占式多任務實時內核。2.任務是一個執行體,包括:代碼、控制塊和任務堆棧。3.任務代碼可是無返回的無窮循環,也可以是一次性代碼,但最后一定要刪除執行操作的一次性代碼;4.因為uc/os-ii總是運行進入就緒狀態中任務優先級最高,下面該哪個任務運行,這個工作就由調度器進行切換調度操作來完成的;5.任務級的調度是由函數OSSched()和函數OSIntExt()完成6.任務級的調度是由函數OSSched()完成的,而【中斷級】的調度是由函數OSIntExt()完成。對于OSSched(),它內部調用的是OS_TASK_SW()完成實際的調度;OSIntExt()內部調用的是OSCtxSw()實現調度。7.任務切換其實很簡單,由如下2步完成:〔1〕將被掛起任務的處理器存放器推入自己的任務堆棧。〔2〕然后將進入就緒狀態的最高優先級的任務的存放器值從堆棧中恢復到存放器中。8.任務的5種狀態。【睡眠態(taskdormat)】:任務駐留于程序空間〔rom或ram〕中,暫時沒交給ucos-ii處理。【就緒態〔taskready〕】:任務一旦建立,這個任務就進入了就緒態。【運行態〔taskrunning〕】:調用OSStart〔〕可以啟動多任務。OSStart〔〕函數只能調用一次,一旦調用,系統將運行進入就緒態并且優先級最高的任務。【等待狀態〔taskwaiting〕】:正在運行的任務,通過延遲函數或pend〔掛起〕相關函數后,將進入等待狀態。【中斷狀態〔ISRrunning〕】:正在運行的任務是可以被中斷的,除非該任務將中斷關閉或者ucos-ii將中斷關閉。9.【不可剝奪型】內核要求每個任務自我放棄CPU的所有權。不可剝奪型調度法也稱作合作型多任務調度法,各個任務彼此合作共享一個CPU。10.當系統響應時間很重要時,要使用【可剝奪型】內核。最高優先級的任務一旦就緒,總能得到CPU的控制權。11.使用可剝奪型內核時,應用程序不應直接使用不可重入型函數。調用不可重入型函數時,要滿足互斥條件,這一點可以用【互斥型信號量】來實現。(可重入〔reentrant〕函數可以由多于一個任務并發使用,而不必擔憂數據錯誤。相反,不可重入〔non-reentrant〕函數不能由超過一個任務所共享,除非能確保函數的互斥〔或者使用信號量,或者在代碼的關鍵局部禁用中斷〕。可重入函數可以在任意時刻被中斷,稍后再繼續運行,不會喪失數據。可重入函數要么使用本地變量,要么在使用全局變量時保護自己的數據。)12.【可重入型】函數可以被一個以上的任務調用,而不必擔憂數據的破壞。13.可重入型函數任何時候都可以被中斷,一段時間以后又可以運行,而相應數據不會喪失。可重入型函數或者只使用【局部變量】,即變量保存在CPU存放器中或堆棧中。如果使用全局變量,那么要對全局變量予以【保護】。14.每個任務都有其優先級。任務越重要,賦予的優先級應【越高】。15.μC/OS-Ⅱ初始化是通過調用系統函數【OSIint()】實現的,完成μC/OS-Ⅱ所有的變量和數據結構的初始化。16.多任務的啟動是用戶通過調用【OSStart()】實現的。然而,啟動μC/OS-Ⅱ之前,用戶至少要建立一個應用【任務】。17μC/OS-Ⅱ的參數配置文件名為【OS_CFG.H】。18.刪除任務,是說任務將返回并處于【休眠狀態】,并不是說任務的代碼被刪除了,只是任務的代碼不再被μC/OS-Ⅱ調用。19.μC/OS-Ⅱ要求用戶提供【定時中斷】來實現延時與超時控制等功能。20.定時中斷也叫做【時鐘節拍】,它應該每秒發生10至100次。21.時鐘節拍的實際頻率是由用戶的應用程序決定的。時鐘節拍的頻率越高,系統的負荷就【越重】。22.μC/OS-II中的信號量由兩局部組成:一個是信號量的【計數值】,它是一個16位的無符號整數〔0到65,535之間〕;另一個是由等待該信號量的任務組成的【等待任務表】。用戶要在OS_CFG.H中將OS_SEM_EN開關量常數置成【1】,這樣μC/OS-II才能支持信號量。23.μC/OS-II中表示當前已經創立的任務數全局變量名為:【OSTaskCtr】。24.μC/OS-II中表示當前內核運行的標記全局變量名為:【OSRunning】。25.在使用OSTaskCreate創立任務時,假設需要TaskData作偽參數傳遞給任務Task,并從任務Task中獲得傳入的字符參數值,請在下面【】填上適宜的代碼。charTaskData=?A?;OSTaskCreate(Task,【(void*)&TaskData】,&TaskStk[0][TASK_STK_SIZE-1],1);voidTask(void*pdata){charvalue=【*(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);}}26.在μC/OS-II在任務Task1中使用郵箱函數OSMboxPost〔〕發送字符;而在Task2中接收OSMboxPost〔〕字符,請在下面【】填上適宜的代碼。voidTask1(void*data){chartxmsg;INT8Uerr;…txmsg='A';for(;;){OSMboxPost(TxMbox,【(void*)&txmsg】);/*SendmessagetoTask2*/OSMboxPend(AckMbox,0,&err);txmsg++;if(txmsg=='Z'){txmsg='A';}}}voidTask5(void*data){char*rxmsg;INT8Uerr;data=data;for(;;){rxmsg=【(char*)】OSMboxPend(TxMbox,0,&err);PC_DispChar(70,18,*rxmsg,DISP_FGND_YELLOW+DISP_BGND_BLUE);OSMboxPost(AckMbox,(void*)1);}}27.在Task1中使用消息隊列OSQPend〔〕函數接收消息“HelloWorld!〞,而在Task2中使用消息隊列OSQPost〔〕函數發送消息“HelloWorld!〞,請在下面【】填上適宜的代碼.voidTask1(void*pdata){char*msg;INT8Uerr;pdata=pdata;for(;;){msg=【(char*)】OSQPend(MsgQueue,0,&err);PC_DispStr(70,13,msg,DISP_FGND_YELLOW+DISP_BGND_BLUE);OSTimeDlyHMSM(0,0,0,100);}}voidTask2(void*pdata){charmsg[20];pdata=pdata;strcpy(&msg[0],"HelloWorld!");for(;;){OSQPost(MsgQueue,【(void*)】&msg[0]);OSTimeDlyHMSM(0,0,0,500);}}28μC/OS-II操作系統使用OSSchedLock()函數和OSSchedUnlock()函數進行鎖定〔不允許任務級調度〕和解鎖〔重新允許任務級調度〕調度器,在用戶應用程序中,OSSchedLock()和OSSchedUnlock()是【成對出現的】,否那么系統有可能出錯。29.代碼的臨界段代碼的臨界段也稱為臨界區,指處理時不可分割的代碼。30.資源任何為任務所占用的實體都可稱為資源。資源可以是輸入輸出設備;資源也可以是一個變量,一個結構或一個數組等。31.共享資源可以被一個以上任務使用的資源叫做共享資源。32.任務一個任務,也稱作一個線程,是一個簡單的程序,該程序可以認為CPU完全只屬該程序自己。典型地、每個任務都是一個無限的循環。33.任務切換指ContextSwitch,其含義是CPU存放器內容切換。當多任務內核決定運行另外的任務時,它保存正在運行任務的當前狀態〔Context〕,即CPU存放器中的全部內容。34.內核多任務系統中,內核負責管理各個任務,或者說為每個任務分配CPU時間,并且負責任務之間的通訊。內核提供的根本效勞是任務切換。35.調度〔Scheduler〕內核的主要職責之一,就是要決定該輪到哪個任務運行了。多數實時內核是基于優先級調度法的。36.可剝奪型內核最高優先級的任務一旦就緒,總能得到CPU的控制權。當一個運行著的任務使一個比它優先級高的任務進入了就緒態,當前任務的CPU使用權就被剝奪了,或者說被掛起了,那個高優先級的任務立刻得到了CPU的控制權。如果是中斷效勞子程序使一個高優先級的任務進入就緒態,中斷完成時,中斷了的任務被掛起,優先級高的那個任務開始運行。37.任務根本信息內涵(1)CPU中的PC存放器:任務〔程序〕當前執行的位置;(2)CPU中的通用存放器:任務當前執行代碼所涉及的臨時數據;(3)CPU中的狀態存放器:存儲當前CPU的狀態。38.任務切換任務切換是指從一個任務直接切換到另一個任務,引起該次切換是由于某一個非中斷引起的事件或主動放棄或調用節拍函數時,使一個更高優先級的任務處于就緒狀態,暫停正在運行著的任務,轉而切換去執行更高優先級任務;也可由中斷后,中斷退出時進行任務調度,重新去執行更高優先級任務。39.舉例說明μCOS-II可移植型數據類型的定義方式答:因為不同的微處理器有不同的字長,μC/OS-II的移植文件包括很多類型定義以確保可移植性。μCOS-II不使用C語言中的short,int,long等數據類型的定義,因為它們與處理器類型有關,隱含著不可移植性。μC/OS-II代之以移植性強的整數數據類型,這樣,既直觀又可移植(該數據類型不依賴于編譯),舉例如下:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedintINT16U;typedefsignedintINT16S;typedefunsignedlongINT32U;typedefsignedlongINT32S;40.μCOS-II如何定義全局變量?答:眾所周知,全局變量應該是得到內存分配且可以被其他模塊通過C語言中extern關鍵字調用的變量。因此,必須在.C和.H文件中定義。這種重復的定義很容易導致錯誤。μCOS-II采用的方法只需用在頭文件中定義一次。uC/OS_II.H頭文件中包括以下定義全局宏定義:#ifdefOS_GLOBALS#defineOS_EXT#else#defineOS_EXTextern#endifOS_EXTINT32UOSIdleCtr;同時,uCOS_II.H有中以下定義:#defineOS_GLOBALS#include“includes.h〞當編譯器處理uCOS_II.C時,它使得頭文件變成如下所示,因為OS_EXT被設置為空。INT32UOSIdleCtr;這樣編譯器就會將這些全局變量分配在內存中。當編譯器處理其他.C文件時,頭文件變成了如下的樣子,因為OS_GLOBAL沒有定義,所以OS_EXT被定義為extern。externINT32UOSIdleCtr;在這種情況下,不產生內存分配,而任何.C文件都可以使用這些變量。這樣的就只需在.H文件中定義一次就可以了。41.OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()的含義及作用?答:OS_ENTER_CRITICAL():關中斷;OS_EXIT_CRITICAL():開中斷。關中斷和開中斷是為了保護臨界段代碼。用戶的應用代碼可以使用這兩個宏來開中斷和關中斷。很明顯,關中斷會影響中斷延遲,所以要特別小心。用戶還可以用信號量來保護臨界段代碼。42.基于PC的效勞中如何測量PC_DisplayChar()的執行時間?答:測量PC_DisplayChar()的執行時間的代碼如下:INT16Utime;//定義時間變量PC_ElapsedInit();//時鐘初始化PC_ElapsedStart();//開始計時PC_DispChar(40,24,?A?,DISP_FGND_WHITE);//執行代碼time=PC_ElapsedStop();//結束計時43.uC/OS-II的任務框架答:voidtask_xxx(void*pData){/*該任務的初始化工作*/??/*進入該任務的死循環*/while(1){??}}每個用戶的任務都必須符合事件驅動的編程模型,即uC/OS-II的應用程序都必須是“事件驅動的編程模型〞。一個任務首先等待一個事件的發生,事件可以是系統中斷發出的,也可以是其它任務發出的,又可以是任務自身等待的時間片。當一個事件發生了,任務再作相應處理,處理結束后又開始等待下一個事件的發生。如此周而復始的任務處理模型就是“事件驅動的編程模型〞。事件驅動模型也涵蓋了中斷驅動模型,uC/OS-II事件歸根結底來自三個方面:(1)中斷效勞函數發送的事件(2)系統延時時間到所引起的(3)其它任務發送的事件。44.與共享資源打交道時,使之滿足互斥條件最一般的方法包括哪些?答:包括:關中斷、使用測試并置位指令、禁止做任務切換、利用信號量等。45.描述利用μC/OS_Ⅱ宏調用關中斷和開中斷處理共享數據的示意性代碼程答:OS_ENTER_CRITICAL();/*在這里處理共享數據*/OS_EXIT_CRITICAL();46.信號量的典型應用包括哪些?答:信號量(Semaphores)是一種約定機制,在多任務內核中的典型應用包括:〔1〕控制共享資源的使用權(滿足互斥條件);〔2〕標志某事件的發生〔3〕使兩個任務的行為同步47.對信號量只能實施哪三種操作?答:一般地說,對信號量只能實施三種操作:〔1〕初始化(INITIALIZE),也可稱作建立(CREATE);〔2〕等信號(WAIT)也可稱作掛起(PEND);〔3〕給信號(SIGNAL)或發信號(POST)。48.給出μC/OS-Ⅱ中如何用信號量處理共享數據的示意代碼?答:通過獲得信號量處理共享數據的示意代碼如下:OS_EVENT*SharedDataSem;voidFunction(void){INT8Uerr;OSSemPend(SharedDataSem,0,&err);/*共享數據的處理在此進行,(中斷是開著的)*/OSSemPost(SharedDataSem);}49.給出初始化和啟動μC/OS-Ⅱ的示意代碼。答:voidmain(void){OSInit();/*初始化uC/OS-II*/.通過調用OSTaskCreate()或OSTaskCreateExt()創立至少一個任務;.OSStart();/*開始多任務調度!OSStart()永遠不會返回*/}50.描述建立任務OSTaskCreate()的函數原型。建立任務OSTaskCreate()的函數原型為:INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)其中,task:任務代碼的指針;pdata:當任務開始執行時傳遞給任務的參數的指針;ptos:分配給任務的堆棧的棧頂指針;prio:分配給任務的優先級。51.任務可以是一個無限的循環,也可以是在一次執行完畢后被刪除掉。請給出示意代碼結構。答:μC/OS-Ⅱ描述的任務示意代碼必須是以下兩種結構之一:voidYourTask(void*pdata){for(;;){/*用戶代碼*/調用μC/OS-Ⅱ的效勞例程之一:OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/*用戶代碼*/}}或voidYourTask(void*pdata){/*用戶代碼*/OSTaskDel(OS_PRIO_SELF);}52.μC/OS-Ⅱ任務管理提供哪些效勞?答:μC/OS-Ⅱ任務管理提供的效勞包括:〔1〕建立任務:OSTaskCreate()或OSTaskCreateExt();〔2〕刪除任務:OSTaskDel();〔3〕請求刪除任務:OSTaskDelReq();〔4〕改變任務的優先級:OSTaskChangePrio();〔5〕掛起任務:OSTaskSuspend();〔6〕恢復任務:OSTaskResume();〔7〕獲得有關任務的信息:OSTaskQuery()。53.μC/OS-Ⅱ時間任務管理提供哪些效勞?答:μC/OS-Ⅱ時間任務管理提供的效勞包括:〔1〕任務延時函數:OSTimeDly()〔2〕按時分秒延時函數:OSTimeDlyHMSM()〔3〕讓處在延時期的任務結束延時:OSTimeDlyResume()〔4〕設置系統時間:OSTimeGet()〔5〕獲得系統時間:OSTimeSet()54.μC/OS-Ⅱ提供的數據共享和任務通訊的方法包括哪些?答:μC/OS-Ⅱ提供的數據共享和任務通訊的方法包括五種方法:(1)利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來關閉中斷和翻開中斷。(2)利用函數OSSchedLock()和OSSchekUnlock()對μC/OS-II中的任務調度函數上鎖和開鎖。(3)信號量。(4)郵箱。(5)消息隊列。55.對于事件控制塊進行的一些通用包括哪些操作?答:對于事件控制塊進行的一些通用操作包括:〔1〕初始化一個事件控制塊:OSEventWaitListInit();〔2〕使一個任務進入就緒態:OSEventTaskRdy();〔3〕使一個任務進入等待該事件的狀態:OSEventTaskWait();〔4〕因為等待超時而使一個任務進入就緒態:OSEventTO()。56.μC/OS-Ⅱ信號量提供哪些效勞?答:μC/OS-Ⅱ信號量提供的效勞包括:〔1〕建立一個信號量:OSSemCreate();〔2〕等待一個信號量:OSSemPend();〔3〕發送一個信號量:OSSemPost();〔4〕無等待地請求一個信號量:OSSemAccept();〔5〕查詢一個信號量的當前狀態:OSSemQuery()。57.μC/OS-Ⅱ郵箱提供哪些效勞?答:μC/OS-Ⅱ郵箱提供的效勞包括:〔1〕建立一個郵箱:OSMboxCreate();〔2〕等待一個郵箱中的消息:OSMboxPend();〔3〕發送一個消息到郵箱中:OSMboxPost();〔4〕無等待地從郵箱中得到一個消息:OSMboxAccept();〔5〕查詢一個郵箱的狀態:OSMboxQuery()58.μC/OS-Ⅱ消息隊列提供哪些效勞?答:μC/OS-Ⅱ消息隊列提供的效勞包括:;〔1〕建立一個消息隊列:OSQCreate();;〔2〕等待一個消息隊列中的消息:OSQPend(;〔3〕向消息隊列發送一個消息〔FIFO〕:OSQ;〔4〕向消息隊列發送一個消息〔LIFO〕:OSQ;〔5〕無等待地從一個消息隊列中取得消息:OSQA;〔6〕清空一個消息隊列:OSQFlush();;〔7〕查詢一個消息答:μC/OS-Ⅱ消息隊列提供的效勞包括:〔1〕建立一個消息隊列:OSQCreate();〔2〕等待一個消息隊列中的消息:OSQPend();〔3〕向消息隊列發送一個消息〔FIFO〕:OSQPost();〔4〕向消息隊列發送一個消息〔LIFO〕:OSQPostFront();〔5〕無等待地從一個消息隊列中取得消息:OSQAccept();〔6〕清空一個消息隊列:OSQFlush();〔7〕查詢一個消息隊列的狀態:OSQQuery()。59.μC/OS-Ⅱ內存管理提供哪些效勞?答:μC/OS-Ⅱ內存管理提供的效勞包括:〔1〕建立一個內存分區:OSMemCreate();〔2〕分配一個內存塊:OSMemGet();〔3〕釋放一個內存塊:OSMemPut();〔4〕查詢一個內存分區的狀態:OSMemQuery()。60.移植μC/OS-Ⅱ時,要使μC/OS-Ⅱ正常運行,處理器必須滿足哪些根本要求?答:要使μC/OS-Ⅱ正常運行,處理器必須滿足以下要求:(1)處理器的C編譯器能產生可重入代碼。(2)用C語言就可以翻開和關閉中斷。(3)處理器支持中斷,并且能產生定時中斷(通常在10至100Hz之間)。(4)處理器支持能夠容納一定量數據(可能是幾千字節)的硬件堆棧。(5)處理器有將堆棧指針和其它CPU存放器讀出和存儲到堆棧或內存中的指令。61.舉例描述μC/OS-II基于任務的應用程序設計方法答:#include<includes.h>#defineTASK_STK_SIZE128OS_STKAppStk_one[TASK_STK_SIZE];//任務one的堆棧OS_STKAppStk_two[TASK_STK_SIZE];//任務two的堆棧OS_STKAppStk_three[TASK_STK_SIZE];//任務three的堆棧staticvoidApp_one(void*p_arg);//任務one代碼staticvoidApp_two(void*p_arg);//任務two代碼staticvoidApp_three(void*p_arg);//任務three代碼voidmain(intargc,char*argv[]){OSInit();//初始化系統//依次創立三個任務OSTaskCreate(App_one,NULL,(OS_STK*)&AppStk_one[TASK_STK_SIZE-1],(INT8U)10);OSTaskCreate(App_two,NULL,(OS_STK*)&AppStk_two[TASK_STK_SIZE-1],(INT8U)20);OSTaskCreate(App_three,NULL,(OS_STK*)&AppStk_three[TASK_STK_SIZE-1],(INT8U)30);OSStart();啟動多任務,將CPU控制權交給系統}62.μC/OS-II調度算法原理及其和調度方式答:〔1〕優先級調度算法原理為:給每一個任務分配一個惟一優先級,各優先級用一個整形數值標識,某優先級的值越大,其優先級越低;某優先級的值越小,其優先級越高。也就是說,如果當前操作系統準備進行調度,當有兩個任務處于就緒狀態,系統將優先執行優先級別高的任務。(2)μC/OS-II操作系統有兩種調度方式:任務級任務調度和中斷級任務調度,μC/OS-II操作系統在完成中斷后允許進行新的調度。63.描述μC/OS-II操作系統的任務級任務調度OS_Sched()的主要功能答:〔1〕查找當前就緒表中最高優先級任務的優先級值;〔2〕調用OS_SchedNew()函數進行任務切換,切換到新任務執行。64.從消息郵箱中讀取消息的方式及其函數原型?答:(1)從消息郵箱中讀取消息的方式包括:非阻塞式讀取和阻塞式讀取兩種方式。(2)非阻塞式讀取是指無論消息郵箱中是否有數據,讀取操作也不阻塞,直接返回,顯然,如果有數據,將讀取出來,如果沒有數據,將讀取為NULL。其函數原型為:void*OSMboxAccept(OS_EVENT*pevent)(3)阻塞式讀取是指在消息郵箱中有數據時,直接讀取出來;如果沒有數據,那么使當前任務進入等待狀態,系統執行調度程序執行新的任務,當下一次消息到來時將激活等待表中的最高優先級任務,從而使該任務進入就緒狀態。為了防止任務一直處于等待狀態〔所等待的資源一直未分配〕,可以設置一個等待的時間范圍,當超過該延遲時,那么直接返回。其函數原型為:void*OSMboxPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)65.論述μC/OS-Ⅱ控制下的任務狀態轉換圖答:μC/OS-Ⅱ控制下的任務狀態轉換圖如下列圖所示。在任一給定的時刻,任務的狀態一定是在這五種狀態之一。(1)睡眠態〔DORMANT〕:指任務駐留在程序空間之中,還沒有交給μC/OS-Ⅱ管理。一個任務可以通過調用OSTaskDel()返回到睡眠態,或通過調用該函數讓另一個任務進入睡眠態。(2)就緒態(READY):當任務一旦建立,這個任務就進入就緒態準備運行。把任務交給μC/OS-Ⅱ是通過調用下述兩個函數之一:OSTaskCreate()或OSTaskCreateExt()。(3)運行態(RUN):調用OSStart()可以啟動多任務。OSStart()函數運行進入就緒態的優先級最高的任務。(4)等待狀態(WAITING):正在運行的任務可以通過調用兩個函數之一將自身延遲一段時間,這兩個函數是OSTimeDly()或OSTimeDlyHMSM()。這個任務于是進入等待狀態,等待這段時間過去,下一個優先級最高的、并進入了就緒態的任務立刻被賦予了CPU的控制權。正在運行的任務期待某一事件的發生時也要等待,手段是調用以下3個函數之一:OSSemPend(),OSMboxPend(),或OSQPend()。調用后任務進入了等待狀態〔WAITING〕。(5)中斷狀態(ISR):正在運行的任務是可以被中斷的,除非該任務將中斷關了,或者μC/OS-Ⅱ將中斷關了。被中斷了的任務就進入了中斷效勞態〔ISR〕。66.論述μC/OS-Ⅱ的核心數據結構任務控制塊(OS_TCBs)答:任務控制塊(OS_TCBs)是μC/OS-Ⅱ的核心數據結構,當任務的CPU使用權被剝奪時,μC/OS-Ⅱ用它來保存該任務的狀態。當任務重新得到CPU使用權時,任務控制塊能確保任務從當時被中斷的那一點絲毫不差地繼續執行。OS_TCBs全部駐留在RAM中。一旦任務建立了,任務控制塊OS_TCBs將被賦值。μC/OS-II任務控制塊數據結構定義如下:typedefstructos_tcb{OS_STK*OSTCBStkPtr;#ifOS_TASK_CREATE_EXT_ENvoid*OSTCBExtPtr;OS_STK*OSTCBStkBottom;INT32UOSTCBStkSize;INT16UOSTCBOpt;INT16UOSTCBId;#endifstructos_tcb*OSTCBNext;structos_tcb*OSTCBPrev;#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_ENOS_EVENT*OSTCBEventPtr;#endif#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_ENvoid*OSTCBMsg;#endifINT16UOSTCBDly;INT8UOSTCBStat;INT8UOSTCBPrio;INT8UOSTCBX;INT8UOSTCBY;INT8UOSTCBBitX;INT8UOSTCBBitY;#ifOS_TASK_DEL_ENBOOLEANOSTCBDelReq;#endif}OS_TCB;其中:OSTCBStkPtr是指向當前任務棧頂的指針。OSTCBExtPtr指向用戶定義的任務控制塊擴展。OSTCBStkBottom是指向任務棧底的指針。OSTCBStkSize存有棧中可容納的指針元數目而不是用字節〔Byte〕表示的棧容量總數。OSTCBId用于存儲任務的識別碼。OSTCBNext和OSTCBPrev用于任務控制塊OS_TCBs的雙重鏈接。OSTCBEventPtr是指向事件控制塊的指針。OSTCBMsg是指向傳給任務的消息的指針。OSTCBStat是任務的狀態字。OSTCBPrio是任務優先級。OSTCBDelReq是一個布爾量,用于表示該任務是否需要刪除。OSTCBX,OSTCBY,OSTCBBitX和OSTCBBitY用于加速任務進入就緒態的過程或進入等待事件發生狀態的過程。3.論述事件控制塊ECB數據結構答:μC/OS-II通過uCOS_II.H中定義的OS_EVENT數據結構來維護一個事件控制塊的所有信息。該事件控制塊ECB數據結構的定義如下:typedefstruct{void*OSEventPtr;/*指向消息或者消息隊列的指針*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任務列表*/INT16UOSEventCnt;/*計數器(當事件是信號量時)*/INT8UOSEventType;/*時間類型*/INT8UOSEventGrp;/*等待任務所在的組*/}OS_EVENT;其中:OSEventPtr指針:只有在所定義的事件是郵箱或者消息隊列時才使用。當所定義的事件是郵箱時,它指向一個消息,而當所定義的事件是消息隊列時,它指向一個數據結構.OSEventTbl[]和OSEventGrp:兩者包含的是系統中處于就緒狀態的任務。OSEventCnt:當事件是一個信號量時,用于信號量的計數器。OSEventType:定義了事件的具體類型。67.論述μC/OS-II內存的管理的內存控制塊數據結構答:為了便于內存的管理,在μC/OS-II中使用;內存控制塊的數據結構定義如下:;typedefstruct{;void*OSMemAddr;;void*OSMemFreeList;;INT32UOSMemBlkSize;;INT32UOSMemNBlks;;INT32UOSMemNFree;;}OS_MEM;;其中:;OSMemAddr是指向內存分區起始地答:為了便于內存的管理,在μC/OS-II中使用內存控制塊〔memorycontrolblocks〕的數據結構來跟蹤每一個內存分區,系統中的每個內存分區都有它自己的內存控制塊。內存控制塊的數據結構定義如下:typedefstruct{void*OSMemAddr;void*OSMemFreeList;INT32UOSMemBlkSize;INT32UOSMemNBlks;INT32UOSMemNFree;}OS_MEM;其中:OSMemAddr是指向內存分區起始地址的指針。OSMemFreeList是指向下一個空閑內存控制塊或者下一個空閑的內存塊的指針。OSMemBlkSize是內存分區中內存塊的大小,是用戶建立該內存分區時指定的。OSMemNBlks是內存分區中總的內存塊數量,也是用戶建立該內存分區時指定的。OSMemNFree是內存分區中當前可以得空閑內存塊數量。68、啟動μC/OS-II任務的函數是_OSStart()_。69、OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)功能是_創立任務__。70、μC/OS-II用來記錄任務的堆棧指針、任務的當前狀態、任務的優先級別的數據結構稱為任務控制塊〔OS_TCB〕。71、μC/OS-II有兩種調度器,一種是任務級的調度器;另一種是中斷級的調度器。72、voidOSTimeDly(INT16Uticks)中參數ticks是指_定時計數器確定的時間段,又稱節拍_。73、OSTimeDly〔〕或OSTimeDlyHMSM()的作用是___延時操作__。74、如果OSEventGrp的值是01101000〔二進制〕,而對應的OSUnMapTbl[OSEventGrp]值為3,如果.OSEventTbl[3]的值是11100100〔二進制〕,OSUnMapTbl[OSEventTbl[3]]的值為2,那么處于等待狀態的任務的最高優先級是3×8+2=26。75、能防止出現優先級反轉現象的信號叫做互斥型信號量。76、消息郵箱是能在任務之間傳遞消息的指針的數據結構。77、μC/OS-II的任務狀態有5個狀態;分別是:1〕睡眠狀態;2〕就緒狀態;3〕運行狀態;4〕等待狀態;5〕中斷效勞狀態。78、從任務的存儲結構來看,μC/OS-II的任務由三個組成局部構成,其三局部為:1〕任務程序代碼;2〕任務堆棧;3〕任務控制塊。79、μC/OS-II任務優先級最多可建立64級,其中設定0級為最高級。80、操作消息隊列時向指針數組中插入消息指針有2種方式,它們是:先進先出(FIFO)方式和后進先出(LIFO)方式。81、μC/OS-II任務的代碼結構是〔C〕。對象結構;B〕數據結構;C〕一個帶有臨界段的無限循環;D〕表結構。82、μC/OS-II的任務控制塊是采用〔B〕結構。A〕一條鏈表;B〕兩條鏈表;C〕三條鏈表;D〕四條鏈表;83、μC/OS-II中指向當前正在運行的任務指針為(B)。A〕OSTCBListB)OSTCBCurC)OSTCBFreeListD)OSEVENTList84、μC/OS-II中空任務控制鏈表的創立是由(B)函數實現的。A〕OSTCBInit()B)OSInit()C)OSTaskCreate()D)OSStart()85、解決任務優先級反轉現象的方法是建立〔D〕A〕消息郵箱B〕信號量C〕消息隊列D〕互斥型信號量86、變量OSRdyGrp有作用是(C)?記錄就緒任務的分組信息B〕記錄就緒任務優先級C)記錄就緒表分組后組內有否就緒信息C〕記錄就緒任務是否就緒87、請求信號量函數是〔D〕。A〕OSFlagPend()B)OSMboxPend()C)OSQPend()D)OSSemPend()88、μC/OS-II中OSTCBDly變量是按〔C〕計算進行的。A〕秒B〕毫秒C〕節拍D〕微秒89、什么是代碼的臨界區?答:代碼的監界區是指處理時不可分割的代碼,運行這些代碼不允許被打斷。一旦這局部代碼開始執行,那么不允許任何中斷打入。中斷不調用任何臨界區的代碼或不訪問任何臨界區使用的共享資源時,這個中斷是可能可以執行。為確保臨界區代碼的執行,在進入臨界區之前要關中斷,而臨界區代碼執行完成以后要立即開中斷。90、什么是嵌入式操作系統?為何要使用嵌入式操作系統?答:運用在嵌入式系統上的實時操作系統,具有事件驅動和任務〔進程〕調度功能,且在有限時隙內能完成事件的響應和任務〔進程〕的切換,能可靠、實時、靈活地管理嵌入式系統上的各種資源和任務。使用嵌入式操作系統,能方便實時應用軟件的開發和有機地整合,能有效地管理和協調各項工作,因此是開發和運行非常重要的環境。91、請寫出從任務就緒表中獲取優先級別最高的就緒任務優先級prio的代碼段:答:y=OSUnMapTal[OSRdyGrp];x=OSUnMapTal[OSRdyTbl[y]];prio=(y<<3)+x;或y=OSUnMapTbl[OSRdyGrp];prio=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);92、初始化函數OSInit()對數據結構進行初始化時,請舉出4個主要是創立內容?答:主要創立的內容是(1)空的內任務控制塊鏈表〔OSTCBFreeList〕;(2)空的事件控制塊鏈表〔OSEventFreeList〕;(3)空的消息隊列控制塊鏈表(OSQFreeList);(4)空的標志控制塊鏈表(OSFlagFreeList);(5)存儲控制塊鏈表(OSMemFreeList);93、簡述μC/OS-II的中斷過程?答:系統接收到中斷請求后,如果這時CPU處于中斷允許狀態〔即中斷是開放的〕,系統就會中止正在運行的當前任務,而按照中斷向量的指向轉而去運行中斷效勞子程序;當中斷效勞子程序的運行結束后,系統將會根據情況返回到被中止的任務繼續運行,或者轉向運行另一個具有更高優先級別的就緒任務。94、為什么μC/OS-II的中斷效勞子程序中不能請求信號量?答:這是由于OSSemPend〔〕的執行同時要執行OSEventTaskWait(),而中斷效勞子程序并非任務代碼,也就是非任務請求,顯然請求的實體不合理,導致程序執行錯誤。95、任務級切換和中斷級任務切換為什么沒有使用同一切換函數?答:中斷切換時要保護的操作已在中斷效勞子程序中完成,因此OSIntCtxSw()中不包含保護代碼,即無需壓棧操作,而任務級切換OSCtxSw()就多一些保護代碼段。96、描述μC/OS-II中的信號量結構組成?μC/OS-II中的信號量由兩局部組成:一個是信號量的計數值,它是一個16位的無符號整數〔0到65,535之間〕;另一個是由等待該信號量的任務組成的等待任務表。用戶要在OS_CFG.H中將OS_SEM_EN開關量常數置成1,這樣μC/OS-II才能支持信號量。97、互斥型信號量是如何防止優先級反轉現象出現的?答:互斥型信號量是一個二值信號量,其事件控制塊中,成員OSEventCnt被分成了低8位和高8位兩局部,低8位用來存放信號值〔該值為0xFF時,信號為有效,否那么信號為無效〕,高8位用來存放防止出現優先級反轉現象而提升的優先級別prio。當任務占有一個獨占式共享資源時,事件控制塊的成員OSEventCnt低8位就不再是0xFF,如果任務的優先級不是最高的,此時,就要將成員OSEventCnt高8位作為本任務的prio,以使任務的優先級此時最高,防止優先級反轉現象出現。98、什么叫消息郵箱?答:在多任務間需要在任務與任務之間傳遞一個數據的方式,該數據是在存儲空間開出一個緩沖區的內容,建立緩沖區指針,并能傳遞指針的數據結構稱為消息郵箱。99、請描述標志組中的OSFlagFlags和等待任務鏈表OSFlagNodeFlags作用?答:OSFlagFlags提供信號量集的所有信號狀態,每一個信號占據一個二進制位。當所占位為1時,表示此信號量集中該信號量有效,否那么該信號量無效。從而區分信號量集中信號量的分布特點。而等待任務鏈表OSFlagNodeFlags是任務請求信號集的過濾器,通過該變量,把任務需要的信號量篩選出來,而其余信號屏蔽掉。100、請解釋OS_CRITICAL_METHOD=1或2或3的含義?答:OS_CRITICAL_METHOD=1時直接使用處理器的開中斷和關中斷指令來實現宏;OS_CRITICAL_METHOD=2時帶有保存中斷允許標志,且直接使用處理器的開中斷和關中斷指令來實現;OS_CRITICAL_METHOD=3時,使用用C編譯器具有擴展功能。關中斷的同時將程序狀態字保存在全局變量sr中而不必壓到堆棧里。101、任務級切換和中斷級任務切換為什么沒有使用同一切換函數?答:中斷切換時要保護的操作已在中斷效勞子程序中完成,因此OSIntCtxSw()中不包含保護代碼,即無需壓棧操作,而任務級切換OSCtxSw()就多一些保護代碼段。102、什么是可剝奪型內核?答:CPU總是運行多個任務中優先級別最高的那個任務,即使CPU正在運行某個低優先級別的任務,當有高優先級別的任務準備就緒時,該高級別的任務就會剝奪正在運行任務的CPU使用權,而使自已獲得CPU的使用權。這種操作規那么的CPU內核稱為可剝奪型內核。103、什么叫可重入函數?答:在多任務操作系統中,系統提供的函數應該能允許同時被多個任務所調用,而不會通過函數中變量的耦合引起任務之間的相互干擾。這樣的函數叫做可重入函數。104、請簡明分析OSSched〔〕代碼每條番號語句的的含義;voidOSSched(void){INT8Uy;OS_ENTER_CRITICAL();(1)if((OSLockNesting|OSIntNesting)==0){(2)y=OSUnMapTbl[OSRdyGrp];(3)OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);(4)if(OSPrioHighRdy!=OSPrioCur){(5)OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];(6)OSCtxSwCtr++;(7)OS_TASK_SW();(8)}}OS_EXIT_CRITICAL();(9)}答:104、請寫出μC/OS-II系統啟動運行時的示意結構代碼(包括主函數及任務函數)答:#include“includes.h〞#defineMy_TASK_STK_SIZE512voidmain(void){OSInit();………OSTaskCreate(MyTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE-1],6);OSStart();}voidMyTask(void*pdata){OSStatInit();TaskStartCreateTasks();For(;;){}}105、設計一個有兩個任務的應用程序,其中一個任務用來進行兩個數的加法運算,另一個任務那么用來顯示結果。〔采用消息郵箱實現〕〔其顯示函數為PC_DispStr(40,0,ss,DIS_BGND_BLACK+DISP_FGND_WHITE)〕答:#include“includes.h〞#defineMy_TASK_STK_SIZE512OS_EVENT*Str_BoxINT8UA=10;INT8UB=20;INT8Uerr;Char*ss;voidMyTask(void*data);voidDispTask(void*data);voidmain(void){OSInit();………Str_Box=OSMboxCreate((void*)0);OSTaskCreate(MyTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE-1],0);OSStart();}voidMyTask(void*pdata){INT8UC;OSStatInit();OSTaskCreate(DispTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE-1],1);For(;;){C=A+B;Sprintf(s,“%d〞,C);OSMboxPost(Str_Box,s);OSTimeDlyHMSM(0,0,1,0);}}}voidDispTask(void*data){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;;){ss=OSMboxPend(Str_Box,10,&err);PC_DispStr(15,0,ss,DIS_BGND_BLACK+DISP_FGND_WHITE);OSTimeDlyHMSM(0,0,1,0);}}106、設計當有按鍵操作時,實現一次A/D轉換和顯示的應用程序,即按一次鍵,僅實現一次A/D轉換,每一次A/D轉換任務要求采樣200次,采樣間隔10ms的共200個數據,并顯示出來。〔程序中要求包含采用消息郵箱和信號量以及時間中斷進行設計〕〔其顯示函數為PC_DispStr(40,0,ss,DIS_BGND_BLACK+DISP_FGND_WHITE)〕解:#include“config.h〞#defineKEY(1<<20)#defineTaskStk100OS_STKTaskKeyStk[TaskStk];OS_STKTaskSamStk[TaskStk];VoidTaskKey(void*pdata);VoidTaskSamp(void*pdata);OS_EVENT*Sem;INT16USamp[200];Intmain(void){OSInit();OSTaskCreate(TaskKey,(void*)0,&TaskKeyStk[TaskStk-1],4);OSStark();Return0;}VoidTaskKey(void*pdata){pdata=pdata;TargetInit();PINSEL1=0x00400000;ADCR=(1<<0|((Fpclk/1000000-1)<<8)|(0<<16)|(0<<17)|(1<<21)|(0<<22)|(1<<24)|(0<<27);T1IR=0xffffffff;T1TC=0x00;T1PR=0x00;T1TCR=0x01;T1MCR=0x03;T1MR0=Fpclk/100;Sem=OSSemCreate(0);While(1){OSTimeDly(2);If((IO0PIN&KEY)!=0)continue;Else{While((IO0PIN&KEY)==0){IO0SET=KEY;OSTimeDLy(1);}OSTaskCreate(TaskSamp,(void*)0,&TaskSampStk[TaskStk-1],2);}}}VoidTaskSamp(void*pdata){INT8Ui,err;INT32UTemp;pdata=pdata;VICIntEnable=1<<5;For(i=0;i<200;i++){OSSemPend(Sem,0,&err);Temp=ADDR;ADCR=(ADCR&0xffffff00|0x01|(1<<24);While((ADDR&0x80000000)==0);ADCR=ADCR|(1<<24);While((ADDR&0x80000000)==0);Temp=ADDR;Temp=3000*(Temp&0x0000ffff);Samp[i]=(INT16U)(Temp>>16);}VICIntEnClr=1<<5;PC_DispStr(40,0,Samp,DIS_BGND_BLACK+DISP_FGND_WHITE);OSTaskDel(OS_PRIO_SELF);}VoidTimer1_Exception(void){OS_ENTER_CRITICAL();T1IR=0x01;VICVectAddr=0;OS_EXIT_CRITICAL();OSSemPost(Sem);}108、μC/OS-II任務的代碼結構是_一個帶臨界段的無限循環_或無循環但執行一次要刪除任務__。109、空閑任務的作用_使CPU在沒有任務可執行時有事可做__。110、μC/OS-II的任務調度器的主要工作有兩項,一是在任務就緒表中查找具有最高優先級別的就緒任務;二是實現任務的切換。111、實現臨界段的宏由關中斷宏OS_ENTER_CRITICAL()和開中斷宏OS_EXIT_CRITICAL()。112、OSTimeTick()完成兩個功能,它們是計數器OSTime加1和遍歷任務控制塊鏈表中的所有任務控制塊,把任務控制塊中用來存放任務延時時限的OSTCBDly變量減1,并使該項為0,同時又不使被掛起的任務進入就緒狀態。113、通過事件發送事件操作獲取消息叫請求事件。114、信號量集由標志組和等待任務鏈表局部組成。115、μC/OS-II的任務控制塊用來保存任務屬性;任務堆棧用來保存任務工作環境;任務程序代碼是任務執行局部。116、μC/OS-II最多可支持64個任務,其中用戶任務最多有56個,系統任務可有4個。117、μC/OS-II用兩條鏈表來管理任務控制塊,一條是空任務塊鏈表;別一條是任務塊鏈表。118、指向空任務控制鏈表的頭指針為〔A〕。A〕OSTCBFreeListB)OSTCBCurC)OSEVENTFreeListD)OSEVENTList119、μC/OS-II中指向當前正在運行的任務指針為(B)。A〕OSTCBListB)OSTCBCurC)OSTCBFreeListD)OSEVENTList120、μC/OS-II中任務控制塊的初始化是由(A)函數實現的。A〕OSTCBInit()B)OSInit()C)OSTaskCreate()D)OSStart()121、μC/OS-II中記錄中斷嵌套的層數的全局變量是:〔A〕A〕OSIntNestingB)OSLockNestingC)OSRunningD)OSIntEnter122、變量OSRdyGrp有作用是(C)?記錄就緒任務的分組信息B〕記錄就緒任務優先級C)記錄就緒表分組后組內有否就緒信息C〕記錄就緒任務是否就緒123、請求消息郵箱函數是〔B〕。A〕OSFlagPend()B)OSMboxPend()C)OSQPend()D)OSSemPend()124、發送消息隊列函數是〔C〕。A〕OSFlagPost()B)OSMboxPost()C)OSQPost()D)OSSemPost()125、解決任務優先級反轉現象的方法是建立〔D〕A〕消息郵箱B〕信號量C〕消息隊列D〕互斥型信號量126、什么是嵌入式系統?答:嵌入式系統是以應用為中心,以計算機技術為根底,軟件硬件可裁剪,適應應用系統對功能、可靠性、本錢、體積及功耗嚴格要求的專用計算機系統,具有完成復雜功能的硬件和軟件且緊密耦合在一起的計算機系統。127、請寫出優先級別為Prio的任務置為就緒狀態示意代碼:答:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];128、請寫出使一個優先級別為Prio的任務脫離就緒狀態的示意代碼:答:if((OSRdyTbl[prio>>3]&=-OSMapTbl[prio&0x07])==0)OSRdyGrp&=-OSMapTbl[prio>>3];129、請寫出從任務就緒表中獲取優先級別最高的就緒任務優先級prio的代碼段:答:y=OSUnMapTal[OSRdyGrp];x=OSUnMapTal[OSRdyTbl[y]];prio=(y<<3)+x;或y=OSUnMapTbl[OSRdyGrp];prio=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);130、簡要論述任務切換操作是在什么條件下才會發生?答:分兩大類,一類主動實現任務切換,包括:主動掛起和恢復調用;主動延遲調用;請求事件調用且事件未滿足時和釋放事件時;另一類是被動任務切換,包括:各種隨機中斷響應后在退出中斷時。131、初始化函數OSInit()對數據結構進行初始化時,請舉出4個主要是創立內容?答:主要創立的內容是(1)空的內任務控制塊鏈表〔OSTCBFreeList〕;(2)空的事件控制塊鏈表〔OSEventFreeList〕;(3)空的消息隊列控制塊鏈表(OSQFreeList);(4)空的標志控制塊鏈表(OSFlagFreeList);(5)存儲控制塊鏈表(OSMemFreeList);132、任務級切換函數OSCtxSw()與中斷級任務切換函數OSIntCtxSw()為什么不一樣?答:中斷切換時要保護的操作已在中斷效勞子程序中完成,因此OSIntCtxSw()中不包含保護代碼,即無需壓棧操作,而任務級切換OSCtxSw()就多一些保護代碼段。133、簡述OSTimeTick()作用?134、為什么在高優先級的任務代碼里要插入OSTimeDly〔〕或OSTimeDlyHMSM()函數?135、什么是任務優先級反轉現象?答:在可剝奪型內核中,當任務以獨占方式使用共享資源時,會出現低優先級任務先于高優先級任務而被運行的現象。136、指出操作消息隊列時向指針數組中插入消息指針的2種方式及操作特點?答:(1)先進先出(FIFO)方式;指針OSQIn指向的位置插入消息指針,指針OSQOut指向消息指針作為輸出。(2)后進先出(LIFO)方式;只使用OSQOut指針,輸入和輸出都用OSQOut指針。137、什么是消息隊列?答:讓數組的每個元素都存放一個消息緩沖區指針,任務可通過傳遞這個指針數組指針的方法來傳遞多個消息,這種傳遞多個消息的數據結構叫做消息隊列。138、什么是實時系統?實時嵌入式操作系統的特點是什么?答:實時系統就是利用實時操作系統用于過程控制、事務處理等有實時要求的領域的系統。實時嵌入式操作系統特點是實時性和可靠性,實時系統的特征是實時時鐘管理,提供系統日期和時間、定時和延時等時鐘管理功能;過載保護,緩沖區排隊,丟棄某些任務,動態調整任務周期;高度可靠性和平安性,容錯能力和冗余備份。139、什么是可剝奪型內核?140、為什么在把μC/OS-II向51單片機上移植時要設立系統堆棧和任務堆棧映像?答:這是由于51單片機的RAM大小只有128個字節,運行任務堆棧只能在這一區域,才能操作,而其它非運行任務的任務堆棧只能在外部RAM存儲器中暫時保存,構成內部RAM中任務堆棧的任務堆棧映像。當非運行任務轉化為運行任務時,其外部任務堆棧數據也要復制到內部SP指向RAM空間。141、下面程序段有錯誤,請修改代碼。#include“includes.h〞#defineTASK_STK_SIZE512OS_FLAG_GRP*Sem_F;OS_STKMyTaskStk[TASK_STK_SIZE];OS_STKYouTaskStk[TASK_STK_SIZE];voidmain(void){Sem_F=OSFlagCreate(0,&err);OSInit();OSTaskCreate(MyTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE-1],6);OSStart();}voidMyTask(void*pdata){OSStatInit();For(;;){…..OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE–1],4);…….}}voidYouTask(void*pdata){OSStatInit();For(;;){………..}}答:142、請寫出主函數及任務函數的示意結構代碼:答:#include“includes.h〞#defineMy_TASK_STK_SIZE512voidmain(void){OSInit();………OSTaskCreate(MyTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE-1],6);OSStart();}voidMyTask(void*pdata){OSStatInit();TaskStartCreateTasks();For(;;){}}143、編寫一個有3個任務的應用程序,每個任務均會在顯示器上顯示一個字符,并讓3個任務具有不同的等待時間。答:#include“includes.h〞#defineTASK_STK_SIZE512//任務堆棧長度OS_STKMyTaskStk[TASK_STK_SIZE];//定義任務堆棧區OS_STKYouTaskStk[TASK_STK_SIZE];//定義任務堆棧區OS_STKHerTaskStk[TASK_STK_SIZE];//定義任務堆棧區INT16SKey;//用于退出μC/OS-II的鍵INT8Ux=0,y=0;//字符顯示位置VoidMyTask(void*data);//聲明一個任務VoidYouTask(void*data);//聲明一個任務VoidHerTask(void*data);//聲明一個任務Voidmain(void){char*s_M=“M〞;//定義要顯示的字符char*s_N=“N〞;//定義要顯示的字符char*s_L=“L〞;//定義要顯示的字符OSInit();//初始化μC/OS-IIPC_DOSSaveReturn();//保存DOS環境PC_VectSet(uCOS,OSCtxSw);//安裝μC/OS-II任務切換中斷向量OSTaskCreate(MyTask,s_M,&MyTaskStk[TASK_STK_SIZE-1],0);OSTaskCreate(YouTask,s_N,&YouTaskStk[TASK_STK_SIZE-1],1);OSTaskCreate(HerTask,s_L,&HerTaskStk[TASK_STK_SIZE-1],2);OSStart();//啟動多任務管理}VoidMyTask(void*pdata);{#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);//安裝μC/OS-II時鐘中斷向量PC_SetTickRate(OS_TICKS_PER_SEC);//設置μC/OS-II時鐘頻率OS_EXIT_CRITICAL();OSStatInit()//初始化μC/OS-II的統計任務for(;;){if(x>10){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();//返回DOS}}OSTimeDlyHMSM(0,0,3,0);//等待1s}}VoidYouTask(void*pdata);{#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);//安裝μC/OS-II時鐘中斷向量PC_SetTickRate(OS_TICKS_PER_SEC);//設置μC/OS-II時鐘頻率OS_EXIT_CRITICAL();OSStatInit()//初始化μC/OS-II的統計任務for(;;){if(x>10){x=0;y+=2;}PC_DispChar(x,y,//字符的顯示位置

溫馨提示

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

評論

0/150

提交評論