(完整word版)ucos復(fù)習(xí)資料_第1頁(yè)
(完整word版)ucos復(fù)習(xí)資料_第2頁(yè)
(完整word版)ucos復(fù)習(xí)資料_第3頁(yè)
(完整word版)ucos復(fù)習(xí)資料_第4頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1 uC/OS-II是一個(gè)簡(jiǎn)潔、易用的基于優(yōu)先級(jí)的嵌入式【搶占式】多任務(wù)實(shí)時(shí)內(nèi)核。2 任務(wù)是一個(gè)無(wú)返回的無(wú)窮循環(huán)。uc/os-ii 總是運(yùn)行進(jìn)入就緒狀態(tài)的【最高優(yōu)先級(jí)】的任務(wù)。3 因?yàn)?uc/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 )】來(lái)完成的。4 【任務(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(

2、)】實(shí)現(xiàn)調(diào)度。5 任務(wù)切換其實(shí)很簡(jiǎn)單,由如下2 步完成:(1)將被掛起任務(wù)的處理器寄存器推入自己的【任務(wù)堆?!?。(2)然后將進(jìn)入就緒狀態(tài)的最高優(yōu)先級(jí)的任務(wù)的寄存器值從堆棧中恢復(fù)到【寄存器】中。6 任務(wù)的 5 種狀態(tài)?!舅邞B(tài) (task dormat)】:任務(wù)駐留于程序空間(rom 或 ram )中,暫時(shí)沒(méi)交給ucos-ii 處理。【就緒態(tài)( task ready )】:任務(wù)一旦建立,這個(gè)任務(wù)就進(jìn)入了就緒態(tài)?!具\(yùn)行態(tài)( task running )】:調(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)(

3、task waiting )】:正在運(yùn)行的任務(wù),通過(guò)延遲函數(shù)或pend (掛起)相關(guān)函數(shù)后,將進(jìn)入等待狀態(tài)?!局袛酄顟B(tài)(ISR running )】:正在運(yùn)行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)閉或者ucos-ii 將中斷關(guān)閉。7【 不可剝奪型 】?jī)?nèi)核要求每個(gè)任務(wù)自我放棄 CPU 的所有權(quán)。不可剝奪型調(diào)度法也稱作合作型多任務(wù),各個(gè)任務(wù)彼此合作共享一個(gè) CPU 。8當(dāng)系統(tǒng)響應(yīng)時(shí)間很重要時(shí),要使用【可剝奪型】?jī)?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)量】來(lái)實(shí)

4、現(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-初始化是通過(guò)調(diào)用系統(tǒng)函數(shù)【OSIint() 】實(shí)現(xiàn)的,完成C/OS- 所有的變量和數(shù)據(jù)結(jié)構(gòu)的初始化。14多任務(wù)的啟動(dòng)是用戶通過(guò)調(diào)用【OSStart() 】實(shí)現(xiàn)的。然而,啟動(dòng)C/OS-之前,用戶至少要建立一個(gè)應(yīng)用【任務(wù)】。15. C/OS-的參數(shù)配置

5、文件名為【 OS_CFG.H 】。16 刪除任務(wù) ,是說(shuō)任務(wù)將返回并處于【休眠狀態(tài)】,并不是說(shuō)任務(wù)的代碼被刪除了,只是任務(wù)的代碼不再被?C/OS- 調(diào)用。17 ?C/OS- 要求用戶提供【定時(shí)中斷】來(lái)實(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 位的無(wú)符號(hào)整數(shù)(0 到 65,535 之間);另一個(gè)是由等待該信號(hào)量的任務(wù)組成的【等待任務(wù)表】。用戶要在OS_CFG.H中將

6、 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的代碼。char TaskData=A;OSTaskCreate(Task,【 (void *)& TaskData】 , &TaskStk0TASK_STK_SIZ

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

8、接收 OSMboxPost ()字符 , 請(qǐng)?jiān)谙旅妗尽刻钌虾线m的代碼。void Task1 (void *data)char txmsg;INT8U err;txmsg = 'A'for (;) OSMboxPost(TxMbox,【 (void *)&txmsg】 ); /* Send message to Task2*/OSMboxPend(AckMbox, 0, &err);txmsg+;if (txmsg = 'Z') txmsg = 'A'void Task5 (void *data)char *rxmsg;INT8U

9、err;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ù)接收消息“Hello World! ,而”在Task2中使用消息隊(duì)列OSQPost()函數(shù)發(fā)送消息 “Hello World!”請(qǐng),在下面【】填上合適的代碼.void Task1 (void *pdat

10、a)char *msg;INT8U err;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);void Task2 (void *pdata)char msg20;pdata = pdata;strcpy(&msg0, " Hello World!");for (;) OSQPost(MsgQueue,【(v

11、oid *) 】&msg0);OSTimeDlyHMSM(0, 0, 0, 500);1. 舉例說(shuō)明 ?COS-II 可移植型數(shù)據(jù)類型的定義方式答:因?yàn)椴煌奈⑻幚砥饔胁煌淖珠L(zhǎng),?C/OS-II的移植文件包括很多類型定義以確??梢浦残?。?COS-II不使用C 語(yǔ)言中的short,int,long等數(shù)據(jù)類型的定義,因?yàn)樗鼈兣c處理器類型有關(guān),隱含著不可移植性。?C/OS-II代之以移植性強(qiáng)的整數(shù)數(shù)據(jù)類型,這樣,既直觀又可移植(該數(shù)據(jù)類型不依賴于編譯),舉例如下 :typedef unsigned char BOOLEAN;typedef unsigned char INT8U;typed

