嵌入式程序設(shè)計(jì)復(fù)習(xí)題_第1頁
嵌入式程序設(shè)計(jì)復(fù)習(xí)題_第2頁
嵌入式程序設(shè)計(jì)復(fù)習(xí)題_第3頁
嵌入式程序設(shè)計(jì)復(fù)習(xí)題_第4頁
嵌入式程序設(shè)計(jì)復(fù)習(xí)題_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

嵌入式系統(tǒng)程序設(shè)計(jì)練習(xí)題;1.uC/OS-II是一個(gè)簡(jiǎn)潔、易用的基于優(yōu)先級(jí)的嵌入式搶占式多任務(wù)實(shí)時(shí)內(nèi)核。2.任務(wù)是一個(gè)執(zhí)行體,包括:代碼、控制塊和任務(wù)堆棧。3.任務(wù)代碼可是無返回的無窮循環(huán),也可以是一次性代碼,但最后一定要?jiǎng)h除執(zhí)行操作的一次性代碼;4.因?yàn)閡c/os-ii總是運(yùn)行進(jìn)入就緒狀態(tài)中任務(wù)優(yōu)先級(jí)最高,下面該哪個(gè)任務(wù)運(yùn)行,這個(gè)工作就由調(diào)度器進(jìn)行切換調(diào)度操作來完成的;5.任務(wù)級(jí)的調(diào)度是由函數(shù)OSSched()和函數(shù)OSIntExt()完成6.任務(wù)級(jí)的調(diào)度是由函數(shù)OSSched()完成的,而【中斷級(jí)】的調(diào)度是由函數(shù)OSIntExt()完成。對(duì)于OSSched(),它內(nèi)部調(diào)用的是OS_TASK_SW()完成實(shí)際的調(diào)度;OSIntExt()內(nèi)部調(diào)用的是OSCtxSw()實(shí)現(xiàn)調(diào)度。7.任務(wù)切換其實(shí)很簡(jiǎn)單,由如下2步完成:〔1〕將被掛起任務(wù)的處理器存放器推入自己的任務(wù)堆棧?!?〕然后將進(jìn)入就緒狀態(tài)的最高優(yōu)先級(jí)的任務(wù)的存放器值從堆棧中恢復(fù)到存放器中。8.任務(wù)的5種狀態(tài)?!舅邞B(tài)(taskdormat)】:任務(wù)駐留于程序空間〔rom或ram〕中,暫時(shí)沒交給ucos-ii處理?!揪途w態(tài)〔taskready〕】:任務(wù)一旦建立,這個(gè)任務(wù)就進(jìn)入了就緒態(tài)?!具\(yùn)行態(tài)〔taskrunning〕】:調(diào)用OSStart〔〕可以啟動(dòng)多任務(wù)。OSStart〔〕函數(shù)只能調(diào)用一次,一旦調(diào)用,系統(tǒng)將運(yùn)行進(jìn)入就緒態(tài)并且優(yōu)先級(jí)最高的任務(wù)?!镜却隣顟B(tài)〔taskwaiting〕】:正在運(yùn)行的任務(wù),通過延遲函數(shù)或pend〔掛起〕相關(guān)函數(shù)后,將進(jìn)入等待狀態(tài)?!局袛酄顟B(tài)〔ISRrunning〕】:正在運(yùn)行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)閉或者ucos-ii將中斷關(guān)閉。9.【不可剝奪型】?jī)?nèi)核要求每個(gè)任務(wù)自我放棄CPU的所有權(quán)。不可剝奪型調(diào)度法也稱作合作型多任務(wù)調(diào)度法,各個(gè)任務(wù)彼此合作共享一個(gè)CPU。10.當(dāng)系統(tǒng)響應(yīng)時(shí)間很重要時(shí),要使用【可剝奪型】?jī)?nèi)核。最高優(yōu)先級(jí)的任務(wù)一旦就緒,總能得到CPU的控制權(quán)。11.使用可剝奪型內(nèi)核時(shí),應(yīng)用程序不應(yīng)直接使用不可重入型函數(shù)。調(diào)用不可重入型函數(shù)時(shí),要滿足互斥條件,這一點(diǎn)可以用【互斥型信號(hào)量】來實(shí)現(xiàn)。(可重入〔reentrant〕函數(shù)可以由多于一個(gè)任務(wù)并發(fā)使用,而不必?fù)?dān)憂數(shù)據(jù)錯(cuò)誤。相反,不可重入〔non-reentrant〕函數(shù)不能由超過一個(gè)任務(wù)所共享,除非能確保函數(shù)的互斥〔或者使用信號(hào)量,或者在代碼的關(guān)鍵局部禁用中斷〕??芍厝牒瘮?shù)可以在任意時(shí)刻被中斷,稍后再繼續(xù)運(yùn)行,不會(huì)喪失數(shù)據(jù)??芍厝牒瘮?shù)要么使用本地變量,要么在使用全局變量時(shí)保護(hù)自己的數(shù)據(jù)。)12.【可重入型】函數(shù)可以被一個(gè)以上的任務(wù)調(diào)用,而不必?fù)?dān)憂數(shù)據(jù)的破壞。13.可重入型函數(shù)任何時(shí)候都可以被中斷,一段時(shí)間以后又可以運(yùn)行,而相應(yīng)數(shù)據(jù)不會(huì)喪失??芍厝胄秃瘮?shù)或者只使用【局部變量】,即變量保存在CPU存放器中或堆棧中。如果使用全局變量,那么要對(duì)全局變量予以【保護(hù)】。14.每個(gè)任務(wù)都有其優(yōu)先級(jí)。任務(wù)越重要,賦予的優(yōu)先級(jí)應(yīng)【越高】。15.μC/OS-Ⅱ初始化是通過調(diào)用系統(tǒng)函數(shù)【OSIint()】實(shí)現(xiàn)的,完成μC/OS-Ⅱ所有的變量和數(shù)據(jù)結(jié)構(gòu)的初始化。16.多任務(wù)的啟動(dòng)是用戶通過調(diào)用【OSStart()】實(shí)現(xiàn)的。然而,啟動(dòng)μC/OS-Ⅱ之前,用戶至少要建立一個(gè)應(yīng)用【任務(wù)】。17μC/OS-Ⅱ的參數(shù)配置文件名為【OS_CFG.H】。18.刪除任務(wù),是說任務(wù)將返回并處于【休眠狀態(tài)】,并不是說任務(wù)的代碼被刪除了,只是任務(wù)的代碼不再被μC/OS-Ⅱ調(diào)用。19.μC/OS-Ⅱ要求用戶提供【定時(shí)中斷】來實(shí)現(xiàn)延時(shí)與超時(shí)控制等功能。20.定時(shí)中斷也叫做【時(shí)鐘節(jié)拍】,它應(yīng)該每秒發(fā)生10至100次。21.時(shí)鐘節(jié)拍的實(shí)際頻率是由用戶的應(yīng)用程序決定的。時(shí)鐘節(jié)拍的頻率越高,系統(tǒng)的負(fù)荷就【越重】。22.μC/OS-II中的信號(hào)量由兩局部組成:一個(gè)是信號(hào)量的【計(jì)數(shù)值】,它是一個(gè)16位的無符號(hào)整數(shù)〔0到65,535之間〕;另一個(gè)是由等待該信號(hào)量的任務(wù)組成的【等待任務(wù)表】。用戶要在OS_CFG.H中將OS_SEM_EN開關(guān)量常數(shù)置成【1】,這樣μC/OS-II才能支持信號(hào)量。23.μC/OS-II中表示當(dāng)前已經(jīng)創(chuàng)立的任務(wù)數(shù)全局變量名為:【OSTaskCtr】。24.μC/OS-II中表示當(dāng)前內(nèi)核運(yùn)行的標(biāo)記全局變量名為:【OSRunning】。25.在使用OSTaskCreate創(chuàng)立任務(wù)時(shí),假設(shè)需要TaskData作偽參數(shù)傳遞給任務(wù)Task,并從任務(wù)Task中獲得傳入的字符參數(shù)值,請(qǐng)?jiān)谙旅妗尽刻钌线m宜的代碼。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在任務(wù)Task1中使用郵箱函數(shù)OSMboxPost〔〕發(fā)送字符;而在Task2中接收OSMboxPost〔〕字符,請(qǐng)?jiān)谙旅妗尽刻钌线m宜的代碼。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中使用消息隊(duì)列OSQPend〔〕函數(shù)接收消息“HelloWorld!〞,而在Task2中使用消息隊(duì)列OSQPost〔〕函數(shù)發(fā)送消息“HelloWorld!〞,請(qǐng)?jiān)谙旅妗尽刻钌线m宜的代碼.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操作系統(tǒng)使用OSSchedLock()函數(shù)和OSSchedUnlock()函數(shù)進(jìn)行鎖定〔不允許任務(wù)級(jí)調(diào)度〕和解鎖〔重新允許任務(wù)級(jí)調(diào)度〕調(diào)度器,在用戶應(yīng)用程序中,OSSchedLock()和OSSchedUnlock()是【成對(duì)出現(xiàn)的】,否那么系統(tǒng)有可能出錯(cuò)。29.代碼的臨界段代碼的臨界段也稱為臨界區(qū),指處理時(shí)不可分割的代碼。30.資源任何為任務(wù)所占用的實(shí)體都可稱為資源。資源可以是輸入輸出設(shè)備;資源也可以是一個(gè)變量,一個(gè)結(jié)構(gòu)或一個(gè)數(shù)組等。31.共享資源可以被一個(gè)以上任務(wù)使用的資源叫做共享資源。32.任務(wù)一個(gè)任務(wù),也稱作一個(gè)線程,是一個(gè)簡(jiǎn)單的程序,該程序可以認(rèn)為CPU完全只屬該程序自己。典型地、每個(gè)任務(wù)都是一個(gè)無限的循環(huán)。33.任務(wù)切換指ContextSwitch,其含義是CPU存放器內(nèi)容切換。當(dāng)多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時(shí),它保存正在運(yùn)行任務(wù)的當(dāng)前狀態(tài)〔Context〕,即CPU存放器中的全部?jī)?nèi)容。34.內(nèi)核多任務(wù)系統(tǒng)中,內(nèi)核負(fù)責(zé)管理各個(gè)任務(wù),或者說為每個(gè)任務(wù)分配CPU時(shí)間,并且負(fù)責(zé)任務(wù)之間的通訊。內(nèi)核提供的根本效勞是任務(wù)切換。35.調(diào)度〔Scheduler〕內(nèi)核的主要職責(zé)之一,就是要決定該輪到哪個(gè)任務(wù)運(yùn)行了。多數(shù)實(shí)時(shí)內(nèi)核是基于優(yōu)先級(jí)調(diào)度法的。36.可剝奪型內(nèi)核最高優(yōu)先級(jí)的任務(wù)一旦就緒,總能得到CPU的控制權(quán)。當(dāng)一個(gè)運(yùn)行著的任務(wù)使一個(gè)比它優(yōu)先級(jí)高的任務(wù)進(jìn)入了就緒態(tài),當(dāng)前任務(wù)的CPU使用權(quán)就被剝奪了,或者說被掛起了,那個(gè)高優(yōu)先級(jí)的任務(wù)立刻得到了CPU的控制權(quán)。如果是中斷效勞子程序使一個(gè)高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài),中斷完成時(shí),中斷了的任務(wù)被掛起,優(yōu)先級(jí)高的那個(gè)任務(wù)開始運(yùn)行。37.任務(wù)根本信息內(nèi)涵(1)CPU中的PC存放器:任務(wù)〔程序〕當(dāng)前執(zhí)行的位置;(2)CPU中的通用存放器:任務(wù)當(dāng)前執(zhí)行代碼所涉及的臨時(shí)數(shù)據(jù);(3)CPU中的狀態(tài)存放器:存儲(chǔ)當(dāng)前CPU的狀態(tài)。38.任務(wù)切換任務(wù)切換是指從一個(gè)任務(wù)直接切換到另一個(gè)任務(wù),引起該次切換是由于某一個(gè)非中斷引起的事件或主動(dòng)放棄或調(diào)用節(jié)拍函數(shù)時(shí),使一個(gè)更高優(yōu)先級(jí)的任務(wù)處于就緒狀態(tài),暫停正在運(yùn)行著的任務(wù),轉(zhuǎn)而切換去執(zhí)行更高優(yōu)先級(jí)任務(wù);也可由中斷后,中斷退出時(shí)進(jìn)行任務(wù)調(diào)度,重新去執(zhí)行更高優(yōu)先級(jí)任務(wù)。39.舉例說明μCOS-II可移植型數(shù)據(jù)類型的定義方式答:因?yàn)椴煌奈⑻幚砥饔胁煌淖珠L(zhǎng),μC/OS-II的移植文件包括很多類型定義以確??梢浦残?。μCOS-II不使用C語言中的short,int,long等數(shù)據(jù)類型的定義,因?yàn)樗鼈兣c處理器類型有關(guān),隱含著不可移植性。μC/OS-II代之以移植性強(qiáng)的整數(shù)數(shù)據(jù)類型,這樣,既直觀又可移植(該數(shù)據(jù)類型不依賴于編譯),舉例如下:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedintINT16U;typedefsignedintINT16S;typedefunsignedlongINT32U;typedefsignedlongINT32S;40.μCOS-II如何定義全局變量?答:眾所周知,全局變量應(yīng)該是得到內(nèi)存分配且可以被其他模塊通過C語言中extern關(guān)鍵字調(diào)用的變量。因此,必須在.C和.H文件中定義。這種重復(fù)的定義很容易導(dǎo)致錯(cuò)誤。μCOS-II采用的方法只需用在頭文件中定義一次。uC/OS_II.H頭文件中包括以下定義全局宏定義:#ifdefOS_GLOBALS#defineOS_EXT#else#defineOS_EXTextern#endifOS_EXTINT32UOSIdleCtr;同時(shí),uCOS_II.H有中以下定義:#defineOS_GLOBALS#include“includes.h〞當(dāng)編譯器處理uCOS_II.C時(shí),它使得頭文件變成如下所示,因?yàn)镺S_EXT被設(shè)置為空。INT32UOSIdleCtr;這樣編譯器就會(huì)將這些全局變量分配在內(nèi)存中。當(dāng)編譯器處理其他.C文件時(shí),頭文件變成了如下的樣子,因?yàn)镺S_GLOBAL沒有定義,所以O(shè)S_EXT被定義為extern。externINT32UOSIdleCtr;在這種情況下,不產(chǎn)生內(nèi)存分配,而任何.C文件都可以使用這些變量。這樣的就只需在.H文件中定義一次就可以了。41.OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()的含義及作用?答:OS_ENTER_CRITICAL():關(guān)中斷;OS_EXIT_CRITICAL():開中斷。關(guān)中斷和開中斷是為了保護(hù)臨界段代碼。用戶的應(yīng)用代碼可以使用這兩個(gè)宏來開中斷和關(guān)中斷。很明顯,關(guān)中斷會(huì)影響中斷延遲,所以要特別小心。用戶還可以用信號(hào)量來保護(hù)臨界段代碼。42.基于PC的效勞中如何測(cè)量PC_DisplayChar()的執(zhí)行時(shí)間?答:測(cè)量PC_DisplayChar()的執(zhí)行時(shí)間的代碼如下:INT16Utime;//定義時(shí)間變量PC_ElapsedInit();//時(shí)鐘初始化PC_ElapsedStart();//開始計(jì)時(shí)PC_DispChar(40,24,?A?,DISP_FGND_WHITE);//執(zhí)行代碼time=PC_ElapsedStop();//結(jié)束計(jì)時(shí)43.uC/OS-II的任務(wù)框架答:voidtask_xxx(void*pData){/*該任務(wù)的初始化工作*/??/*進(jìn)入該任務(wù)的死循環(huán)*/while(1){??}}每個(gè)用戶的任務(wù)都必須符合事件驅(qū)動(dòng)的編程模型,即uC/OS-II的應(yīng)用程序都必須是“事件驅(qū)動(dòng)的編程模型〞。一個(gè)任務(wù)首先等待一個(gè)事件的發(fā)生,事件可以是系統(tǒng)中斷發(fā)出的,也可以是其它任務(wù)發(fā)出的,又可以是任務(wù)自身等待的時(shí)間片。當(dāng)一個(gè)事件發(fā)生了,任務(wù)再作相應(yīng)處理,處理結(jié)束后又開始等待下一個(gè)事件的發(fā)生。如此周而復(fù)始的任務(wù)處理模型就是“事件驅(qū)動(dòng)的編程模型〞。事件驅(qū)動(dòng)模型也涵蓋了中斷驅(qū)動(dòng)模型,uC/OS-II事件歸根結(jié)底來自三個(gè)方面:(1)中斷效勞函數(shù)發(fā)送的事件(2)系統(tǒng)延時(shí)時(shí)間到所引起的(3)其它任務(wù)發(fā)送的事件。44.與共享資源打交道時(shí),使之滿足互斥條件最一般的方法包括哪些?答:包括:關(guān)中斷、使用測(cè)試并置位指令、禁止做任務(wù)切換、利用信號(hào)量等。45.描述利用μC/OS_Ⅱ宏調(diào)用關(guān)中斷和開中斷處理共享數(shù)據(jù)的示意性代碼程答:OS_ENTER_CRITICAL();/*在這里處理共享數(shù)據(jù)*/OS_EXIT_CRITICAL();46.信號(hào)量的典型應(yīng)用包括哪些?答:信號(hào)量(Semaphores)是一種約定機(jī)制,在多任務(wù)內(nèi)核中的典型應(yīng)用包括:〔1〕控制共享資源的使用權(quán)(滿足互斥條件);〔2〕標(biāo)志某事件的發(fā)生〔3〕使兩個(gè)任務(wù)的行為同步47.對(duì)信號(hào)量只能實(shí)施哪三種操作?答:一般地說,對(duì)信號(hào)量只能實(shí)施三種操作:〔1〕初始化(INITIALIZE),也可稱作建立(CREATE);〔2〕等信號(hào)(WAIT)也可稱作掛起(PEND);〔3〕給信號(hào)(SIGNAL)或發(fā)信號(hào)(POST)。48.給出μC/OS-Ⅱ中如何用信號(hào)量處理共享數(shù)據(jù)的示意代碼?答:通過獲得信號(hào)量處理共享數(shù)據(jù)的示意代碼如下:OS_EVENT*SharedDataSem;voidFunction(void){INT8Uerr;OSSemPend(SharedDataSem,0,&err);/*共享數(shù)據(jù)的處理在此進(jìn)行,(中斷是開著的)*/OSSemPost(SharedDataSem);}49.給出初始化和啟動(dòng)μC/OS-Ⅱ的示意代碼。答:voidmain(void){OSInit();/*初始化uC/OS-II*/.通過調(diào)用OSTaskCreate()或OSTaskCreateExt()創(chuàng)立至少一個(gè)任務(wù);.OSStart();/*開始多任務(wù)調(diào)度!OSStart()永遠(yuǎn)不會(huì)返回*/}50.描述建立任務(wù)OSTaskCreate()的函數(shù)原型。建立任務(wù)OSTaskCreate()的函數(shù)原型為:INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)其中,task:任務(wù)代碼的指針;pdata:當(dāng)任務(wù)開始執(zhí)行時(shí)傳遞給任務(wù)的參數(shù)的指針;ptos:分配給任務(wù)的堆棧的棧頂指針;prio:分配給任務(wù)的優(yōu)先級(jí)。51.任務(wù)可以是一個(gè)無限的循環(huán),也可以是在一次執(zhí)行完畢后被刪除掉。請(qǐng)給出示意代碼結(jié)構(gòu)。答:μC/OS-Ⅱ描述的任務(wù)示意代碼必須是以下兩種結(jié)構(gòu)之一:voidYourTask(void*pdata){for(;;){/*用戶代碼*/調(diào)用μ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-Ⅱ任務(wù)管理提供哪些效勞?答:μC/OS-Ⅱ任務(wù)管理提供的效勞包括:〔1〕建立任務(wù):OSTaskCreate()或OSTaskCreateExt();〔2〕刪除任務(wù):OSTaskDel();〔3〕請(qǐng)求刪除任務(wù):OSTaskDelReq();〔4〕改變?nèi)蝿?wù)的優(yōu)先級(jí):OSTaskChangePrio();〔5〕掛起任務(wù):OSTaskSuspend();〔6〕恢復(fù)任務(wù):OSTaskResume();〔7〕獲得有關(guān)任務(wù)的信息:OSTaskQuery()。53.μC/OS-Ⅱ時(shí)間任務(wù)管理提供哪些效勞?答:μC/OS-Ⅱ時(shí)間任務(wù)管理提供的效勞包括:〔1〕任務(wù)延時(shí)函數(shù):OSTimeDly()〔2〕按時(shí)分秒延時(shí)函數(shù):OSTimeDlyHMSM()〔3〕讓處在延時(shí)期的任務(wù)結(jié)束延時(shí):OSTimeDlyResume()〔4〕設(shè)置系統(tǒng)時(shí)間:OSTimeGet()〔5〕獲得系統(tǒng)時(shí)間:OSTimeSet()54.μC/OS-Ⅱ提供的數(shù)據(jù)共享和任務(wù)通訊的方法包括哪些?答:μC/OS-Ⅱ提供的數(shù)據(jù)共享和任務(wù)通訊的方法包括五種方法:(1)利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來關(guān)閉中斷和翻開中斷。(2)利用函數(shù)OSSchedLock()和OSSchekUnlock()對(duì)μC/OS-II中的任務(wù)調(diào)度函數(shù)上鎖和開鎖。(3)信號(hào)量。(4)郵箱。(5)消息隊(duì)列。55.對(duì)于事件控制塊進(jìn)行的一些通用包括哪些操作?答:對(duì)于事件控制塊進(jìn)行的一些通用操作包括:〔1〕初始化一個(gè)事件控制塊:OSEventWaitListInit();〔2〕使一個(gè)任務(wù)進(jìn)入就緒態(tài):OSEventTaskRdy();〔3〕使一個(gè)任務(wù)進(jìn)入等待該事件的狀態(tài):OSEventTaskWait();〔4〕因?yàn)榈却瑫r(shí)而使一個(gè)任務(wù)進(jìn)入就緒態(tài):OSEventTO()。56.μC/OS-Ⅱ信號(hào)量提供哪些效勞?答:μC/OS-Ⅱ信號(hào)量提供的效勞包括:〔1〕建立一個(gè)信號(hào)量:OSSemCreate();〔2〕等待一個(gè)信號(hào)量:OSSemPend();〔3〕發(fā)送一個(gè)信號(hào)量:OSSemPost();〔4〕無等待地請(qǐng)求一個(gè)信號(hào)量:OSSemAccept();〔5〕查詢一個(gè)信號(hào)量的當(dāng)前狀態(tài):OSSemQuery()。57.μC/OS-Ⅱ郵箱提供哪些效勞?答:μC/OS-Ⅱ郵箱提供的效勞包括:〔1〕建立一個(gè)郵箱:OSMboxCreate();〔2〕等待一個(gè)郵箱中的消息:OSMboxPend();〔3〕發(fā)送一個(gè)消息到郵箱中:OSMboxPost();〔4〕無等待地從郵箱中得到一個(gè)消息:OSMboxAccept();〔5〕查詢一個(gè)郵箱的狀態(tài):OSMboxQuery()58.μC/OS-Ⅱ消息隊(duì)列提供哪些效勞?答:μC/OS-Ⅱ消息隊(duì)列提供的效勞包括:;〔1〕建立一個(gè)消息隊(duì)列:OSQCreate();;〔2〕等待一個(gè)消息隊(duì)列中的消息:OSQPend(;〔3〕向消息隊(duì)列發(fā)送一個(gè)消息〔FIFO〕:OSQ;〔4〕向消息隊(duì)列發(fā)送一個(gè)消息〔LIFO〕:OSQ;〔5〕無等待地從一個(gè)消息隊(duì)列中取得消息:OSQA;〔6〕清空一個(gè)消息隊(duì)列:OSQFlush();;〔7〕查詢一個(gè)消息答:μC/OS-Ⅱ消息隊(duì)列提供的效勞包括:〔1〕建立一個(gè)消息隊(duì)列:OSQCreate();〔2〕等待一個(gè)消息隊(duì)列中的消息:OSQPend();〔3〕向消息隊(duì)列發(fā)送一個(gè)消息〔FIFO〕:OSQPost();〔4〕向消息隊(duì)列發(fā)送一個(gè)消息〔LIFO〕:OSQPostFront();〔5〕無等待地從一個(gè)消息隊(duì)列中取得消息:OSQAccept();〔6〕清空一個(gè)消息隊(duì)列:OSQFlush();〔7〕查詢一個(gè)消息隊(duì)列的狀態(tài):OSQQuery()。59.μC/OS-Ⅱ內(nèi)存管理提供哪些效勞?答:μC/OS-Ⅱ內(nèi)存管理提供的效勞包括:〔1〕建立一個(gè)內(nèi)存分區(qū):OSMemCreate();〔2〕分配一個(gè)內(nèi)存塊:OSMemGet();〔3〕釋放一個(gè)內(nèi)存塊:OSMemPut();〔4〕查詢一個(gè)內(nèi)存分區(qū)的狀態(tài):OSMemQuery()。60.移植μC/OS-Ⅱ時(shí),要使μC/OS-Ⅱ正常運(yùn)行,處理器必須滿足哪些根本要求?答:要使μC/OS-Ⅱ正常運(yùn)行,處理器必須滿足以下要求:(1)處理器的C編譯器能產(chǎn)生可重入代碼。(2)用C語言就可以翻開和關(guān)閉中斷。(3)處理器支持中斷,并且能產(chǎn)生定時(shí)中斷(通常在10至100Hz之間)。(4)處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。(5)處理器有將堆棧指針和其它CPU存放器讀出和存儲(chǔ)到堆?;騼?nèi)存中的指令。61.舉例描述μC/OS-II基于任務(wù)的應(yīng)用程序設(shè)計(jì)方法答:#include<includes.h>#defineTASK_STK_SIZE128OS_STKAppStk_one[TASK_STK_SIZE];//任務(wù)one的堆棧OS_STKAppStk_two[TASK_STK_SIZE];//任務(wù)two的堆棧OS_STKAppStk_three[TASK_STK_SIZE];//任務(wù)three的堆棧staticvoidApp_one(void*p_arg);//任務(wù)one代碼staticvoidApp_two(void*p_arg);//任務(wù)two代碼staticvoidApp_three(void*p_arg);//任務(wù)three代碼voidmain(intargc,char*argv[]){OSInit();//初始化系統(tǒng)//依次創(chuàng)立三個(gè)任務(wù)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();啟動(dòng)多任務(wù),將CPU控制權(quán)交給系統(tǒng)}62.μC/OS-II調(diào)度算法原理及其和調(diào)度方式答:〔1〕優(yōu)先級(jí)調(diào)度算法原理為:給每一個(gè)任務(wù)分配一個(gè)惟一優(yōu)先級(jí),各優(yōu)先級(jí)用一個(gè)整形數(shù)值標(biāo)識(shí),某優(yōu)先級(jí)的值越大,其優(yōu)先級(jí)越低;某優(yōu)先級(jí)的值越小,其優(yōu)先級(jí)越高。也就是說,如果當(dāng)前操作系統(tǒng)準(zhǔn)備進(jìn)行調(diào)度,當(dāng)有兩個(gè)任務(wù)處于就緒狀態(tài),系統(tǒng)將優(yōu)先執(zhí)行優(yōu)先級(jí)別高的任務(wù)。(2)μC/OS-II操作系統(tǒng)有兩種調(diào)度方式:任務(wù)級(jí)任務(wù)調(diào)度和中斷級(jí)任務(wù)調(diào)度,μC/OS-II操作系統(tǒng)在完成中斷后允許進(jìn)行新的調(diào)度。63.描述μC/OS-II操作系統(tǒng)的任務(wù)級(jí)任務(wù)調(diào)度OS_Sched()的主要功能答:〔1〕查找當(dāng)前就緒表中最高優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)值;〔2〕調(diào)用OS_SchedNew()函數(shù)進(jìn)行任務(wù)切換,切換到新任務(wù)執(zhí)行。64.從消息郵箱中讀取消息的方式及其函數(shù)原型?答:(1)從消息郵箱中讀取消息的方式包括:非阻塞式讀取和阻塞式讀取兩種方式。(2)非阻塞式讀取是指無論消息郵箱中是否有數(shù)據(jù),讀取操作也不阻塞,直接返回,顯然,如果有數(shù)據(jù),將讀取出來,如果沒有數(shù)據(jù),將讀取為NULL。其函數(shù)原型為:void*OSMboxAccept(OS_EVENT*pevent)(3)阻塞式讀取是指在消息郵箱中有數(shù)據(jù)時(shí),直接讀取出來;如果沒有數(shù)據(jù),那么使當(dāng)前任務(wù)進(jìn)入等待狀態(tài),系統(tǒng)執(zhí)行調(diào)度程序執(zhí)行新的任務(wù),當(dāng)下一次消息到來時(shí)將激活等待表中的最高優(yōu)先級(jí)任務(wù),從而使該任務(wù)進(jìn)入就緒狀態(tài)。為了防止任務(wù)一直處于等待狀態(tài)〔所等待的資源一直未分配〕,可以設(shè)置一個(gè)等待的時(shí)間范圍,當(dāng)超過該延遲時(shí),那么直接返回。其函數(shù)原型為:void*OSMboxPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)65.論述μC/OS-Ⅱ控制下的任務(wù)狀態(tài)轉(zhuǎn)換圖答:μC/OS-Ⅱ控制下的任務(wù)狀態(tài)轉(zhuǎn)換圖如下列圖所示。在任一給定的時(shí)刻,任務(wù)的狀態(tài)一定是在這五種狀態(tài)之一。(1)睡眠態(tài)〔DORMANT〕:指任務(wù)駐留在程序空間之中,還沒有交給μC/OS-Ⅱ管理。一個(gè)任務(wù)可以通過調(diào)用OSTaskDel()返回到睡眠態(tài),或通過調(diào)用該函數(shù)讓另一個(gè)任務(wù)進(jìn)入睡眠態(tài)。(2)就緒態(tài)(READY):當(dāng)任務(wù)一旦建立,這個(gè)任務(wù)就進(jìn)入就緒態(tài)準(zhǔn)備運(yùn)行。把任務(wù)交給μC/OS-Ⅱ是通過調(diào)用下述兩個(gè)函數(shù)之一:OSTaskCreate()或OSTaskCreateExt()。(3)運(yùn)行態(tài)(RUN):調(diào)用OSStart()可以啟動(dòng)多任務(wù)。OSStart()函數(shù)運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)。(4)等待狀態(tài)(WAITING):正在運(yùn)行的任務(wù)可以通過調(diào)用兩個(gè)函數(shù)之一將自身延遲一段時(shí)間,這兩個(gè)函數(shù)是OSTimeDly()或OSTimeDlyHMSM()。這個(gè)任務(wù)于是進(jìn)入等待狀態(tài),等待這段時(shí)間過去,下一個(gè)優(yōu)先級(jí)最高的、并進(jìn)入了就緒態(tài)的任務(wù)立刻被賦予了CPU的控制權(quán)。正在運(yùn)行的任務(wù)期待某一事件的發(fā)生時(shí)也要等待,手段是調(diào)用以下3個(gè)函數(shù)之一:OSSemPend(),OSMboxPend(),或OSQPend()。調(diào)用后任務(wù)進(jìn)入了等待狀態(tài)〔WAITING〕。(5)中斷狀態(tài)(ISR):正在運(yùn)行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)了,或者μC/OS-Ⅱ?qū)⒅袛嚓P(guān)了。被中斷了的任務(wù)就進(jìn)入了中斷效勞態(tài)〔ISR〕。66.論述μC/OS-Ⅱ的核心數(shù)據(jù)結(jié)構(gòu)任務(wù)控制塊(OS_TCBs)答:任務(wù)控制塊(OS_TCBs)是μC/OS-Ⅱ的核心數(shù)據(jù)結(jié)構(gòu),當(dāng)任務(wù)的CPU使用權(quán)被剝奪時(shí),μC/OS-Ⅱ用它來保存該任務(wù)的狀態(tài)。當(dāng)任務(wù)重新得到CPU使用權(quán)時(shí),任務(wù)控制塊能確保任務(wù)從當(dāng)時(shí)被中斷的那一點(diǎn)絲毫不差地繼續(xù)執(zhí)行。OS_TCBs全部駐留在RAM中。一旦任務(wù)建立了,任務(wù)控制塊OS_TCBs將被賦值。μC/OS-II任務(wù)控制塊數(shù)據(jù)結(jié)構(gòu)定義如下: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是指向當(dāng)前任務(wù)棧頂?shù)闹羔?。OSTCBExtPtr指向用戶定義的任務(wù)控制塊擴(kuò)展。OSTCBStkBottom是指向任務(wù)棧底的指針。OSTCBStkSize存有棧中可容納的指針元數(shù)目而不是用字節(jié)〔Byte〕表示的棧容量總數(shù)。OSTCBId用于存儲(chǔ)任務(wù)的識(shí)別碼。OSTCBNext和OSTCBPrev用于任務(wù)控制塊OS_TCBs的雙重鏈接。OSTCBEventPtr是指向事件控制塊的指針。OSTCBMsg是指向傳給任務(wù)的消息的指針。OSTCBStat是任務(wù)的狀態(tài)字。OSTCBPrio是任務(wù)優(yōu)先級(jí)。OSTCBDelReq是一個(gè)布爾量,用于表示該任務(wù)是否需要?jiǎng)h除。OSTCBX,OSTCBY,OSTCBBitX和OSTCBBitY用于加速任務(wù)進(jìn)入就緒態(tài)的過程或進(jìn)入等待事件發(fā)生狀態(tài)的過程。3.論述事件控制塊ECB數(shù)據(jù)結(jié)構(gòu)答:μC/OS-II通過uCOS_II.H中定義的OS_EVENT數(shù)據(jù)結(jié)構(gòu)來維護(hù)一個(gè)事件控制塊的所有信息。該事件控制塊ECB數(shù)據(jù)結(jié)構(gòu)的定義如下:typedefstruct{void*OSEventPtr;/*指向消息或者消息隊(duì)列的指針*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任務(wù)列表*/INT16UOSEventCnt;/*計(jì)數(shù)器(當(dāng)事件是信號(hào)量時(shí))*/INT8UOSEventType;/*時(shí)間類型*/INT8UOSEventGrp;/*等待任務(wù)所在的組*/}OS_EVENT;其中:OSEventPtr指針:只有在所定義的事件是郵箱或者消息隊(duì)列時(shí)才使用。當(dāng)所定義的事件是郵箱時(shí),它指向一個(gè)消息,而當(dāng)所定義的事件是消息隊(duì)列時(shí),它指向一個(gè)數(shù)據(jù)結(jié)構(gòu).OSEventTbl[]和OSEventGrp:兩者包含的是系統(tǒng)中處于就緒狀態(tài)的任務(wù)。OSEventCnt:當(dāng)事件是一個(gè)信號(hào)量時(shí),用于信號(hào)量的計(jì)數(shù)器。OSEventType:定義了事件的具體類型。67.論述μC/OS-II內(nèi)存的管理的內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu)答:為了便于內(nèi)存的管理,在μC/OS-II中使用;內(nèi)存控制塊的數(shù)據(jù)結(jié)構(gòu)定義如下:;typedefstruct{;void*OSMemAddr;;void*OSMemFreeList;;INT32UOSMemBlkSize;;INT32UOSMemNBlks;;INT32UOSMemNFree;;}OS_MEM;;其中:;OSMemAddr是指向內(nèi)存分區(qū)起始地答:為了便于內(nèi)存的管理,在μC/OS-II中使用內(nèi)存控制塊〔memorycontrolblocks〕的數(shù)據(jù)結(jié)構(gòu)來跟蹤每一個(gè)內(nèi)存分區(qū),系統(tǒng)中的每個(gè)內(nèi)存分區(qū)都有它自己的內(nèi)存控制塊。內(nèi)存控制塊的數(shù)據(jù)結(jié)構(gòu)定義如下:typedefstruct{void*OSMemAddr;void*OSMemFreeList;INT32UOSMemBlkSize;INT32UOSMemNBlks;INT32UOSMemNFree;}OS_MEM;其中:OSMemAddr是指向內(nèi)存分區(qū)起始地址的指針。OSMemFreeList是指向下一個(gè)空閑內(nèi)存控制塊或者下一個(gè)空閑的內(nèi)存塊的指針。OSMemBlkSize是內(nèi)存分區(qū)中內(nèi)存塊的大小,是用戶建立該內(nèi)存分區(qū)時(shí)指定的。OSMemNBlks是內(nèi)存分區(qū)中總的內(nèi)存塊數(shù)量,也是用戶建立該內(nèi)存分區(qū)時(shí)指定的。OSMemNFree是內(nèi)存分區(qū)中當(dāng)前可以得空閑內(nèi)存塊數(shù)量。68、啟動(dòng)μC/OS-II任務(wù)的函數(shù)是_OSStart()_。69、OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)功能是_創(chuàng)立任務(wù)__。70、μC/OS-II用來記錄任務(wù)的堆棧指針、任務(wù)的當(dāng)前狀態(tài)、任務(wù)的優(yōu)先級(jí)別的數(shù)據(jù)結(jié)構(gòu)稱為任務(wù)控制塊〔OS_TCB〕。71、μC/OS-II有兩種調(diào)度器,一種是任務(wù)級(jí)的調(diào)度器;另一種是中斷級(jí)的調(diào)度器。72、voidOSTimeDly(INT16Uticks)中參數(shù)ticks是指_定時(shí)計(jì)數(shù)器確定的時(shí)間段,又稱節(jié)拍_。73、OSTimeDly〔〕或OSTimeDlyHMSM()的作用是___延時(shí)操作__。74、如果OSEventGrp的值是01101000〔二進(jìn)制〕,而對(duì)應(yīng)的OSUnMapTbl[OSEventGrp]值為3,如果.OSEventTbl[3]的值是11100100〔二進(jìn)制〕,OSUnMapTbl[OSEventTbl[3]]的值為2,那么處于等待狀態(tài)的任務(wù)的最高優(yōu)先級(jí)是3×8+2=26。75、能防止出現(xiàn)優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象的信號(hào)叫做互斥型信號(hào)量。76、消息郵箱是能在任務(wù)之間傳遞消息的指針的數(shù)據(jù)結(jié)構(gòu)。77、μC/OS-II的任務(wù)狀態(tài)有5個(gè)狀態(tài);分別是:1〕睡眠狀態(tài);2〕就緒狀態(tài);3〕運(yùn)行狀態(tài);4〕等待狀態(tài);5〕中斷效勞狀態(tài)。78、從任務(wù)的存儲(chǔ)結(jié)構(gòu)來看,μC/OS-II的任務(wù)由三個(gè)組成局部構(gòu)成,其三局部為:1〕任務(wù)程序代碼;2〕任務(wù)堆棧;3〕任務(wù)控制塊。79、μC/OS-II任務(wù)優(yōu)先級(jí)最多可建立64級(jí),其中設(shè)定0級(jí)為最高級(jí)。80、操作消息隊(duì)列時(shí)向指針數(shù)組中插入消息指針有2種方式,它們是:先進(jìn)先出(FIFO)方式和后進(jìn)先出(LIFO)方式。81、μC/OS-II任務(wù)的代碼結(jié)構(gòu)是〔C〕。對(duì)象結(jié)構(gòu);B〕數(shù)據(jù)結(jié)構(gòu);C〕一個(gè)帶有臨界段的無限循環(huán);D〕表結(jié)構(gòu)。82、μC/OS-II的任務(wù)控制塊是采用〔B〕結(jié)構(gòu)。A〕一條鏈表;B〕兩條鏈表;C〕三條鏈表;D〕四條鏈表;83、μC/OS-II中指向當(dāng)前正在運(yùn)行的任務(wù)指針為(B)。A〕OSTCBListB)OSTCBCurC)OSTCBFreeListD)OSEVENTList84、μC/OS-II中空任務(wù)控制鏈表的創(chuàng)立是由(B)函數(shù)實(shí)現(xiàn)的。A〕OSTCBInit()B)OSInit()C)OSTaskCreate()D)OSStart()85、解決任務(wù)優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象的方法是建立〔D〕A〕消息郵箱B〕信號(hào)量C〕消息隊(duì)列D〕互斥型信號(hào)量86、變量OSRdyGrp有作用是(C)?記錄就緒任務(wù)的分組信息B〕記錄就緒任務(wù)優(yōu)先級(jí)C)記錄就緒表分組后組內(nèi)有否就緒信息C〕記錄就緒任務(wù)是否就緒87、請(qǐng)求信號(hào)量函數(shù)是〔D〕。A〕OSFlagPend()B)OSMboxPend()C)OSQPend()D)OSSemPend()88、μC/OS-II中OSTCBDly變量是按〔C〕計(jì)算進(jìn)行的。A〕秒B〕毫秒C〕節(jié)拍D〕微秒89、什么是代碼的臨界區(qū)?答:代碼的監(jiān)界區(qū)是指處理時(shí)不可分割的代碼,運(yùn)行這些代碼不允許被打斷。一旦這局部代碼開始執(zhí)行,那么不允許任何中斷打入。中斷不調(diào)用任何臨界區(qū)的代碼或不訪問任何臨界區(qū)使用的共享資源時(shí),這個(gè)中斷是可能可以執(zhí)行。為確保臨界區(qū)代碼的執(zhí)行,在進(jìn)入臨界區(qū)之前要關(guān)中斷,而臨界區(qū)代碼執(zhí)行完成以后要立即開中斷。90、什么是嵌入式操作系統(tǒng)?為何要使用嵌入式操作系統(tǒng)?答:運(yùn)用在嵌入式系統(tǒng)上的實(shí)時(shí)操作系統(tǒng),具有事件驅(qū)動(dòng)和任務(wù)〔進(jìn)程〕調(diào)度功能,且在有限時(shí)隙內(nèi)能完成事件的響應(yīng)和任務(wù)〔進(jìn)程〕的切換,能可靠、實(shí)時(shí)、靈活地管理嵌入式系統(tǒng)上的各種資源和任務(wù)。使用嵌入式操作系統(tǒng),能方便實(shí)時(shí)應(yīng)用軟件的開發(fā)和有機(jī)地整合,能有效地管理和協(xié)調(diào)各項(xiàng)工作,因此是開發(fā)和運(yùn)行非常重要的環(huán)境。91、請(qǐng)寫出從任務(wù)就緒表中獲取優(yōu)先級(jí)別最高的就緒任務(wù)優(yōu)先級(jí)prio的代碼段:答:y=OSUnMapTal[OSRdyGrp];x=OSUnMapTal[OSRdyTbl[y]];prio=(y<<3)+x;或y=OSUnMapTbl[OSRdyGrp];prio=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);92、初始化函數(shù)OSInit()對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化時(shí),請(qǐng)舉出4個(gè)主要是創(chuàng)立內(nèi)容?答:主要?jiǎng)?chuàng)立的內(nèi)容是(1)空的內(nèi)任務(wù)控制塊鏈表〔OSTCBFreeList〕;(2)空的事件控制塊鏈表〔OSEventFreeList〕;(3)空的消息隊(duì)列控制塊鏈表(OSQFreeList);(4)空的標(biāo)志控制塊鏈表(OSFlagFreeList);(5)存儲(chǔ)控制塊鏈表(OSMemFreeList);93、簡(jiǎn)述μC/OS-II的中斷過程?答:系統(tǒng)接收到中斷請(qǐng)求后,如果這時(shí)CPU處于中斷允許狀態(tài)〔即中斷是開放的〕,系統(tǒng)就會(huì)中止正在運(yùn)行的當(dāng)前任務(wù),而按照中斷向量的指向轉(zhuǎn)而去運(yùn)行中斷效勞子程序;當(dāng)中斷效勞子程序的運(yùn)行結(jié)束后,系統(tǒng)將會(huì)根據(jù)情況返回到被中止的任務(wù)繼續(xù)運(yùn)行,或者轉(zhuǎn)向運(yùn)行另一個(gè)具有更高優(yōu)先級(jí)別的就緒任務(wù)。94、為什么μC/OS-II的中斷效勞子程序中不能請(qǐng)求信號(hào)量?答:這是由于OSSemPend〔〕的執(zhí)行同時(shí)要執(zhí)行OSEventTaskWait(),而中斷效勞子程序并非任務(wù)代碼,也就是非任務(wù)請(qǐng)求,顯然請(qǐng)求的實(shí)體不合理,導(dǎo)致程序執(zhí)行錯(cuò)誤。95、任務(wù)級(jí)切換和中斷級(jí)任務(wù)切換為什么沒有使用同一切換函數(shù)?答:中斷切換時(shí)要保護(hù)的操作已在中斷效勞子程序中完成,因此OSIntCtxSw()中不包含保護(hù)代碼,即無需壓棧操作,而任務(wù)級(jí)切換OSCtxSw()就多一些保護(hù)代碼段。96、描述μC/OS-II中的信號(hào)量結(jié)構(gòu)組成?μC/OS-II中的信號(hào)量由兩局部組成:一個(gè)是信號(hào)量的計(jì)數(shù)值,它是一個(gè)16位的無符號(hào)整數(shù)〔0到65,535之間〕;另一個(gè)是由等待該信號(hào)量的任務(wù)組成的等待任務(wù)表。用戶要在OS_CFG.H中將OS_SEM_EN開關(guān)量常數(shù)置成1,這樣μC/OS-II才能支持信號(hào)量。97、互斥型信號(hào)量是如何防止優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象出現(xiàn)的?答:互斥型信號(hào)量是一個(gè)二值信號(hào)量,其事件控制塊中,成員OSEventCnt被分成了低8位和高8位兩局部,低8位用來存放信號(hào)值〔該值為0xFF時(shí),信號(hào)為有效,否那么信號(hào)為無效〕,高8位用來存放防止出現(xiàn)優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象而提升的優(yōu)先級(jí)別prio。當(dāng)任務(wù)占有一個(gè)獨(dú)占式共享資源時(shí),事件控制塊的成員OSEventCnt低8位就不再是0xFF,如果任務(wù)的優(yōu)先級(jí)不是最高的,此時(shí),就要將成員OSEventCnt高8位作為本任務(wù)的prio,以使任務(wù)的優(yōu)先級(jí)此時(shí)最高,防止優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象出現(xiàn)。98、什么叫消息郵箱?答:在多任務(wù)間需要在任務(wù)與任務(wù)之間傳遞一個(gè)數(shù)據(jù)的方式,該數(shù)據(jù)是在存儲(chǔ)空間開出一個(gè)緩沖區(qū)的內(nèi)容,建立緩沖區(qū)指針,并能傳遞指針的數(shù)據(jù)結(jié)構(gòu)稱為消息郵箱。99、請(qǐng)描述標(biāo)志組中的OSFlagFlags和等待任務(wù)鏈表OSFlagNodeFlags作用?答:OSFlagFlags提供信號(hào)量集的所有信號(hào)狀態(tài),每一個(gè)信號(hào)占據(jù)一個(gè)二進(jìn)制位。當(dāng)所占位為1時(shí),表示此信號(hào)量集中該信號(hào)量有效,否那么該信號(hào)量無效。從而區(qū)分信號(hào)量集中信號(hào)量的分布特點(diǎn)。而等待任務(wù)鏈表OSFlagNodeFlags是任務(wù)請(qǐng)求信號(hào)集的過濾器,通過該變量,把任務(wù)需要的信號(hào)量篩選出來,而其余信號(hào)屏蔽掉。100、請(qǐng)解釋OS_CRITICAL_METHOD=1或2或3的含義?答:OS_CRITICAL_METHOD=1時(shí)直接使用處理器的開中斷和關(guān)中斷指令來實(shí)現(xiàn)宏;OS_CRITICAL_METHOD=2時(shí)帶有保存中斷允許標(biāo)志,且直接使用處理器的開中斷和關(guān)中斷指令來實(shí)現(xiàn);OS_CRITICAL_METHOD=3時(shí),使用用C編譯器具有擴(kuò)展功能。關(guān)中斷的同時(shí)將程序狀態(tài)字保存在全局變量sr中而不必壓到堆棧里。101、任務(wù)級(jí)切換和中斷級(jí)任務(wù)切換為什么沒有使用同一切換函數(shù)?答:中斷切換時(shí)要保護(hù)的操作已在中斷效勞子程序中完成,因此OSIntCtxSw()中不包含保護(hù)代碼,即無需壓棧操作,而任務(wù)級(jí)切換OSCtxSw()就多一些保護(hù)代碼段。102、什么是可剝奪型內(nèi)核?答:CPU總是運(yùn)行多個(gè)任務(wù)中優(yōu)先級(jí)別最高的那個(gè)任務(wù),即使CPU正在運(yùn)行某個(gè)低優(yōu)先級(jí)別的任務(wù),當(dāng)有高優(yōu)先級(jí)別的任務(wù)準(zhǔn)備就緒時(shí),該高級(jí)別的任務(wù)就會(huì)剝奪正在運(yùn)行任務(wù)的CPU使用權(quán),而使自已獲得CPU的使用權(quán)。這種操作規(guī)那么的CPU內(nèi)核稱為可剝奪型內(nèi)核。103、什么叫可重入函數(shù)?答:在多任務(wù)操作系統(tǒng)中,系統(tǒng)提供的函數(shù)應(yīng)該能允許同時(shí)被多個(gè)任務(wù)所調(diào)用,而不會(huì)通過函數(shù)中變量的耦合引起任務(wù)之間的相互干擾。這樣的函數(shù)叫做可重入函數(shù)。104、請(qǐng)簡(jiǎn)明分析OSSched〔〕代碼每條番號(hào)語句的的含義;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、請(qǐng)寫出μC/OS-II系統(tǒng)啟動(dòng)運(yùn)行時(shí)的示意結(jié)構(gòu)代碼(包括主函數(shù)及任務(wù)函數(shù))答:#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、設(shè)計(jì)一個(gè)有兩個(gè)任務(wù)的應(yīng)用程序,其中一個(gè)任務(wù)用來進(jìn)行兩個(gè)數(shù)的加法運(yùn)算,另一個(gè)任務(wù)那么用來顯示結(jié)果。〔采用消息郵箱實(shí)現(xiàn)〕〔其顯示函數(shù)為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、設(shè)計(jì)當(dāng)有按鍵操作時(shí),實(shí)現(xiàn)一次A/D轉(zhuǎn)換和顯示的應(yīng)用程序,即按一次鍵,僅實(shí)現(xiàn)一次A/D轉(zhuǎn)換,每一次A/D轉(zhuǎn)換任務(wù)要求采樣200次,采樣間隔10ms的共200個(gè)數(shù)據(jù),并顯示出來?!渤绦蛑幸蟀捎孟⑧]箱和信號(hào)量以及時(shí)間中斷進(jìn)行設(shè)計(jì)〕〔其顯示函數(shù)為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任務(wù)的代碼結(jié)構(gòu)是_一個(gè)帶臨界段的無限循環(huán)_或無循環(huán)但執(zhí)行一次要?jiǎng)h除任務(wù)__。109、空閑任務(wù)的作用_使CPU在沒有任務(wù)可執(zhí)行時(shí)有事可做__。110、μC/OS-II的任務(wù)調(diào)度器的主要工作有兩項(xiàng),一是在任務(wù)就緒表中查找具有最高優(yōu)先級(jí)別的就緒任務(wù);二是實(shí)現(xiàn)任務(wù)的切換。111、實(shí)現(xiàn)臨界段的宏由關(guān)中斷宏OS_ENTER_CRITICAL()和開中斷宏OS_EXIT_CRITICAL()。112、OSTimeTick()完成兩個(gè)功能,它們是計(jì)數(shù)器OSTime加1和遍歷任務(wù)控制塊鏈表中的所有任務(wù)控制塊,把任務(wù)控制塊中用來存放任務(wù)延時(shí)時(shí)限的OSTCBDly變量減1,并使該項(xiàng)為0,同時(shí)又不使被掛起的任務(wù)進(jìn)入就緒狀態(tài)。113、通過事件發(fā)送事件操作獲取消息叫請(qǐng)求事件。114、信號(hào)量集由標(biāo)志組和等待任務(wù)鏈表局部組成。115、μC/OS-II的任務(wù)控制塊用來保存任務(wù)屬性;任務(wù)堆棧用來保存任務(wù)工作環(huán)境;任務(wù)程序代碼是任務(wù)執(zhí)行局部。116、μC/OS-II最多可支持64個(gè)任務(wù),其中用戶任務(wù)最多有56個(gè),系統(tǒng)任務(wù)可有4個(gè)。117、μC/OS-II用兩條鏈表來管理任務(wù)控制塊,一條是空任務(wù)塊鏈表;別一條是任務(wù)塊鏈表。118、指向空任務(wù)控制鏈表的頭指針為〔A〕。A〕OSTCBFreeListB)OSTCBCurC)OSEVENTFreeListD)OSEVENTList119、μC/OS-II中指向當(dāng)前正在運(yùn)行的任務(wù)指針為(B)。A〕OSTCBListB)OSTCBCurC)OSTCBFreeListD)OSEVENTList120、μC/OS-II中任務(wù)控制塊的初始化是由(A)函數(shù)實(shí)現(xiàn)的。A〕OSTCBInit()B)OSInit()C)OSTaskCreate()D)OSStart()121、μC/OS-II中記錄中斷嵌套的層數(shù)的全局變量是:〔A〕A〕OSIntNestingB)OSLockNestingC)OSRunningD)OSIntEnter122、變量OSRdyGrp有作用是(C)?記錄就緒任務(wù)的分組信息B〕記錄就緒任務(wù)優(yōu)先級(jí)C)記錄就緒表分組后組內(nèi)有否就緒信息C〕記錄就緒任務(wù)是否就緒123、請(qǐng)求消息郵箱函數(shù)是〔B〕。A〕OSFlagPend()B)OSMboxPend()C)OSQPend()D)OSSemPend()124、發(fā)送消息隊(duì)列函數(shù)是〔C〕。A〕OSFlagPost()B)OSMboxPost()C)OSQPost()D)OSSemPost()125、解決任務(wù)優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象的方法是建立〔D〕A〕消息郵箱B〕信號(hào)量C〕消息隊(duì)列D〕互斥型信號(hào)量126、什么是嵌入式系統(tǒng)?答:嵌入式系統(tǒng)是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為根底,軟件硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、本錢、體積及功耗嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng),具有完成復(fù)雜功能的硬件和軟件且緊密耦合在一起的計(jì)算機(jī)系統(tǒng)。127、請(qǐng)寫出優(yōu)先級(jí)別為Prio的任務(wù)置為就緒狀態(tài)示意代碼:答:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];128、請(qǐng)寫出使一個(gè)優(yōu)先級(jí)別為Prio的任務(wù)脫離就緒狀態(tài)的示意代碼:答:if((OSRdyTbl[prio>>3]&=-OSMapTbl[prio&0x07])==0)OSRdyGrp&=-OSMapTbl[prio>>3];129、請(qǐng)寫出從任務(wù)就緒表中獲取優(yōu)先級(jí)別最高的就緒任務(wù)優(yōu)先級(jí)prio的代碼段:答:y=OSUnMapTal[OSRdyGrp];x=OSUnMapTal[OSRdyTbl[y]];prio=(y<<3)+x;或y=OSUnMapTbl[OSRdyGrp];prio=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);130、簡(jiǎn)要論述任務(wù)切換操作是在什么條件下才會(huì)發(fā)生?答:分兩大類,一類主動(dòng)實(shí)現(xiàn)任務(wù)切換,包括:主動(dòng)掛起和恢復(fù)調(diào)用;主動(dòng)延遲調(diào)用;請(qǐng)求事件調(diào)用且事件未滿足時(shí)和釋放事件時(shí);另一類是被動(dòng)任務(wù)切換,包括:各種隨機(jī)中斷響應(yīng)后在退出中斷時(shí)。131、初始化函數(shù)OSInit()對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化時(shí),請(qǐng)舉出4個(gè)主要是創(chuàng)立內(nèi)容?答:主要?jiǎng)?chuàng)立的內(nèi)容是(1)空的內(nèi)任務(wù)控制塊鏈表〔OSTCBFreeList〕;(2)空的事件控制塊鏈表〔OSEventFreeList〕;(3)空的消息隊(duì)列控制塊鏈表(OSQFreeList);(4)空的標(biāo)志控制塊鏈表(OSFlagFreeList);(5)存儲(chǔ)控制塊鏈表(OSMemFreeList);132、任務(wù)級(jí)切換函數(shù)OSCtxSw()與中斷級(jí)任務(wù)切換函數(shù)OSIntCtxSw()為什么不一樣?答:中斷切換時(shí)要保護(hù)的操作已在中斷效勞子程序中完成,因此OSIntCtxSw()中不包含保護(hù)代碼,即無需壓棧操作,而任務(wù)級(jí)切換OSCtxSw()就多一些保護(hù)代碼段。133、簡(jiǎn)述OSTimeTick()作用?134、為什么在高優(yōu)先級(jí)的任務(wù)代碼里要插入OSTimeDly〔〕或OSTimeDlyHMSM()函數(shù)?135、什么是任務(wù)優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象?答:在可剝奪型內(nèi)核中,當(dāng)任務(wù)以獨(dú)占方式使用共享資源時(shí),會(huì)出現(xiàn)低優(yōu)先級(jí)任務(wù)先于高優(yōu)先級(jí)任務(wù)而被運(yùn)行的現(xiàn)象。136、指出操作消息隊(duì)列時(shí)向指針數(shù)組中插入消息指針的2種方式及操作特點(diǎn)?答:(1)先進(jìn)先出(FIFO)方式;指針OSQIn指向的位置插入消息指針,指針OSQOut指向消息指針作為輸出。(2)后進(jìn)先出(LIFO)方式;只使用OSQOut指針,輸入和輸出都用OSQOut指針。137、什么是消息隊(duì)列?答:讓數(shù)組的每個(gè)元素都存放一個(gè)消息緩沖區(qū)指針,任務(wù)可通過傳遞這個(gè)指針數(shù)組指針的方法來傳遞多個(gè)消息,這種傳遞多個(gè)消息的數(shù)據(jù)結(jié)構(gòu)叫做消息隊(duì)列。138、什么是實(shí)時(shí)系統(tǒng)?實(shí)時(shí)嵌入式操作系統(tǒng)的特點(diǎn)是什么?答:實(shí)時(shí)系統(tǒng)就是利用實(shí)時(shí)操作系統(tǒng)用于過程控制、事務(wù)處理等有實(shí)時(shí)要求的領(lǐng)域的系統(tǒng)。實(shí)時(shí)嵌入式操作系統(tǒng)特點(diǎn)是實(shí)時(shí)性和可靠性,實(shí)時(shí)系統(tǒng)的特征是實(shí)時(shí)時(shí)鐘管理,提供系統(tǒng)日期和時(shí)間、定時(shí)和延時(shí)等時(shí)鐘管理功能;過載保護(hù),緩沖區(qū)排隊(duì),丟棄某些任務(wù),動(dòng)態(tài)調(diào)整任務(wù)周期;高度可靠性和平安性,容錯(cuò)能力和冗余備份。139、什么是可剝奪型內(nèi)核?140、為什么在把μC/OS-II向51單片機(jī)上移植時(shí)要設(shè)立系統(tǒng)堆棧和任務(wù)堆棧映像?答:這是由于51單片機(jī)的RAM大小只有128個(gè)字節(jié),運(yùn)行任務(wù)堆棧只能在這一區(qū)域,才能操作,而其它非運(yùn)行任務(wù)的任務(wù)堆棧只能在外部RAM存儲(chǔ)器中暫時(shí)保存,構(gòu)成內(nèi)部RAM中任務(wù)堆棧的任務(wù)堆棧映像。當(dāng)非運(yùn)行任務(wù)轉(zhuǎn)化為運(yùn)行任務(wù)時(shí),其外部任務(wù)堆棧數(shù)據(jù)也要復(fù)制到內(nèi)部SP指向RAM空間。141、下面程序段有錯(cuò)誤,請(qǐng)修改代碼。#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、請(qǐng)寫出主函數(shù)及任務(wù)函數(shù)的示意結(jié)構(gòu)代碼:答:#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、編寫一個(gè)有3個(gè)任務(wù)的應(yīng)用程序,每個(gè)任務(wù)均會(huì)在顯示器上顯示一個(gè)字符,并讓3個(gè)任務(wù)具有不同的等待時(shí)間。答:#include“includes.h〞#defineTASK_STK_SIZE512//任務(wù)堆棧長(zhǎng)度OS_STKMyTaskStk[TASK_STK_SIZE];//定義任務(wù)堆棧區(qū)OS_STKYouTaskStk[TASK_STK_SIZE];//定義任務(wù)堆棧區(qū)OS_STKHerTaskStk[TASK_STK_SIZE];//定義任務(wù)堆棧區(qū)INT16SKey;//用于退出μC/OS-II的鍵INT8Ux=0,y=0;//字符顯示位置VoidMyTask(void*data);//聲明一個(gè)任務(wù)VoidYouTask(void*data);//聲明一個(gè)任務(wù)VoidHerTask(void*data);//聲明一個(gè)任務(wù)Voidmain(void){char*s_M=“M〞;//定義要顯示的字符char*s_N=“N〞;//定義要顯示的字符char*s_L=“L〞;//定義要顯示的字符OSInit();//初始化μC/OS-IIPC_DOSSaveReturn();//保存DOS環(huán)境PC_VectSet(uCOS,OSCtxSw);//安裝μC/OS-II任務(wù)切換中斷向量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();//啟動(dòng)多任務(wù)管理}VoidMyTask(void*pdata);{#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);//安裝μC/OS-II時(shí)鐘中斷向量PC_SetTickRate(OS_TICKS_PER_SEC);//設(shè)置μC/OS-II時(shí)鐘頻率OS_EXIT_CRITICAL();OSStatInit()//初始化μC/OS-II的統(tǒng)計(jì)任務(wù)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時(shí)鐘中斷向量PC_SetTickRate(OS_TICKS_PER_SEC);//設(shè)置μC/OS-II時(shí)鐘頻率OS_EXIT_CRITICAL();OSStatInit()//初始化μC/OS-II的統(tǒng)計(jì)任務(wù)for(;;){if(x>10){x=0;y+=2;}PC_DispChar(x,y,//字符的顯示位置

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論