




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、嵌入式系統程序設計練習題;1uC/OS-II是一個簡潔、易用的 基于優先級的嵌入式搶占式多任務實時內核。2任務是一個執行體,包括:代碼、控制塊和任務堆棧。3.任務代碼可是無返回的無窮循環,也可以是一次性代碼,但最后一定要刪除執行操作的一次性代碼;4因為uc/os-ii總是運行進入就緒狀態中任務優先級最高,下面該哪個任務運行,這個工作就由調度器進行切換調度操作來完成的;5任務級的調度是由函數OSSched()和函數OSIntExt()完成6任務級的調度是由函數OSSched()完成的,而【 中斷級 】的調度是由函數OSIntExt() 完成。對于OSSched(),它內部調用的是OS_TASK_
2、SW()完成實際的調度;OSIntExt()內部調用的是OSCtxSw() 實現調度。7 任務切換其實很簡單,由如下2步完成:(1)將被掛起任務的處理器寄存器推入自己的任務堆棧。(2)然后將進入就緒狀態的最高優先級的任務的寄存器值從堆棧中恢復到寄存器中。8任務的5種狀態。【睡眠態(task dormat) 】:任務駐留于程序空間(rom或ram)中,暫時沒交給ucos-ii處理。【就緒態(task ready)】:任務一旦建立,這個任務就進入了就緒態。【運行態(task running)】:調用OSStart()可以啟動多任務。OSStart()函數只能調用一次,一旦調用,系統將運行進入就緒態
3、并且優先級最高的任務。【等待狀態(task waiting)】:正在運行的任務,通過延遲函數或pend(掛起)相關函數后,將進入等待狀態。【中斷狀態(ISR running)】:正在運行的任務是可以被中斷的,除非該任務將中斷關閉或者ucos-ii將中斷關閉。9【 不可剝奪型 】內核要求每個任務自我放棄CPU的所有權。不可剝奪型調度法也稱作合作型多任務調度法,各個任務彼此合作共享一個CPU。10當系統響應時間很重要時,要使用【 可剝奪型 】內核。最高優先級的任務一旦就緒,總能得到CPU的控制權。11使用可剝奪型內核時,應用程序不應直接使用不可重入型函數。調用不可重入型函數時,要滿足互斥條件,這一
4、點可以用【 互斥型信號量 】來實現。(可重入(reentrant)函數可以由多于一個任務并發使用,而不必擔心數據錯誤。相反, 不可重入(non-reentrant)函數不能由超過一個任務所共享,除非能確保函數的互斥(或者使用信號量,或者在代碼的關鍵部分禁用中斷)。可重入函數可以在任意時刻被中斷,稍后再繼續運行,不會丟失數據。可重入函數要么使用本地變量,要么在使用全局變量時保護自己的數據。)12【 可重入型 】函數可以被一個以上的任務調用,而不必擔心數據的破壞。13可重入型函數任何時候都可以被中斷,一段時間以后又可以運行,而相應數據不會丟失。可重入型函數或者只使用【 局部變量 】,即變量保存在C
5、PU寄存器中或堆棧中。如果使用全局變量,則要對全局變量予以【 保護 】。14每個任務都有其優先級。任務越重要,賦予的優先級應【 越高 】。15C/OS-初始化是通過調用系統函數【OSIint()】實現的,完成C/OS-所有的變量和數據結構的初始化。16多任務的啟動是用戶通過調用【OSStart()】實現的。然而,啟動C/OS-之前,用戶至少要建立一個應用【任務】。17 C/OS-的參數配置文件名為【OS_CFG.H】。18 刪除任務,是說任務將返回并處于【休眠狀態】,并不是說任務的代碼被刪除了,只是任務的代碼不再被C/OS-調用。19C/OS-要求用戶提供【定時中斷】來實現延時與超時控制等功能
6、。20定時中斷也叫做【時鐘節拍】,它應該每秒發生10至100次。21. 時鐘節拍的實際頻率是由用戶的應用程序決定的。時鐘節拍的頻率越高,系統的負荷就【越重】。22C/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中表示當前內核運行的標記全局變量名為:【 OSR
7、unning 】。25在使用OSTaskCreate創建任務時,若需要TaskData作偽參數傳遞給任務Task,并從任務Task中獲得傳入的字符參數值,請在下面【 】填上合適的代碼。char TaskData=?A?;OSTaskCreate(Task, 【(void *)& TaskData 】, &TaskStk0TASK_STK_SIZE- 1, 1);void Task (void *pdata)char value = 【 *(char *)pdata 】;for (;) OSSemPend(RandomSem, 0, &err);y = (int) (*(
8、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()字符, 請在下面【 】填上合適的代碼。void Task1 (void *data)char txmsg;INT8U err;txmsg = 'A'for (;) OSMboxPost(TxMbox, 【
9、(void *)&txmsg】); /* Send message toTask2*/OSMboxPend(AckMbox, 0, &err);txmsg+; if (txmsg = 'Z') txmsg = 'A'void Task5 (void *data)char *rxmsg;INT8U err;data = data;for (;) rxmsg = 【(char *)】OSMboxPend(TxMbox, 0, &err);PC_DispChar(70, 18, *rxmsg, DISP_FGND_YELLOW +DISP_BG
10、ND_BLUE);OSMboxPost(AckMbox, (void *)1); 27. 在Task1中使用消息隊列OSQPend()函數接收消息“Hello World!”,而在Task2中使用消息隊列OSQPost()函數發送消息“Hello World!”, 請在下面【 】填上合適的代碼.void Task1 (void *pdata)char *msg;INT8U err;pdata = pdata;for (;) msg = 【(char *)】OSQPend(MsgQueue, 0, &err);PC_DispStr(70, 13, msg, DISP_FGND_YELLO
11、W +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);28 C/OS-II操作系統使用OSSchedLock()函數和OSSchedUnlock()函數進行鎖定(不允許任務級調度)和解鎖(重新允許任務級調度)調度器,在用戶
12、應用程序中,OSSchedLock()和OSSchedUnlock()是 【 成對出現的 】,否則系統有可能出錯。29代碼的臨界段代碼的臨界段也稱為臨界區,指處理時不可分割的代碼。30資源任何為任務所占用的實體都可稱為資源。資源可以是輸入輸出設備;資源也可以是一個變量,一個結構或一個數組等。31共享資源可以被一個以上任務使用的資源叫做共享資源。32任務一個任務,也稱作一個線程,是一個簡單的程序,該程序可以認為CPU完全只屬該程序自己。典型地、每個任務都是一個無限的循環。33任務切換指Context Switch,其含義是CPU寄存器內容切換。當多任務內核決定運行另外的任務時,它保存正在運行任務
13、的當前狀態(Context),即CPU寄存器中的全部內容。34內核多任務系統中,內核負責管理各個任務,或者說為每個任務分配CPU時間,并且負責任務之間的通訊。內核提供的基本服務是任務切換。35調度(Scheduler)內核的主要職責之一,就是要決定該輪到哪個任務運行了。多數實時內核是基于優先級調度法的。36可剝奪型內核最高優先級的任務一旦就緒,總能得到CPU的控制權。當一個運行著的任務使一個比它優先級高的任務進入了就緒態,當前任務的CPU使用權就被剝奪了,或者說被掛起了,那個高優先級的任務立刻得到了CPU的控制權。如果是中斷服務子程序使一個高優先級的任務進入就緒態,中斷完成時,中斷了的任務被掛
14、起,優先級高的那個任務開始運行。37. 任務基本信息內涵(1) CPU中的PC寄存器:任務(程序)當前執行的位置;(2) CPU中的通用寄存器:任務當前執行代碼所涉及的臨時數據;(3) CPU中的狀態寄存器:存儲當前CPU的狀態。38. 任務切換任務切換是指從一個任務直接切換到另一個任務,引起該次切換是由于某一個非中斷引起的事件或主動放棄或調用節拍函數時,使一個更高優先級的任務處于就緒狀態,暫停正在運行著的任務,轉而切換去執行更高優先級任務;也可由中斷后,中斷退出時進行任務調度,重新去執行更高優先級任務。39. 舉例說明COS-II可移植型數據類型的定義方式答:因為不同的微處理器有不同的字長,
15、C/OS-II的移植文件包括很多類型定義以確保可移植性。COS-II不使用C語言中的short,int,long等數據類型的定義,因為它們與處理器類型有關,隱含著不可移植性。C/OS-II代之以移植性強的整數數據類型,這樣,既直觀又可移植(該數據類型不依賴于編譯),舉例如下: typedef unsigned char BOOLEAN;typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned int INT16U;typedef signed int INT16S;typedef unsigned long I
16、NT32U;typedef signed long INT32S;40. COS-II如何定義全局變量?答:眾所周知,全局變量應該是得到內存分配且可以被其他模塊通過C語言中extern關鍵字調用的變量。因此,必須在 .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有中以下定義:#defi
17、ne OS_GLOBALS#include “includes.h”當編譯器處理uCOS_II.C時,它使得頭文件變成如下所示,因為OS_EXT被設置為空。INT32U OSIdleCtr;這樣編譯器就會將這些全局變量分配在內存中。當編譯器處理其他.C文件時,頭文件變成了如下的樣子,因為OS_GLOBAL沒有定義,所以OS_EXT被定義為extern。extern INT32U OSIdleCtr;在這種情況下,不產生內存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H 文件中定義一次就可以了。41. OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL(
18、)的含義及作用? 答:OS_ENTER_CRITICAL() :關中斷;OS_EXIT_CRITICAL():開中斷。關中斷和開中斷是為了保護臨界段代碼。用戶的應用代碼可以使用這兩個宏來開中斷和關中斷。很明顯,關中斷會影響中斷延遲,所以要特別小心。用戶還可以用信號量來保護臨界段代碼。42基于PC的服務中如何測量PC_DisplayChar()的執行時間?答:測量PC_DisplayChar()的執行時間的代碼如下:INT16U time; /定義時間變量PC_ElapsedInit(); /時鐘初始化PC_ElapsedStart(); /開始計時PC_DispChar(40, 24, ?A?
19、, DISP_FGND_WHITE); /執行代碼time = PC_ElapsedStop(); /結束計時43uC/OS-II的任務框架答:void task_xxx(void *pData) /* 該任務的初始化工作 */?/* 進入該任務的死循環 */while(1)?每個用戶的任務都必須符合事件驅動的編程模型,即uC/OS-II的應用程序都必須是“事件驅動的編程模型”。一個任務首先等待一個事件的發生,事件可以是系統中斷發出的,也可以是其它任務發出的,又可以是任務自身等待的時間片。當一個事件發生了,任務再作相應處理,處理結束后又開始等待下一個事件的發生。如此周而復始的任務處理模型就是“
20、事件驅動的編程模型”。事件驅動模型也涵蓋了中斷驅動模型,uC/OS-II事件歸根結底來自三個方面:(1)中斷服務函數發送的事件(2)系統延時時間到所引起的(3)其它任務發送的事件。44 與共享資源打交道時,使之滿足互斥條件最一般的方法包括哪些? 答:包括:關中斷、使用測試并置位指令、禁止做任務切換、利用信號量等。45. 描述利用C/OS_ 宏調用關中斷和開中斷處理共享數據的示意性代碼程答:OS_ENTER_CRITICAL();/*在這里處理共享數據*/OS_EXIT_CRITICAL();46. 信號量的典型應用包括哪些?答:信號量(Semaphores) 是一種約定機制,在多任務內核中的典
21、型應用包括:(1) 控制共享資源的使用權(滿足互斥條件);(2) 標志某事件的發生(3) 使兩個任務的行為同步47對信號量只能實施哪三種操作?答:一般地說,對信號量只能實施三種操作:(1) 初始化(INITIALIZE),也可稱作建立(CREATE);(2) 等信號(WAIT)也可稱作掛起(PEND);(3) 給信號(SIGNAL)或發信號(POST)。48.給出C/OS-中如何用信號量處理共享數據的示意代碼?答:通過獲得信號量處理共享數據的示意代碼如下:OS_EVENT *SharedDataSem;void Function (void)INT8U err;OSSemPend(Shared
22、DataSem, 0, &err);/*共享數據的處理在此進行,(中斷是開著的)*/OSSemPost(SharedDataSem);49.給出初始化和啟動C/OS-的示意代碼。答:void main (void)OSInit(); /* 初始化uC/OS-II */.通過調用OSTaskCreate()或OSTaskCreateExt()創建至少一個任務; .OSStart(); /* 開始多任務調度!OSStart()永遠不會返回 */ 50 描述建立任務OSTaskCreate()的函數原型。建立任務OSTaskCreate()的函數原型為:INT8U OSTaskCreate
23、(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)其中,task: 任務代碼的指針;pdata: 當任務開始執行時傳遞給任務的參數的指針;ptos: 分配給任務的堆棧的棧頂指針;prio: 分配給任務的優先級。51任務可以是一個無限的循環,也可以是在一次執行完畢后被刪除掉。 請給出示意代碼結構。答:C/OS-描述的任務示意代碼必須是以下兩種結構之一:void YourTask (void *pdata)for (;) /* 用戶代碼 */調用C/OS-的服務例程之一:OSMboxPend();OSQPend();OSS
24、emPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/* 用戶代碼 */或void YourTask (void *pdata)/* 用戶代碼 */OSTaskDel(OS_PRIO_SELF);52C/OS-任務管理提供哪些服務?答:C/OS-任務管理提供的服務包括:(1)建立任務:OSTaskCreate()或OSTaskCreateExt();(2)刪除任務:OSTaskDel();(3)請求刪除任務:OSTaskDelReq();(4)改變任務的優先級:OSTa
25、skChangePrio();(5)掛起任務:OSTaskSuspend();(6)恢復任務:OSTaskResume();(7)獲得有關任務的信息:OSTaskQuery()。53C/OS-時間任務管理提供哪些服務?答:C/OS-時間任務管理提供的服務包括:(1) 任務延時函數:OSTimeDly()(2) 按時分秒延時函數:OSTimeDlyHMSM()(3) 讓處在延時期的任務結束延時:OSTimeDlyResume()(4) 設置系統時間:OSTimeGet()(5) 獲得系統時間:OSTimeSet()54. C/OS-提供的數據共享和任務通訊的方法包括哪些?答:C/OS-提供的數據
26、共享和任務通訊的方法包括五種方法:(1) 利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來關閉中斷和打開中斷。(2) 利用函數OSSchedLock()和OSSchekUnlock()對C/OS-II中的任務調度函數上鎖和開鎖。(3) 信號量。(4) 郵箱。(5) 消息隊列。55對于事件控制塊進行的一些通用包括哪些操作?答:對于事件控制塊進行的一些通用操作包括:(1) 初始化一個事件控制塊: OSEventWaitListInit();(2) 使一個任務進入就緒態:OSEventTaskRdy();(3) 使一個任務進入等待該事件的狀態:OSEventTas
27、kWait();(4) 因為等待超時而使一個任務進入就緒態:OSEventTO()。56C/OS-信號量提供哪些服務?答:C/OS-信號量提供的服務包括:(1) 建立一個信號量:OSSemCreate();(2) 等待一個信號量:OSSemPend();(3)發送一個信號量:OSSemPost();(4)無等待地請求一個信號量:OSSemAccept();(5)查詢一個信號量的當前狀態:OSSemQuery()。57C/OS-郵箱提供哪些服務?答:C/OS-郵箱提供的服務包括:(1)建立一個郵箱:OSMboxCreate();(2)等待一個郵箱中的消息:OSMboxPend();(3)發送一個
28、消息到郵箱中:OSMboxPost();(4)無等待地從郵箱中得到一個消息:OSMboxAccept();(5)查詢一個郵箱的狀態:OSMboxQuery()58C/OS-消息隊列提供哪些服務?答:C/OS-消息隊列提供的服務包括:;(1)建立一個消息隊列:OSQCreate();(2)等待一個消息隊列中的消息:OSQPend(;(3)向消息隊列發送一個消息(FIFO):OSQ;(4)向消息隊列發送一個消息(LIFO):OSQ;(5)無等待地從一個消息隊列中取得消息:OSQA;(6)清空一個消息隊列:OSQFlush();(7)查詢一個消息答:C/OS-消息隊列提供的服務包括:(1)建立一個消
29、息隊列:OSQCreate();(2)等待一個消息隊列中的消息:OSQPend();(3)向消息隊列發送一個消息(FIFO):OSQPost();(4)向消息隊列發送一個消息(LIFO):OSQPostFront();(5)無等待地從一個消息隊列中取得消息:OSQAccept();(6)清空一個消息隊列:OSQFlush();(7)查詢一個消息隊列的狀態:OSQQuery()。59C/OS-內存管理提供哪些服務?答:C/OS-內存管理提供的服務包括:(1) 建立一個內存分區:OSMemCreate();(2) 分配一個內存塊:OSMemGet();(3) 釋放一個內存塊:OSMemPut();
30、(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>#
31、define TASK_STK_SIZE 128OS_STK AppStk_oneTASK_STK_SIZE; /任務one的堆棧 OS_STK AppStk_twoTASK_STK_SIZE; /任務two的堆棧 OS_STK AppStk_threeTASK_STK_SIZE; /任務three的堆棧static void App_one(void *p_arg); /任務one代碼static void App_two(void *p_arg); /任務two代碼static void App_three(void *p_arg); /任務three代碼void main(int arg
32、c, char *argv)OSInit(); /初始化系統 /依次創建三個任務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_three,NULL,(OS_STK*)&AppStk_threeTASK_STK_SIZE-1,(INT8U)30);OSStart(); 啟動多任務,將CPU控制權交
33、給系統62. C/OS-II調度算法原理及其和調度方式答:(1)優先級調度算法原理為:給每一個任務分配一個惟一優先級,各優先級用一個整形數值標識,某優先級的值越大,其優先級越低;某優先級的值越小,其優先級越高。也就是說,如果當前操作系統準備進行調度,當有兩個任務處于就緒狀態, 系統將優先執行優先級別高的任務。(2) C/OS-II操作系統有兩種調度方式:任務級任務調度和中斷級任務調度,C/OS-II操作系統在完成中斷后允許進行新的調度。63. 描述C/OS-II操作系統的任務級任務調度OS_Sched()的主要功能答: (1)查找當前就緒表中最高優先級任務的優先級值;(2)調用OS_Sched
34、New()函數進行任務切換,切換到新任務執行。64從消息郵箱中讀取消息的方式及其函數原型 ?答:(1) 從消息郵箱中讀取消息的方式包括:非阻塞式讀取和阻塞式讀取兩種方式。(2) 非阻塞式讀取是指無論消息郵箱中是否有數據,讀取操作也不阻塞,直接返回,顯然,如果有數據,將讀取出來,如果沒有數據,將讀取為NULL。 其函數原型為:void *OSMboxAccept (OS_EVENT *pevent)(3) 阻塞式讀取是指在消息郵箱中有數據時,直接讀取出來;如果沒有數據,則使當前任務進入等待狀態,系統執行調度程序執行新的任務,當下一次消息到來時將激活等待表中的最高優先級任務,從而使該任務進入就緒狀
35、態。為了避免任務一直處于等待狀態(所等待的資源一直未分配),可以設置一個等待的時間范圍,當超過該延遲時,則直接返回。其函數原型為:void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)65. 論述C/OS-控制下的任務狀態轉換圖答:C/OS-控制下的任務狀態轉換圖如下圖所示。在任一給定的時刻,任務的狀態一定是在這五種狀態之一。(1) 睡眠態(DORMANT):指任務駐留在程序空間之中,還沒有交給C/OS-管理。一個任務可以通過調用OSTaskDel()返回到睡眠態,或通過調用該函數讓另一個任務進入睡眠態。(2) 就緒態(R
36、EADY):當任務一旦建立,這個任務就進入就緒態準備運行。把任務交給C/OS-是通過調用下述兩個函數之一:OSTaskCreate()或OSTaskCreateExt()。(3) 運行態(RUN): 調用OSStart()可以啟動多任務。OSStart()函數運行進入就緒態的優先級最高的任務。(4) 等待狀態(WAITING): 正在運行的任務可以通過調用兩個函數之一將自身延遲一段時間,這兩個函數是OSTimeDly()或OSTimeDlyHMSM()。這個任務于是進入等待狀態,等待這段時間過去,下一個優先級最高的、并進入了就緒態的任務立刻被賦予了CPU的控制權。正在運行的任務期待某一事件的發
37、生時也要等待,手段是調用以下3個函數之一:OSSemPend(),OSMboxPend(),或OSQPend()。調用后任務進入了等待狀態(WAITING)。(5) 中斷狀態(ISR): 正在運行的任務是可以被中斷的,除非該任務將中斷關了,或者C/OS-將中斷關了。被中斷了的任務就進入了中斷服務態(ISR)。66. 論述C/OS-的核心數據結構任務控制塊(OS_TCBs)答:任務控制塊(OS_TCBs)是C/OS-的核心數據結構,當任務的CPU使用權被剝奪時,C/OS-用它來保存該任務的狀態。當任務重新得到CPU使用權時,任務控制塊能確保任務從當時被中斷的那一點絲毫不差地繼續執行。OS_TCB
38、s全部駐留在RAM中。一旦任務建立了,任務控制塊OS_TCBs將被賦值。C/OS-II任務控制塊數據結構定義如下:typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_ENvoid *OSTCBExtPtr;OS_STK *OSTCBStkBottom;INT32U OSTCBStkSize;INT16U OSTCBOpt;INT16U OSTCBId;#endifstruct os_tcb *OSTCBNext;struct os_tcb *OSTCBPrev;#if (OS_Q_EN && (OS_
39、MAX_QS >= 2) | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr;#endif#if (OS_Q_EN && (OS_MAX_QS >= 2) | OS_MBOX_ENvoid *OSTCBMsg;#endifINT16U OSTCBDly;INT8U OSTCBStat;INT8U OSTCBPrio;INT8U OSTCBX;INT8U OSTCBY;INT8U OSTCBBitX;INT8U OSTCBBitY;#if OS_TASK_DEL_ENBOOLEAN OSTCBDelReq;#endif O
40、S_TCB;其中:OSTCBStkPtr是指向當前任務棧頂的指針。OSTCBExtPtr 指向用戶定義的任務控制塊擴展。OSTCBStkBottom是指向任務棧底的指針。OSTCBStkSize存有棧中可容納的指針元數目而不是用字節(Byte)表示的棧容量總數。OSTCBId用于存儲任務的識別碼。OSTCBNext和OSTCBPrev用于任務控制塊OS_TCBs的雙重鏈接。 OSTCBEventPtr是指向事件控制塊的指針。OSTCBMsg是指向傳給任務的消息的指針。OSTCBStat是任務的狀態字。OSTCBPrio是任務優先級。OSTCBDelReq是一個布爾量,用于表示該任務是否需要刪除
41、。OSTCBX, OSTCBY, OSTCBBitX和 OSTCBBitY用于加速任務進入就緒態的過程或進入等待事件發生狀態的過程。3論述事件控制塊ECB數據結構答:C/OS-II通過uCOS_II.H 中定義的OS_EVENT數據結構來維護一個事件控制塊的所有信息。該事件控制塊ECB數據結構的定義如下:typedef struct void *OSEventPtr; /* 指向消息或者消息隊列的指針 */ INT8U OSEventTblOS_EVENT_TBL_SIZE; /* 等待任務列表 */ INT16U OSEventCnt; /* 計數器(當事件是信號量時) */ INT8U O
42、SEventType; /* 時間類型 */INT8U OSEventGrp; /* 等待任務所在的組 */ OS_EVENT;其中:OSEventPtr指針: 只有在所定義的事件是郵箱或者消息隊列時才使用。當所定義的事件是郵箱時,它指向一個消息,而當所定義的事件是消息隊列時,它指向一個數據結構.OSEventTbl 和 OSEventGrp: 兩者包含的是系統中處于就緒狀態的任務。OSEventCnt:當事件是一個信號量時,用于信號量的計數器。OSEventType:定義了事件的具體類型。67論述C/OS-II內存的管理的內存控制塊數據結構答:為了便于內存的管理,在C/OS-II中使用;內存
43、控制塊的數據結構定義如下:;typedefstruct;void*OSMemAddr;;void*OSMemFreeList;;INT32UOSMemBlkSize;;INT32UOSMemNBlks;;INT32UOSMemNFree;;OS_MEM;;其中:;OSMemAddr是指向內存分區起始地答:為了便于內存的管理,在C/OS-II中使用內存控制塊(memory control blocks)的數據結構來跟蹤每一個內存分區,系統中的每個內存分區都有它自己的內存控制塊。內存控制塊的數據結構定義如下:typedef struct void *OSMemAddr;void *OSMemFre
44、eList;INT32U OSMemBlkSize;INT32U OSMemNBlks;INT32U OSMemNFree; OS_MEM;其中:OSMemAddr是指向內存分區起始地址的指針。OSMemFreeList是指向下一個空閑內存控制塊或者下一個空閑的內存塊的指針。OSMemBlkSize是內存分區中內存塊的大小,是用戶建立該內存分區時指定的。OSMemNBlks是內存分區中總的內存塊數量,也是用戶建立該內存分區時指定的。OSMemNFree是內存分區中當前可以得空閑內存塊數量。68、啟動µC/OS-II任務的函數是_ OSStart( )_。69、OSTaskCreate
45、(void(*task)(void*pd),void * pdata,OS_STK * ptos,INT8U prio)功能是_創建任務_。70、µC/OS-II用來記錄任務的堆棧指針、任務的當前狀態、任務的優先級別的數據結構稱為任務控制塊(OS_TCB)。71、µC/OS-II有兩種調度器,一種是任務級的調度器;另一種是中斷級的調度器。72、void OSTimeDly(INT16U ticks)中參數ticks是指_定時計數器確定的時間段,又稱節拍_。73、OSTimeDly()或OSTimeDlyHMSM( )的作用是_延時操作_。74、如果OSEventGrp的值是
46、01101000(二進制),而對應的OSUnMapTblOSEventGrp值為3,如果.OSEventTbl3的值是11100100(二進制),OSUnMapTblOSEventTbl3的值為2,則處于等待狀態的任務的最高優先級是3×8+226。75、能防止出現優先級反轉現象的信號叫做互斥型信號量。76、消息郵箱是能在任務之間傳遞消息的指針的數據結構。77、µC/OS-II的任務狀態有5個狀態;分別是:1)睡眠狀態;2)就緒狀態;3)運行狀態;4)等待狀態;5)中斷服務狀態。78、從任務的存儲結構來看,µC/OS-II的任務由三個組成部分構成,其三部分為:1)任
47、務程序代碼;2)任務堆棧;3)任務控制塊。79、µC/OS-II任務優先級最多可建立64級,其中設定級為最高級。80、操作消息隊列時向指針數組中插入消息指針有2種方式,它們是: 先進先出(FIFO)方式和后進先出(LIFO)方式。81、µC/OS-II任務的代碼結構是( C )。A) 對象結構;B)數據結構;C)一個帶有臨界段的無限循環;D)表結構。82、µC/OS-II的任務控制塊是采用( B )結構。A)一條鏈表;B)兩條鏈表;C)三條鏈表;D)四條鏈表;83、µC/OS-II中指向當前正在運行的任務指針為( B )。A)OSTCBList B) O
48、STCBCur C)OSTCBFreeList D) OSEVENTList84、µC/OS-II中空任務控制鏈表的創建是由( B )函數實現的。A)OSTCBInit( ) B) OSInit( ) C)OSTaskCreate( ) D) OSStart( )85、解決任務優先級反轉現象的方法是建立( D )A)消息郵箱 B)信號量 C)消息隊列 D) 互斥型信號量86、變量OSRdyGrp有作用是( C )?A) 記錄就緒任務的分組信息 B)記錄就緒任務優先級 C)記錄就緒表分組后組內有否就緒信息 C)記錄就緒任務是否就緒87、請求信號量函數是( D )。A)OSFlagPen
49、d() B) OSMboxPend() C)OSQPend() D) OSSemPend( )88、µC/OS-II中OSTCBDly變量是按( C )計算進行的。A)秒 B)毫秒 C)節拍 D)微秒89、什么是代碼的臨界區?答:代碼的監界區是指處理時不可分割的代碼,運行這些代碼不允許被打斷。一旦這部分代碼開始執行,則不允許任何中斷打入。中斷不調用任何臨界區的代碼或不訪問任何臨界區使用的共享資源時,這個中斷是可能可以執行。為確保臨界區代碼的執行,在進入臨界區之前要關中斷,而臨界區代碼執行完成以后要立即開中斷。90、什么是嵌入式操作系統?為何要使用嵌入式操作系統?答:運用在嵌入式系統上
50、的實時操作系統,具有事件驅動和任務(進程)調度功能,且在有限時隙內能完成事件的響應和任務(進程)的切換,能可靠、實時、靈活地管理嵌入式系統上的各種資源和任務。使用嵌入式操作系統,能方便實時應用軟件的開發和有機地整合,能有效地管理和協調各項工作,因此是開發和運行非常重要的環境。91、請寫出從任務就緒表中獲取優先級別最高的就緒任務優先級prio的代碼段:答: y =OSUnMapTalOSRdyGrp;x=OSUnMapTalOSRdyTbly;prio = (y<<3)+x;或y=OSUnMapTblOSRdyGrp;prio = (INT8U)(y<<3)+OSUnMa
51、pTblOSRdyTbly);92、初始化函數OSInit( )對數據結構進行初始化時,請舉出4個主要是創建內容?答:主要創建的內容是 (1)空的內任務控制塊鏈表(OSTCBFreeList);(2)空的事件控制塊鏈表(OSEventFreeList);(3)空的消息隊列控制塊鏈表(OSQFreeList);(4)空的標志控制塊鏈表(OSFlagFreeList);(5)存儲控制塊鏈表(OSMemFreeList);93、簡述µC/OS-II的中斷過程?答:系統接收到中斷請求后,如果這時CPU處于中斷允許狀態(即中斷是開放的),系統就會中止正在運行的當前任務,而按照中斷向量的指向轉而
52、去運行中斷服務子程序;當中斷服務子程序的運行結束后,系統將會根據情況返回到被中止的任務繼續運行,或者轉向運行另一個具有更高優先級別的就緒任務。94、為什么µC/OS-II的中斷服務子程序中不能請求信號量?答:這是由于OSSemPend()的執行同時要執行OSEventTaskWait(),而中斷服務子程序并非任務代碼,也就是非任務請求,顯然請求的實體不合理,導致程序執行錯誤。95、任務級切換和中斷級任務切換為什么沒有使用同一切換函數? 答:中斷切換時要保護的操作已在中斷服務子程序中完成,因此OSIntCtxSw( )中不包含保護代碼,即無需壓棧操作,而任務級切換OSCtxSw( )就
53、多一些保護代碼段。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位用來存放避
54、免出現優先級反轉現象而提升的優先級別prio。當任務占有一個獨占式共享資源時,事件控制塊的成員OSEventCnt低8位就不再是0xFF,如果任務的優先級不是最高的,此時,就要將成員OSEventCnt高8位作為本任務的prio,以使任務的優先級此時最高,防止優先級反轉現象出現。 98、什么叫消息郵箱?答:在多任務間需要在任務與任務之間傳遞一個數據的方式,該數據是在存儲空間開出一個緩沖區的內容,建立緩沖區指針,并能傳遞指針的數據結構稱為消息郵箱。99、請描述標志組中的OSFlagFlags和等待任務鏈表OSFlagNodeFlags作用?答:OSFlagFlags提供信號量集的所有信號狀態,每一個信號占據一個二進制位。當所占位為1時,表示此信號量集中該信號量有效,否則該信號量無效。從而辨別信號量集中信號量的分布特點。而等待任務鏈表OSFlagNod
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 超市聯營租賃合同協議
- 雙方自愿離婚協議書樣例
- 合同協議托兒所合同
- 油罐出租協議書
- 退股轉勞務合同協議
- 通風機維修合同協議
- 超級合伙人合同協議
- 轉讓認繳股份合同協議
- 煙草收購協議書
- 軟件開發外包合同版設計
- 火鍋店服務員接待流程解析
- 2025年上半年福建福州廣播電視臺招聘重點基礎提升(共500題)附帶答案詳解
- 高中政治經濟主觀題材料對應術語總結
- GB/T 45251-2025互聯網金融個人網絡消費信貸貸后催收風控指引
- 2025年金融數學考試試題及答案
- 道路交通安全評估體系-深度研究
- 2024年安徽省公務員【申論】考試真題及答案-(A卷+B卷+C卷)三套
- 浙江國企招聘2024溫州市公用事業發展集團有限公司招聘8人筆試參考題庫附帶答案詳解
- 研發月報工作總結
- 體育產業信息技術應用提升計劃
- 2025年山東魯商誠正教育科技有限公司招聘筆試參考題庫含答案解析
評論
0/150
提交評論