12、ef signed char INT8S;typedef unsigned int INT16U;typedef signed int INT16S;typedef unsigned long INT32U;typedef signed long INT32S;2. ?COS-II如何定義全局變量?答:眾所周知 ,全局變量應(yīng)該是得到內(nèi)存分配且可以被其他模塊通過(guò) C 語(yǔ)言中 extern 關(guān)鍵字調(diào)用的變量 。因此,必須在文件中定義。這種重復(fù)的定義很容易導(dǎo)致錯(cuò)誤。 ?COS-II 采用的方法只需用在頭文件中定義一次。.C和 .HuC/OS_II.H頭文件中包括以下定義全局宏定義:#ifdef OS

13、_GLOBALS#define OS_EXT#else#define OS_EXT extern#endifOS_EXT INT32U OSIdleCtr;同時(shí), uCOS_II.H有中以下定義:#define OS_GLOBALS#include“includes.h”當(dāng)編譯器處理uCOS_II.C時(shí),它使得頭文件變成如下所示,因?yàn)镺S_EXT 被設(shè)置為空。INT32U OSIdleCtr;這樣編譯器就會(huì)將這些全局變量分配在內(nèi)存中。當(dāng)編譯器處理其他.C 文件時(shí),頭文件變成了如下的樣子,因?yàn)镺S_GLOBAL沒(méi)有定義,所以O(shè)S_EXT 被定義為extern 。extern INT32U OSI

14、dleCtr;在這種情況下,不產(chǎn)生內(nèi)存分配,而任何.C 文件都可以使用這些變量。這樣的就只需在.H文件中定義一次就可以了。3. OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()的含義及作用?答:OS_ENTER_CRITICAL() :關(guān)中斷;OS_EXIT_CRITICAL():開中斷。關(guān)中斷和開中斷是為了保護(hù)臨界段代碼。用戶的應(yīng)用代碼可以使用這兩個(gè)宏來(lái)開中斷和關(guān)中斷。很明顯,關(guān)中斷會(huì)影響中斷延遲,所以要特別小心。用戶還可以用信號(hào)量來(lái)保護(hù)臨界段代碼。4基于 PC 的服務(wù)中如何測(cè)量PC_DisplayChar()的執(zhí)行時(shí)間?答:測(cè)量 PC_DisplayChar(

15、)的執(zhí)行時(shí)間的代碼如下:INT16U time; /定義時(shí)間變量PC_ElapsedInit(); /時(shí)鐘初始化PC_ElapsedStart(); /開始計(jì)時(shí)PC_DispChar(40, 24,A, DISP_FGND_WHITE); 執(zhí)/行代碼time = PC_ElapsedStop(); /結(jié)束計(jì)時(shí)5 uC/OS-II 的任務(wù)框架答:void task_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ù)首先等待一

16、個(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é)底來(lái)自三個(gè)方面:(1)中斷服務(wù)函數(shù)發(fā)送的事件(2)系統(tǒng)延時(shí)時(shí)間到所引起的(3)其它任務(wù)發(fā)送的事件。6 與共享資源打交道時(shí),使之滿足互斥條件最一般的方法包括哪些?答:包括:關(guān)中斷、使用測(cè)試并置位指令、禁止做任務(wù)切換、利用信號(hào)量等。7. 描述利用 C/OS_ 宏調(diào)用關(guān)中斷和開中斷處理共享數(shù)據(jù)的示意性代碼程序。答:

17、OS_ENTER_CRITICAL();/*在這里處理共享數(shù)據(jù)*/OS_EXIT_CRITICAL();8. 信號(hào)量的典型應(yīng)用包括哪些?答:信號(hào)量 (Semaphores)是一種約定機(jī)制,在多任務(wù)內(nèi)核中的典型應(yīng)用包括:( 1) 控制共享資源的使用權(quán) (滿足互斥條件 );( 2) 標(biāo)志某事件的發(fā)生( 3) 使兩個(gè)任務(wù)的行為同步9對(duì)信號(hào)量只能實(shí)施哪三種操作?答:一般地說(shuō),對(duì)信號(hào)量只能實(shí)施三種操作:( 1) 初始化 (INITIALIZE) ,也可稱作建立 (CREATE) ;( 2) 等信號(hào) (WAIT) 也可稱作掛起 (PEND) ;( 3) 給信號(hào) (SIGNAL) 或發(fā)信號(hào) (POST) 。

