版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
ucos-ii操作系統(tǒng)習(xí)題(嵌入式方向)ucos-ii操作系統(tǒng)習(xí)題(嵌入式方向)ucos-ii操作系統(tǒng)習(xí)題(嵌入式方向)xxx公司ucos-ii操作系統(tǒng)習(xí)題(嵌入式方向)文件編號(hào):文件日期:修訂次數(shù):第1.0次更改批準(zhǔn)審核制定方案設(shè)計(jì),管理制度ucos-ii操作系統(tǒng)習(xí)題填空題uC/OS-II是一個(gè)簡潔、易用的基于優(yōu)先級(jí)的嵌入式【搶占式】多任務(wù)實(shí)時(shí)內(nèi)核。任務(wù)是一個(gè)無返回的無窮循環(huán)。uc/os-ii總是運(yùn)行進(jìn)入就緒狀態(tài)的【最高優(yōu)先級(jí)】的任務(wù)。因?yàn)閡c/os-ii總是運(yùn)行進(jìn)入就緒狀態(tài)的最高優(yōu)先級(jí)的任務(wù)。所以,確定哪個(gè)任務(wù)優(yōu)先級(jí)最高,下面該哪個(gè)任務(wù)運(yùn)行,這個(gè)工作就是由【調(diào)度器(scheduler)】來完成的?!救蝿?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)度。任務(wù)切換其實(shí)很簡單,由如下2步完成: (1)將被掛起任務(wù)的處理器寄存器推入自己的【任務(wù)堆?!俊?(2)然后將進(jìn)入就緒狀態(tài)的最高優(yōu)先級(jí)的任務(wù)的寄存器值從堆棧中恢復(fù)到【寄存器】中。6.任務(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)閉。7.【不可剝奪型】內(nèi)核要求每個(gè)任務(wù)自我放棄CPU的所有權(quán)。不可剝奪型調(diào)度法也稱作合作型多任務(wù),各個(gè)任務(wù)彼此合作共享一個(gè)CPU。8.當(dāng)系統(tǒng)響應(yīng)時(shí)間很重要時(shí),要使用【可剝奪型】內(nèi)核。最高優(yōu)先級(jí)的任務(wù)一旦就緒,總能得到CPU的控制權(quán)。9.使用可剝奪型內(nèi)核時(shí),應(yīng)用程序不應(yīng)直接使用不可重入型函數(shù)。調(diào)用不可重入型函數(shù)時(shí),要滿足互斥條件,這一點(diǎn)可以用【互斥型信號(hào)量】來實(shí)現(xiàn)。10.【可重入型】函數(shù)可以被一個(gè)以上的任務(wù)調(diào)用,而不必?fù)?dān)心數(shù)據(jù)的破壞。11.可重入型函數(shù)任何時(shí)候都可以被中斷,一段時(shí)間以后又可以運(yùn)行,而相應(yīng)數(shù)據(jù)不會(huì)丟失??芍厝胄秃瘮?shù)或者只使用【局部變量】,即變量保存在CPU寄存器中或堆棧中。如果使用全局變量,則要對(duì)全局變量予以【保護(hù)】。12.每個(gè)任務(wù)都有其優(yōu)先級(jí)。任務(wù)越重要,賦予的優(yōu)先級(jí)應(yīng)【越高】。13.μC/OS-Ⅱ初始化是通過調(diào)用系統(tǒng)函數(shù)【OSIint()】實(shí)現(xiàn)的,完成μC/OS-Ⅱ所有的變量和數(shù)據(jù)結(jié)構(gòu)的初始化。14.多任務(wù)的啟動(dòng)是用戶通過調(diào)用【OSStart()】實(shí)現(xiàn)的。然而,啟動(dòng)μC/OS-Ⅱ之前,用戶至少要建立一個(gè)應(yīng)用【任務(wù)】。15.μC/OS-Ⅱ的參數(shù)配置文件名為【】。16.刪除任務(wù),是說任務(wù)將返回并處于【休眠狀態(tài)】,并不是說任務(wù)的代碼被刪除了,只是任務(wù)的代碼不再被μC/OS-Ⅱ調(diào)用。17.μC/OS-Ⅱ要求用戶提供【定時(shí)中斷】來實(shí)現(xiàn)延時(shí)與超時(shí)控制等功能。18.定時(shí)中斷也叫做【時(shí)鐘節(jié)拍】,它應(yīng)該每秒發(fā)生10至100次。19.時(shí)鐘節(jié)拍的實(shí)際頻率是由用戶的應(yīng)用程序決定的。時(shí)鐘節(jié)拍的頻率越高,系統(tǒng)的負(fù)荷就【越重】。20.μC/OS-II中的信號(hào)量由兩部分組成:一個(gè)是信號(hào)量的【計(jì)數(shù)值】,它是一個(gè)16位的無符號(hào)整數(shù)(0到65,535之間);另一個(gè)是由等待該信號(hào)量的任務(wù)組成的【等待任務(wù)表】。用戶要在中將OS_SEM_EN開關(guān)量常數(shù)置成【1】,這樣μC/OS-II才能支持信號(hào)量。21.μC/OS-II中表示當(dāng)前已經(jīng)創(chuàng)建的任務(wù)數(shù)全局變量名為:【OSTaskCtr】。21.μC/OS-II中表示當(dāng)前內(nèi)核運(yùn)行的標(biāo)記全局變量名為:【OSRunning】。22.在使用OSTaskCreate創(chuàng)建任務(wù)時(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);}}23.在μ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);}}24.在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);}}25.μ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ò)。(self)可把正在運(yùn)行的任務(wù)【(____掛起____)】,參數(shù)self指【(__任務(wù)本身____)】。用此函數(shù)掛起的任務(wù)可通過【(OSTaskResume)】函數(shù)喚醒。27.創(chuàng)建信號(hào)量OSSemCreat(0)函數(shù)中,參數(shù)0表示【(信號(hào)量的初始值)】。二.名詞解釋1.代碼的臨界段 代碼的臨界段也稱為臨界區(qū),指處理時(shí)不可分割的代碼。2.資源 任何為任務(wù)所占用的實(shí)體都可稱為資源。資源可以是輸入輸出設(shè)備;資源也可以是一個(gè)變量,一個(gè)結(jié)構(gòu)或一個(gè)數(shù)組等。3.共享資源 可以被一個(gè)以上任務(wù)使用的資源叫做共享資源。4.任務(wù) 一個(gè)任務(wù),也稱作一個(gè)線程,是一個(gè)簡單的程序,該程序可以認(rèn)為CPU完全只屬該程序自己。典型地、每個(gè)任務(wù)都是一個(gè)無限的循環(huán)。 5.任務(wù)切換 指ContextSwitch,其含義是CPU寄存器內(nèi)容切換。當(dāng)多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時(shí),它保存正在運(yùn)行任務(wù)的當(dāng)前狀態(tài)(Context),即CPU寄存器中的全部內(nèi)容。6.內(nèi)核 多任務(wù)系統(tǒng)中,內(nèi)核負(fù)責(zé)管理各個(gè)任務(wù),或者說為每個(gè)任務(wù)分配CPU時(shí)間,并且負(fù)責(zé)任務(wù)之間的通訊。內(nèi)核提供的基本服務(wù)是任務(wù)切換。7.調(diào)度(Scheduler) 內(nèi)核的主要職責(zé)之一,就是要決定該輪到哪個(gè)任務(wù)運(yùn)行了。多數(shù)實(shí)時(shí)內(nèi)核是基于優(yōu)先級(jí)調(diào)度法的。8.可剝奪型內(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)。如果是中斷服務(wù)子程序使一個(gè)高優(yōu)先級(jí)的任務(wù)進(jìn)入就緒態(tài),中斷完成時(shí),中斷了的任務(wù)被掛起,優(yōu)先級(jí)高的那個(gè)任務(wù)開始運(yùn)行。三.簡答題舉例說明μCOS-II可移植型數(shù)據(jù)類型的定義方式答:因?yàn)椴煌奈⑻幚砥饔胁煌淖珠L,μ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;μCOS-II如何定義全局變量 答:眾所周知,全局變量應(yīng)該是得到內(nèi)存分配且可以被其他模塊通過C語言中extern關(guān)鍵字調(diào)用的變量。因此,必須在.C和.H文件中定義。這種重復(fù)的定義很容易導(dǎo)致錯(cuò)誤。μCOS-II采用的方法只需用在頭文件中定義一次。 uC/頭文件中包括以下定義全局宏定義: #ifdefOS_GLOBALS #defineOS_EXT #else #defineOS_EXTextern #endif OS_EXTINT32UOSIdleCtr; 同時(shí),有中以下定義: #defineOS_GLOBALS #include“” 當(dāng)編譯器處理時(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文件中定義一次就可以了。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ù)臨界段代碼。4.基于PC的服務(wù)中如何測(cè)量PC_DisplayChar()的執(zhí)行時(shí)間答: 測(cè)量PC_DisplayChar()的執(zhí)行時(shí)間的代碼如下: INT16Utime;描述利用μC/OS_Ⅱ宏調(diào)用關(guān)中斷和開中斷處理共享數(shù)據(jù)的示意性代碼程序。答: OS_ENTER_CRITICAL(); /*在這里處理共享數(shù)據(jù)*/ OS_EXIT_CRITICAL();8.信號(hào)量的典型應(yīng)用包括哪些答: 信號(hào)量(Semaphores)是一種約定機(jī)制,在多任務(wù)內(nèi)核中的典型應(yīng)用包括:控制共享資源的使用權(quán)(滿足互斥條件);標(biāo)志某事件的發(fā)生使兩個(gè)任務(wù)的行為同步9.對(duì)信號(hào)量只能實(shí)施哪三種操作答: 一般地說,對(duì)信號(hào)量只能實(shí)施三種操作:初始化(INITIALIZE),也可稱作建立(CREATE);等信號(hào)(WAIT)也可稱作掛起(PEND);給信號(hào)(SIGNAL)或發(fā)信號(hào)(POST)。10.給出μ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);}11.給出初始化和啟動(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ì)返回*/}12.描述建立任務(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í)。13.任務(wù)可以是一個(gè)無限的循環(huán),也可以是在一次執(zhí)行完畢后被刪除掉。 請(qǐng)給出示意代碼結(jié)構(gòu)。答:μC/OS-Ⅱ描述的任務(wù)示意代碼必須是以下兩種結(jié)構(gòu)之一:voidYourTask(void*pdata){for(;;){/*用戶代碼*/調(diào)用μC/OS-Ⅱ的服務(wù)例程之一:OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/*用戶代碼*/}}或voidYourTask(void*pdata){/*用戶代碼*/OSTaskDel(OS_PRIO_SELF);} 14.μC/OS-Ⅱ任務(wù)管理提供哪些服務(wù)答:μC/OS-Ⅱ任務(wù)管理提供的服務(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()。15.μC/OS-Ⅱ時(shí)間任務(wù)管理提供哪些服務(wù)答:μC/OS-Ⅱ時(shí)間任務(wù)管理提供的服務(wù)包括:任務(wù)延時(shí)函數(shù):OSTimeDly()按時(shí)分秒延時(shí)函數(shù):OSTimeDlyHMSM()讓處在延時(shí)期的任務(wù)結(jié)束延時(shí):OSTimeDlyResume()設(shè)置系統(tǒng)時(shí)間:OSTimeGet()獲得系統(tǒng)時(shí)間:OSTimeSet()16.μC/OS-Ⅱ提供的數(shù)據(jù)共享和任務(wù)通訊的方法包括哪些答:μC/OS-Ⅱ提供的數(shù)據(jù)共享和任務(wù)通訊的方法包括五種方法:利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來關(guān)閉中斷和打開中斷。利用函數(shù)OSSchedLock()和OSSchekUnlock()對(duì)μC/OS-II中的任務(wù)調(diào)度函數(shù)上鎖和開鎖。信號(hào)量。郵箱。消息隊(duì)列。17.對(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()。18.μC/OS-Ⅱ信號(hào)量提供哪些服務(wù)答:μC/OS-Ⅱ信號(hào)量提供的服務(wù)包括: (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()。19.μC/OS-Ⅱ郵箱提供哪些服務(wù)答:μC/OS-Ⅱ郵箱提供的服務(wù)包括: (1)建立一個(gè)郵箱:OSMboxCreate(); (2)等待一個(gè)郵箱中的消息:OSMboxPend(); (3)發(fā)送一個(gè)消息到郵箱中:OSMboxPost(); (4)無等待地從郵箱中得到一個(gè)消息:OSMboxAccept(); (5)查詢一個(gè)郵箱的狀態(tài):OSMboxQuery()20.μC/OS-Ⅱ消息隊(duì)列提供哪些服務(wù)答:μC/OS-Ⅱ消息隊(duì)列提供的服務(wù)包括: (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()。21.μC/OS-Ⅱ內(nèi)存管理提供哪些服務(wù)答:μC/OS-Ⅱ內(nèi)存管理提供的服務(wù)包括:建立一個(gè)內(nèi)存分區(qū):OSMemCreate();分配一個(gè)內(nèi)存塊:OSMemGet();釋放一個(gè)內(nèi)存塊:OSMemPut();查詢一個(gè)內(nèi)存分區(qū)的狀態(tài):OSMemQuery()。22.移植μC/OS-Ⅱ時(shí),要使μC/OS-Ⅱ正常運(yùn)行,處理器必須滿足哪些基本要求答:要使μC/OS-Ⅱ正常運(yùn)行,處理器必須滿足以下要求:處理器的C編譯器能產(chǎn)生可重入代碼。用C語言就可以打開和關(guān)閉中斷。處理器支持中斷,并且能產(chǎn)生定時(shí)中斷(通常在10至100Hz之間)。處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。處理器有將堆棧指針和其它CPU寄存器讀出和存儲(chǔ)到堆?;騼?nèi)存中的指令。23.描繪不可剝奪型內(nèi)核中斷響應(yīng)示意圖答:24.舉例描述μC/OS-II基于任務(wù)的應(yīng)用程序設(shè)計(jì)方法答:#include<>#defineTASK_STK_SIZE128OS_STKAppStk_one[TASK_STK_SIZE];μ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)度。26.描述μ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_TASK_SW()進(jìn)行任務(wù)切換,切換到新任務(wù)執(zhí)行。27.從消息郵箱中讀取消息的方式及其函數(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)四.論述題論述μC/OS-Ⅱ控制下的任務(wù)狀態(tài)轉(zhuǎn)換圖 答:μC/OS-Ⅱ控制下的任務(wù)狀態(tài)轉(zhuǎn)換圖如下圖所示。 在任一給定的時(shí)刻,任務(wù)的狀態(tài)一定是在這五種狀態(tài)之一。睡眠態(tài)(DORMANT):指任務(wù)駐留在程序空間之中,還沒有交給μC/OS-Ⅱ管理。一個(gè)任務(wù)可以通過調(diào)用OSTaskDel()返回到睡眠態(tài),或通過調(diào)用該函數(shù)讓另一個(gè)任務(wù)進(jìn)入睡眠態(tài)。就緒態(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()。運(yùn)行態(tài)(RUN):調(diào)用OSStart()可以啟動(dòng)多任務(wù)。OSStart()函數(shù)運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)。等待狀態(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)。中斷狀態(tài)(ISR):正在運(yùn)行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)了,或者μC/OS-Ⅱ?qū)⒅袛嚓P(guān)了。被中斷了的任務(wù)就進(jìn)入了中斷服務(wù)態(tài)(ISR)。2.論述μ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通過中定義的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:定義了事件的具體類型。4.論述μC/OS-II內(nèi)存的管理的內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu)答:為了便于內(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ù)量。五、uC_OS-II程序題一、編寫一個(gè)uC/OS-II應(yīng)用程序,要求:(1)
包含兩個(gè)用戶任務(wù)(MyTask、YouTask)和兩個(gè)系統(tǒng)任務(wù)(統(tǒng)計(jì)任務(wù)、空閑任務(wù));
(2)把MyTask作為起始任務(wù),MyTask、YouTask的優(yōu)先級(jí)分別為0、2;
(3)
當(dāng)MyTask運(yùn)行10次后對(duì)調(diào)度器進(jìn)行加鎖,運(yùn)行到80次時(shí)對(duì)調(diào)度器進(jìn)行解鎖;
(4)
當(dāng)MyTask運(yùn)行的運(yùn)行次數(shù)大于85次后,要求YouTask刪除它自己,YouTask接到要求后,等待15s鐘,然后刪除自己。
(這個(gè)程序要仔細(xì)點(diǎn)看,注釋寫得最詳細(xì),這個(gè)看懂了,后面的就應(yīng)該也能看懂了,這三個(gè)程序大部分代碼都是差不多的,藍(lán)色粗體字的部分是一些關(guān)鍵語句或可能隨著題目要求變化的語句)
#include""#defineTASK_STK_SIZE512 //任務(wù)堆棧長度OS_STKMyTaskStk[TASK_STK_SIZE]; //定義MyTask任務(wù)堆棧區(qū)OS_STKYouTaskStk[TASK_STK_SIZE]; //定義YouTask任務(wù)堆棧區(qū)INT8Ux=0,y=0; //這兩個(gè)變量分別用來指定要顯示字符的橫縱坐標(biāo),即列和行,標(biāo)準(zhǔn)的DOS窗口是80x25,也就是可以顯示80行、25列字符,//有了這兩個(gè)變量就可以將字符精確的顯示在DOS窗口的某個(gè)地方。INT8Utimes=0; //這個(gè)變量用了記錄MyTask任務(wù)的運(yùn)行次數(shù)voidMyTask(void*pdata);voidYouTask(void*pdata);voidmain(void){char*s_M="M";OSInit(); //初始化uCOS_IIPC_DOSSaveReturn(); //保存Dos環(huán)境PC_VectSet(uCOS,OSCtxSw); //安裝uCOS_II中斷OSTaskCreate(MyTask,s_M,&MyTaskStk[TASK_STK_SIZE-1],0);//創(chuàng)建起始任務(wù)(此題中要求將MyTask作為起始任務(wù)),將s_M//作為參數(shù)傳遞給MyTask函數(shù),并將該任務(wù)的優(yōu)先級(jí)設(shè)置為0(優(yōu)先級(jí)按照題目的規(guī)定去設(shè)置,一般起始任務(wù)要設(shè)置為最高[數(shù)值越小,優(yōu)先級(jí)越高])。OSStart(); //啟動(dòng)系統(tǒng)}voidMyTask(void*pdata){
char*
s_M="M";
OSInit();
//初始化uCOS_II
PC_DOSSaveReturn();
//保存Dos環(huán)境
PC_VectSet(uCOS,
OSCtxSw);
//安裝uCOS_II中斷
OSTaskCreate(MyTask,
s_M,
&MyTaskStk[TASK_STK_SIZE
-
1],
0);//
創(chuàng)建起始任務(wù)(此題中要求將MyTask作為起始任務(wù)),
將s_M
//作為參數(shù)傳遞給MyTask函數(shù),并將該任務(wù)的優(yōu)先級(jí)設(shè)置為0(優(yōu)先級(jí)按照題目的規(guī)定去設(shè)置,一般起始任務(wù)要設(shè)置為最高[數(shù)值越小,優(yōu)先級(jí)越高])。
OSStart();
//啟動(dòng)系統(tǒng)
}void
MyTask
(void
*pdata)
{
char*
s_Y="Y";
char*
s="MyTask:
I
asking
YouTask
to
delete
his
own!";
#if
OS_CRITICAL_METHOD
==
3
//如果使用的是第3種方法來開關(guān)中斷,則需要用到cpu_sr這個(gè)變量來保存程序狀態(tài)字
OS_CPU_SR
cpu_sr;
//定義cpu_sr這個(gè)變量
#endif
pdata
=
pdata;
//
這句可以不寫,僅僅只是為了防止編譯器報(bào)錯(cuò)
OS_ENTER_CRITICAL();
//進(jìn)入臨界段(關(guān)中斷)
PC_VectSet(0x08,
OSTickISR);
//
安裝uCOS_II時(shí)鐘中斷向量
PC_SetTickRate(OS_TICKS_PER_SEC);
//
設(shè)置uCOS_II時(shí)鐘頻率
OS_EXIT_CRITICAL();
//退出臨界段(開中斷)
OSStatInit();
//
創(chuàng)建和初始化uCOS_II的統(tǒng)計(jì)任務(wù)(這條語句一定不能掉,不然會(huì)扣很多分的)
OSTaskCreate(YouTask,
s_Y,
&YouTaskStk[TASK_STK_SIZE
-
1],
2);
//在MyTask任務(wù)中創(chuàng)建YouTask任務(wù),優(yōu)先級(jí)為2
for
(;;)
{
if(times>85)
//如果MyTask任務(wù)的運(yùn)行次數(shù)大于了85次,就要求YouTask任務(wù)刪除它自己(這個(gè)數(shù)值也是由題目規(guī)定的,題目要求
{
//
MyTask運(yùn)行多少次后刪除YouTask就將此處改成多少
while(
OSTaskDelReq(2)
!=
OS_TASK_NOT_EXIST)//
要注意OSTaskDelReq后括號(hào)中的2,這個(gè)數(shù)值是所要?jiǎng)h除的任務(wù)的
{
//優(yōu)先級(jí),要?jiǎng)h除哪個(gè)任務(wù)就在此處填入該任務(wù)的優(yōu)先級(jí),該程序中,優(yōu)先級(jí)2對(duì)應(yīng)的任務(wù)為YouTask
PC_DispStr(10,
8,
s,
DISP_FGND_YELLOW+DISP_BGND_BLUE);
//在屏幕上的第10列、第8行顯示s所代表的字符//
串,s在上面已經(jīng)定義了。(這些DOS窗口的打印函數(shù)在書本附錄A[page263]都有介紹)
OSTimeDly(1);
}
}
if(x>50)
//當(dāng)一行打印的字符數(shù)大于了50個(gè)后,換行,換到該行下面的第二行(因?yàn)閥=y+2),然后從行首開始打印(因?yàn)閤=0)
{
x=0;
y+=2;}
times+=1;
//每運(yùn)行一次times加1,以記錄下MyTask任務(wù)的運(yùn)行次數(shù)
if(times==10)
OSSchedLock();
//當(dāng)MyTask運(yùn)行10次后,給調(diào)度器加鎖,這個(gè)數(shù)值由題目的要求給定
if(times==80)
OSSchedUnlock();
//當(dāng)MyTask運(yùn)行80次后,給調(diào)度器解鎖,這個(gè)數(shù)值也由題目的要求給定
PC_DispChar(x,
y,
*(char*)pdata,
DISP_BGND_BLACK+DISP_FGND_WHITE);
//在x、y指定的位置打印字符”M”
x
+=
1;
//
將列加1,為打印下一字符準(zhǔn)備好位置
OSTimeDlyHMSM(0,
0,
3,
0);
//等待3秒鐘,此處的時(shí)間也由題目給定,若要求是延時(shí)多少ms或tick,就應(yīng)該使用函數(shù)OSTimeDly()
}
}
void
YouTask(void*
pdata)
{
char*
s1="YouTask:
I
must
delete
myself!";
char*
s2="YouTask:
I
have
deleted
my
own!";
#if
OS_CRITICAL_METHOD
==
3
OS_CPU_SR
cpu_sr;
#endif
pdata=pdata;for(;;)
{
if(OSTaskDelReq(OS_PRIO_SELF)==OS_TASK_DEL_REQ)
//YouTask利用函數(shù)OSTaskDelReq()來查看自己是否被別人要求刪除,
{
//如果是,
PC_DispStr(10,
10,
s1,
DISP_FGND_WHITE+DISP_BGND_BLACK);//則在指定位置打印字符串s1
OSTimeDlyHMSM(0,
0,
15,
0);
//等待15s(此處看題目有沒有這個(gè)要求,若沒有,則可不寫
PC_DispStr(10,
12,
s2,
DISP_FGND_WHITE+DISP_BGND_BLACK);
//在指定位置打印字符串s2
OSTaskDel(OS_PRIO_SELF);
//自己將自己刪除
}
if(x>50)
{x=0;
y+=2;
}
PC_DispChar(x,
y,
*(char*)pdata,
DISP_BGND_BLACK+DISP_FGND_WHITE
);
//在沒有被刪除時(shí),仍然打印字符”Y”
x
+=
1;
OSTimeDlyHMSM(0,
0,
1,
0);
}
}二、編寫一個(gè)uC/OS-II應(yīng)用程序,要求:(1)
包含3個(gè)用戶任務(wù)(MyTask、YouTask和InterTask),優(yōu)先級(jí)分別為0、1、2,并把MyTask作為起始任務(wù);(2)
任務(wù)InterTask由時(shí)鐘節(jié)拍中斷服務(wù)程序中的鉤子函數(shù)在被調(diào)用10000次時(shí)使用一個(gè)信號(hào)變量InterKey激活,其他時(shí)候不活動(dòng);
(3)
當(dāng)程序打印完第一行字符后,取消YouTask任務(wù)的延時(shí)。
#include
""
#define
TASK_STK_SIZE
512
//任務(wù)堆棧長度
OS_STK
MyTaskStk[TASK_STK_SIZE];
//定義任務(wù)堆棧區(qū)
OS_STK
YouTaskStk[TASK_STK_SIZE];
OS_STK
InterTaskStk[TASK_STK_SIZE];
INT8U
x=0,
y=0;
BOOLEAN
InterKey=FALSE;
//這個(gè)標(biāo)志變量用來激活I(lǐng)nterTask任務(wù)
char*
s="The
InterTask
is
running!";
void
MyTask(void*
pdata);
void
YouTask(void*
pdata);
void
InterTask(void*
pdata);void
main
(void)
{
char*
s_M="M";
OSInit();
//初始化uCOS_II
PC_DOSSaveReturn();
//保存Dos環(huán)境
PC_VectSet(uCOS,
OSCtxSw);
//安裝uCOS_II中斷
OSTaskCreate(MyTask,
s_M,
&MyTaskStk[TASK_STK_SIZE
-
1],0);
//注意優(yōu)先級(jí)要設(shè)置為題目的要求
OSStart();
//啟動(dòng)uCOS_II
}
void
MyTask
(void
*pdata)
{
char*
s_Y="Y";
char*
s_H="H";
#if
OS_CRITICAL_METHOD
==
3
OS_CPU_SR
cpu_sr;
#endif
pdata
=
pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08,
OSTickISR);
//安裝uCOS_II時(shí)鐘中斷向量
PC_SetTickRate(OS_TICKS_PER_SEC);
//設(shè)置uCOS_II時(shí)鐘頻率
OS_EXIT_CRITICAL();
OSStatInit();
//初始化uCOS_II的統(tǒng)計(jì)任務(wù)
OSTaskCreate(YouTask,
s_Y,
&YouTaskStk[TASK_STK_SIZE
-
1],
1);
//注意優(yōu)先級(jí)要設(shè)置為題目的要求
OSTaskCreate(InterTask,
s_H,
&InterTaskStk[TASK_STK_SIZE
-
1],
2);
//注意優(yōu)先級(jí)要設(shè)置為題目的要求
for
(;;)
{
if(x>50)
{x=0;
y+=2;
}
if(y>1)
OSTimeDlyResume(1);//打印完第1行字符后,取消YouTask任務(wù)的延時(shí),注意括號(hào)中的數(shù)值,一定要是被取消延時(shí)的任務(wù)的
//優(yōu)先級(jí),此處的1是YouTask任務(wù)的優(yōu)先級(jí)。這條語句一定不能掉
PC_DispChar(x,
y,
*(char*)pdata,
DISP_BGND_BLACK+DISP_FGND_WHITE);
//打印字符”M”
x
+=
1;
OSTimeDly(100);
//延時(shí)100ms或100個(gè)tick,此處的值根據(jù)題目要求更改,沒有要求的話可以就使用這個(gè)
}
}
void
YouTask(void*
pdata)
{
#if
OS_CRITICAL_METHOD
==
3
OS_CPU_SR
cpu_sr;
#endif
pdata=pdata;
for(;;)
{
if(x>50)
{x=0;y+=2;}PC_DispChar(x,
y,
*(char*)pdata,
DISP_BGND_BLACK+DISP_FGND_WHITE
);
//打印字符”Y”
x
+=
1;
OSTimeDly(500);
//此處的值根據(jù)題目要求更改,沒有要求的話可以就使用這個(gè)
}
}
void
InterTask(void*
pdata)
{
#if
OS_CRITICAL_METHOD
==
3
OS_CPU_SR
cpu_sr;
#endif
pdata
=
pdata;
for(;;)
{
if(InterKey)
//如果InterKey標(biāo)志的值為真,則:
{
if(x>50){
x=0;
y+=2;}
PC_DispChar(x,
y,
*(char*)pdata,
DISP_BGND_BLACK+DISP_FGND_WHITE
);//打印字符”H”
PC_DispStr(5,
6,
s,
DISP_BGND_BLACK+DISP_FGND_WHITE
);//并打印字符串s(已在程序開頭定義)
x+=1;
}
InterKey=FALSE;
//重新將InterKey標(biāo)志的值置為假
OSTimeDlyHMSM(0,0,1,0);
//
此處的值根據(jù)題目要求更改,沒有要求的話可以就使用這個(gè)
}
}
//--下面的內(nèi)容和上面的不在同一個(gè)文件中,鉤子函數(shù)幾乎都是在文件中定義的
extern
BOOLEAN
InterKey;
//聲明InterKey這個(gè)變量是在該文件外部定義的
INT16U
InterCtr
=
0;
//用了記錄時(shí)鐘節(jié)拍數(shù),即該鉤子函數(shù)被調(diào)用的次數(shù)
void
OSTimeTickHook
(void)
{
if(InterCtr
==
10000)
//當(dāng)時(shí)鐘tick總數(shù)等于10000(這個(gè)值按題目中的要求進(jìn)行設(shè)置)時(shí)
InterKey
=
TRUE;
//將InterKey標(biāo)志的值置為真
InterCtr++;
}三、設(shè)計(jì)一個(gè)應(yīng)用程序,該程序有MyTask何YouTask兩個(gè)任務(wù),在任務(wù)MyTask中用一個(gè)變量記錄MyTask的運(yùn)行次數(shù),并將其
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年銷售人員入職培訓(xùn)與職業(yè)發(fā)展合同
- 公開課《土地的誓言》課件
- 區(qū)塊鏈在體育領(lǐng)域的應(yīng)用案例考核試卷
- 2025版學(xué)校浴室熱水供應(yīng)設(shè)備采購與安裝合同3篇
- 2025版土地使用權(quán)出讓居間合同(高端定制版)3篇
- 2025年博主合作廣告合同
- 2025年度健康養(yǎng)生門面店鋪轉(zhuǎn)讓及服務(wù)項(xiàng)目合作協(xié)議4篇
- 2025年博物文化貸款合同
- 2025年高校外國文教專家教學(xué)與研究合作合同3篇
- 2025年公司增資協(xié)議書模板
- 乳腺癌的綜合治療及進(jìn)展
- 【大學(xué)課件】基于BGP協(xié)議的IP黑名單分發(fā)系統(tǒng)
- 2025年八省聯(lián)考高考語文試題真題解讀及答案詳解課件
- 信息安全意識(shí)培訓(xùn)課件
- 2024年山東省泰安市初中學(xué)業(yè)水平生物試題含答案
- 美的MBS精益管理體系
- 2024安全員知識(shí)考試題(全優(yōu))
- 中國移動(dòng)各省公司組織架構(gòu)
- 昆明手繪版旅游攻略
- 法律訴訟及咨詢服務(wù) 投標(biāo)方案(技術(shù)標(biāo))
- 格式塔心理咨詢理論與實(shí)踐
評(píng)論
0/150
提交評(píng)論