18、10. 給出 C/OS-中如何用信號(hào)量處理共享數(shù)據(jù)的示意代碼?答:通過(guò)獲得信號(hào)量處理共享數(shù)據(jù)的示意代碼如下:OS_EVENT *SharedDataSem;void Function (void)INT8U err;OSSemPend(SharedDataSem, 0, &err);/*共享數(shù)據(jù)的處理在此進(jìn)行,(中斷是開著的 )*/OSSemPost(SharedDataSem);11. 給出初始化和啟動(dòng)C/OS-的示意代碼。答:void main (void)OSInit(); /*初始化 uC/OS-II */.通過(guò)調(diào)用 OSTaskCreate()或 OSTaskCreateEx

19、t()創(chuàng)建至少一個(gè)任務(wù);.OSStart(); /*開始多任務(wù)調(diào)度!OSStart() 永遠(yuǎn)不會(huì)返回*/12 描述建立任務(wù)OSTaskCreate()的函數(shù)原型。答:建立任務(wù) OSTaskCreate()的函數(shù)原型為:INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)其中,task:任務(wù)代碼的指針;pdata:當(dāng)任務(wù)開始執(zhí)行時(shí)傳遞給任務(wù)的參數(shù)的指針;ptos: 分配給任務(wù)的堆棧的棧頂指針;prio: 分配給任務(wù)的優(yōu)先級(jí)。13任務(wù)可以是一個(gè)無(wú)限的循環(huán),也可以是在一次執(zhí)行完畢后被刪除掉

20、。請(qǐng)給出示意代碼結(jié)構(gòu)。答:?C/OS- 描述的任務(wù)示意代碼必須是以下兩種結(jié)構(gòu)之一:void YourTask (void *pdata)for (;) /* 用戶代碼*/調(diào)用?C/OS- 的服務(wù)例程之一:OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/* 用戶代碼*/或void YourTask (void *pdata)/* 用戶代碼*/OSTaskDel(OS_PRIO_SELF);14 C/OS-任務(wù)管理提

21、供哪些服務(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ù)包括:( 1) 任務(wù)延時(shí)函數(shù): OSTimeD

22、ly()( 2) 按時(shí)分秒延時(shí)函數(shù): OSTimeDlyHMSM()( 3) 讓處在延時(shí)期的任務(wù)結(jié)束延時(shí):OSTimeDlyResume()( 4) 設(shè)置系統(tǒng)時(shí)間: OSTimeGet()( 5) 獲得系統(tǒng)時(shí)間: OSTimeSet()16. C/OS-提供的數(shù)據(jù)共享和任務(wù)通訊的方法包括哪些?答:C/OS-提供的數(shù)據(jù)共享和任務(wù)通訊的方法包括五種方法:(1) 利用宏 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL() 來(lái)關(guān)閉中斷和打開中斷。(2) 利用函數(shù) OSSchedLock() 和 OSSchekUnlock() 對(duì)?C/OS-II 中的任務(wù)調(diào)度函數(shù)上鎖和開鎖

23、。(3) 信號(hào)量。(4) 郵箱。(5) 消息隊(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)量: OS

24、SemPend() ;( 3)發(fā)送一個(gè)信號(hào)量: OSSemPost() ;( 4)無(wú)等待地請(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)無(wú)等待地從郵箱中得到一個(gè)消息:OSMboxAccept() ;( 5)查詢一個(gè)郵箱的狀態(tài): OSMboxQuery()20 C/OS-消息隊(duì)列提供哪

25、些服務(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)無(wú)等待地從一個(gè)消息隊(duì)列中取得消息:OSQAccept() ;( 6)清空一個(gè)消息隊(duì)列: OSQFlush() ;( 7)查詢一個(gè)消息隊(duì)列的狀態(tài): OSQQuery() 。21 C/OS-內(nèi)存管理提供哪些服務(wù)?答:C/OS-內(nèi)存管理提供的服務(wù)包括:(1) 建立一個(gè)內(nèi)存分區(qū):OSMemCreat

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

27、U 寄存器讀出和存儲(chǔ)到堆棧或內(nèi)存中的指令。四論述題1. 論述 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ù)駐留在程序空間之中,還沒(méi)有交給C/OS-管理。一個(gè)任務(wù)可以通過(guò)調(diào)用OSTaskDel() 返回到睡眠態(tài),或通過(guò)調(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-是通過(guò)調(diào)用下述兩個(gè)函數(shù)之一:OSTaskCreate()或 OSTaskCreateExt()。(3) 運(yùn)行態(tài) (RU

28、N): 調(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ù)可以通過(guò)調(diào)用兩個(gè)函數(shù)之一將自身延遲一段時(shí)間,這兩個(gè)函數(shù)是OSTimeDly() 或OSTimeDlyHMSM()。這個(gè)任務(wù)于是進(jìn)入等待狀態(tài),等待這段時(shí)間過(guò)去,下一個(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)

29、(ISR):正在運(yùn)行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)了,或者C/OS-將中斷關(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-用它來(lái)保存該任務(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)定義如下:typedef struct os_tcb

30、 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_MAX_QS >= 2) | OS_MBOX_EN | OS_SEM_ENOS_EVENT *OSTCBEventPtr;#endif#if (OS_

31、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 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是指向事件控制塊的指針。OST

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論