uCOS-2內(nèi)核架構(gòu)的詳細解析_第1頁
uCOS-2內(nèi)核架構(gòu)的詳細解析_第2頁
uCOS-2內(nèi)核架構(gòu)的詳細解析_第3頁
uCOS-2內(nèi)核架構(gòu)的詳細解析_第4頁
uCOS-2內(nèi)核架構(gòu)的詳細解析_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目錄TOC\o"1-4"\h\z\u嵌入式RTOS 31. 嵌入式系統(tǒng)基本模型 32. RTOS設計原則 33. GPOS與RTOS 34. 嵌入式開發(fā)模式 35. (不)可重入 46. 互斥條件 47. 臨界狀態(tài) 4uC/OS-II基本介紹 51. uC/OS-II文件結(jié)構(gòu) 52. uC/OS-II組成部分 53. uC/OS-II任務狀態(tài) 6uC/OS-II系統(tǒng)核心 61. uC/OS-II任務調(diào)度 6(1) uC/OS-II調(diào)度算法 6(2) 任務就緒表 6(3) 任務級任務調(diào)度 7(4) 中斷級任務調(diào)度 7(5) 調(diào)度器上鎖與解鎖 8(6) 中斷管理函數(shù) 9(7) 中斷相關問題 92. uC/OS-II系統(tǒng)啟動 10(1) 初始化函數(shù)OSInit() 10(2) 啟動函數(shù)OSStart() 11(3) 統(tǒng)計任務OSTaskStat 113. uC/OS-II系統(tǒng)時鐘 114. uC/OS-II事件管理 12(1) 事件控制塊 12(2) ECB管理機制 12(3) ECB管理函數(shù) 12uC/OS-II任務管理 131. C可執(zhí)行代碼結(jié)構(gòu) 132. 任務結(jié)構(gòu) 133. 任務棧 144. 任務控制塊 14(1) TCB描述 14(2) TCB主要成員 14(3) TCB全局變量 145. 任務狀態(tài)切換 146. 任務管理函數(shù) 15uC/OS-II通信與同步 151. 消息郵箱Mbox 152. 消息隊列msgQ 16(1) msgQ基本內(nèi)容 16(2) msgQ全局變量 16(3) msgQ管理函數(shù) 17(4) msgQ幾個問題 173. 信號量Sem 174. 互斥鎖Mutex 18(1) Mutex基本原理 18(2) 提升/恢復優(yōu)先級 18(3) Mutex管理函數(shù) 195. 事件組標志Flag 19(1) Flag基本原理 19(2) Flag數(shù)據(jù)結(jié)構(gòu) 20(3) Flag管理函數(shù) 216. Task就緒狀態(tài)判斷??? 22uC/OS-II內(nèi)存管理 221. memPart基本原理 222. memPart管理函數(shù) 233. memPart幾個問題 23uC/OS-II應用開發(fā) 231. 開發(fā)步驟 232.編寫任務函數(shù) 243.堆棧設計擴展 244.一些借鑒經(jīng)驗 25嵌入式RTOS嵌入式系統(tǒng)基本模型RTOS設計原則采用各種算法和策略,始終保持系統(tǒng)行為的可預測性。即在任何情況下,在系統(tǒng)運行的任何時刻,OS的資源配置策略都能為爭奪資源(包括CPU、內(nèi)存、網(wǎng)絡帶寬等)的多個實時任務合理地分配資源,使每個實時任務的實時性要求都能得到滿足。GPOS與RTOSGPOS:注重每次執(zhí)行的平均響應時間,而不是某次特定執(zhí)行的響應時間。RTOS:除滿足應用功能需求外,還要滿足實時性要求,始終保證系統(tǒng)行為的可預測性(predictability)。與GPOS不同,RTOS注重的不是系統(tǒng)的平均表現(xiàn),而是要滿足每個實時任務在最壞情況下的實時性要求。也就是說,RTOS注重的是個體表現(xiàn),更準確地說是個體最壞情況表現(xiàn)。RTOS與GPOS的差別主要表現(xiàn)在:任務調(diào)度策略不同;內(nèi)存管理方式不同;中斷處理方式不同;系統(tǒng)管理方式不同;嵌入式開發(fā)模式單片機系統(tǒng)的前后臺程序:不使用OS,將應用程序設計成死循環(huán),系統(tǒng)輪流處理各事件,對時間響應要求高的異步事件采用中斷進行處理?;谌蝿眨ㄟM程)的軟件設計方法:使用OS,由OS管理硬件資源,任務只是在需要資源時申請即可,至于when/which,完全由OS決定。(不)可重入(1)可重入函數(shù):指函數(shù)代碼在運行過程中可以被中斷,中斷返回后仍能夠恢復到原來的狀態(tài),并能準確無誤執(zhí)行的函數(shù)??芍厝牒瘮?shù)可以被一個以上的任務調(diào)用,而不必擔心數(shù)據(jù)被破壞??芍厝牒瘮?shù)或者只使用局部變量,即變量保存在CPU寄存器或堆棧中;或者使用全局變量,則要對全局變量予以保護。(2)不可重入函數(shù):函數(shù)在運行過程中不可以被中斷。互斥條件實現(xiàn)任務間通信最簡便的辦法是使用共享數(shù)據(jù),但要保證任務在處理共享數(shù)據(jù)時的排它性。使共享資源滿足互斥條件,最一般的方法有:關中斷使用某種實時內(nèi)核,一般情況下關中斷的時間最長不超過內(nèi)核本身的關中斷時間,這樣就不會影響系統(tǒng)中斷延遲。使用測試并置位指令Test&Set操作可能是微處理器一條不會被中斷的指令,否則應該在程序中關中斷做TAS操作再開中斷。禁止做任務切換此時任務切換雖然是禁止的,但仍允許中斷。如果這時中斷來了,ISR會在這一臨界區(qū)內(nèi)立即執(zhí)行。利用信號量;臨界狀態(tài)臨界狀態(tài)指當前程序處于不可中斷狀態(tài)。一般情況下,在調(diào)用不可重入函數(shù)前或在修改全局變量數(shù)據(jù)時,都需要先進入臨界狀態(tài)。進入臨界狀態(tài)的主要操作是關閉所有可以屏蔽的中斷;而退出臨界狀態(tài)的主要操作是恢復到上次進入臨界狀態(tài)時前中斷管理的狀態(tài)。在uC/OS-II中,宏OS_ENTER_CRITICAL()描述進入臨界狀態(tài)所完成的操作,宏OS_EXIT_CRITICAL()描述退出臨界狀態(tài)的操作。uC/OS-II提供了3種進入和退出臨界狀態(tài)的辦法,可以根據(jù)CPU類型由宏OS_CRITICAL_MOTHOD指定具體的臨界狀態(tài)處理辦法。uC/OS-II基本介紹uC/OS-II文件結(jié)構(gòu)uC/OS-II組成部分uC/OS-II大致可以分成系統(tǒng)核心(包含任務調(diào)度)、任務管理、時間管理、多任務同步與通信、內(nèi)存管理、CPU移植等部分。核心部分(OSCore.c):uC/OS-II處理核心,包括初始化、啟動、中斷管理、時鐘中斷、任務調(diào)度及事件處理等用于系統(tǒng)基本維持的函數(shù)。任務管理(OSTask.c):包含與任務操作密切相關的函數(shù),包括任務建立、刪除、掛起及恢復等,uC/OSII以任務為基本單位進行調(diào)度。時鐘部分(OSTime.c):uC/OS-II中最小時鐘單位是timetick(時鐘節(jié)拍),其中包含時間延遲、時鐘設置及時鐘恢復等與時鐘相關的函數(shù)。多任務同步與通信(OSMbox.c,OSQ.c,OSSem.c,OSMutex.c,OSFlag.c):包含事件管理函數(shù),涉及Mbox、msgQ、Sem、Mutex、Flag等。內(nèi)存管理部分(OSMem.c):主要用于構(gòu)建私有的內(nèi)存分區(qū)管理機制,其中包含創(chuàng)建memPart、申請/釋放memPart、獲取分區(qū)信息等函數(shù)。CPU接口部分:uC/OS-II針對特定CPU的移植部分,由于牽涉到SP等系統(tǒng)指針,通常用匯編語言編寫,包括任務切換、中斷處理等內(nèi)容。uC/OS-II任務狀態(tài)在uC/OS-II中,一個任務就是一個線程,該任務可以認為CPU完全屬于它自己。任務有自己的堆棧和CPU寄存器,并且被賦予一定的優(yōu)先級。任務可能處于睡眠、就緒、運行、等待或中斷服務狀態(tài)之一。uC/OS-II系統(tǒng)核心主要包含在C源文件OS_CORE.C中。uC/OS-II任務調(diào)度uC/OS-II調(diào)度算法uC/OS-II采用基于優(yōu)先級的調(diào)度算法,總是選擇當前處于就緒狀態(tài)的優(yōu)先級最高的任務進行調(diào)度。uC/OS-II是可搶占性的強實時性OS,在完成中斷后允許進行新的任務調(diào)度。uC/OS-II有兩種調(diào)度方式:任務級任務調(diào)度、中斷級任務調(diào)度。任務就緒表INT8UconstOSUnMapTbl[256]={…};OS_EXTINT8UOSRdyGrp;OS_EXTINT8UOSRdyTbl[OS_RDY_TBL_SIZE];添加就緒任務至就緒表;從就緒表刪除就緒任務;查找最高優(yōu)先級就緒任務OS_SchedNew();任務級任務調(diào)度指在非中斷返回時進行任務調(diào)度,一般發(fā)生在當前任務因時間延遲或等待某事件而阻塞或被掛起,或有更高優(yōu)先級的任務處于就緒狀態(tài)。任務的基本信息:CPU的PC寄存器:任務當前執(zhí)行的位置;CPU的通用寄存器:任務當前執(zhí)行涉及的臨時數(shù)據(jù);CPU的狀態(tài)寄存器:存儲當前CPU的狀態(tài)。任務級任務切換:從一個任務直接切換至另一個任務,不涉及CPU狀態(tài)的切換,OS_TASK_SW()既保存當前任務上下文,又恢復新任務上下文。過程:OS_Sched()->OS_SchedNew()->OS_TASK_SW()中斷級任務調(diào)度中斷級任務切換:在中斷處理完成后,通過OSIntExit()判斷是否有更高優(yōu)先級就緒任務。如果有,調(diào)用OSIntCtxSW()恢復新任務上下文。注意:在中斷處理中,已經(jīng)保存了被中斷任務的上下文,所以這里僅僅恢復。過程:OSIntExt()–>OSIntEnter()->ISR–>OSIntExit()->OSIntCtxSW()調(diào)度器上鎖與解鎖uC/OS-II提供調(diào)度器鎖定功能,在鎖定期間不能進行任務調(diào)度。uC/OS-II使用全局變量OSLockNesting標識是否鎖定了任務調(diào)度器。OS_EXTINT8UOSLockNesting;voidOSSchedLock(void);voidOSSchedUnlock(void);中斷管理函數(shù)在中斷處理中,不允許進行任務管理、事件管理及任務調(diào)度等操作。uC/OS-II通過全局變量OSIntNesting標識當前是否處于中斷狀態(tài)。在所有任務及事件管理的程序中,都有對OSIntNesting進行判斷的語句。voidOSIntEnter(void);voidOSIntExit(void);中斷相關問題OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()關中斷使得uC/OS-II能夠同時避免有其他任務或中斷服務進入臨界代碼段。調(diào)用uC/OS-II功能函數(shù)時,中斷總應當是開著的。uC/OS-II如何禁止調(diào)度?在中斷中允許調(diào)度嗎?為什么?uC/OS-II如何屏蔽中斷?uC/OS-II系統(tǒng)啟動uC/OS-II首先調(diào)用OSInit()進行初始化,然后創(chuàng)建任務(此時還未啟動系統(tǒng),僅僅為其分配資源),然后調(diào)用OSStart()啟動系統(tǒng),將CPU控制權交給uC/OS-II,OS根據(jù)任務優(yōu)先級選擇由哪個任務開始執(zhí)行,或創(chuàng)建新的任務。初始化函數(shù)OSInit()OSInit()主要完成初始化操作,包括初始化全局變量(在OS_InitMisc()中)、任務就緒表、TCB、ECB、FCB、內(nèi)存單元、消息隊列,并創(chuàng)建空閑任務。如果有必要,創(chuàng)建統(tǒng)計任務。OS_InitMisc(); //初始化部分全局變量OS_InitRdyList(); //初始化任務就緒表OS_InitTCBList(); //初始化空閑TCB鏈表OS_InitEventList(); //初始化ECB鏈表OS_FlagInit(); //初始化事件組標志結(jié)構(gòu)OS_MemInit(); //初始化內(nèi)存管理OS_QInit(); //初始化消息隊列OS_InitTaskIdle(); //創(chuàng)建空閑任務OS_InitTaskStat(); //創(chuàng)建統(tǒng)計任務uC/OS-II初始化了5個空的數(shù)據(jù)結(jié)構(gòu)緩沖區(qū),每個緩沖區(qū)都是單向鏈表,允許uC/OS-II從緩沖區(qū)中迅速取得或釋放一個緩沖區(qū)中的元素。啟動函數(shù)OSStart()OSStart()在一切準備就緒且需要首先創(chuàng)建的任務都被創(chuàng)建后,啟動uC/OS-II。它從就緒表中查找最高優(yōu)先級就緒任務,并恢復其上下文開始執(zhí)行。過程:OSStart()->OS_SchedNew()->OSStartHighRdy()問題:任務第一次被調(diào)用時,哪來的上下文供其恢復呢?創(chuàng)建任務時,調(diào)用了OSTaskStkInit()初始化任務堆棧,可此函數(shù)中沒有涉及任務的上下文呀?統(tǒng)計任務OSTaskStatOSTaskStat用于計算CPU利用率。設置OS_CFG.H中的OS_TASK_STAT_EN為1,創(chuàng)建統(tǒng)計任務,在系統(tǒng)啟動后一直處于就緒狀態(tài)。剛開始時,空閑任務運行1S,為計算CPU利用率提供一個基準值,并保存在統(tǒng)計任務的堆棧中,這個值不會改變除非重新啟動CPU。此后空閑任每次被其它任務搶去CPU時,它里面的計數(shù)器就會直接記錄下CPU空閑的時間。uC/OS-II系統(tǒng)時鐘任何實時系統(tǒng)的時鐘硬件設備每隔一段時間(一個系統(tǒng)tick)產(chǎn)生一個硬件中斷,OS接收到該中斷后,更新時間計數(shù)器,更新所有對時鐘依賴的程序代碼,從而維持系統(tǒng)有序穩(wěn)定的運行。主要包含在C源文件OS_TIME.C中。#defineOS_TICKS_PER_SEC100 //系統(tǒng)時鐘中斷間隔OS_EXTvolatileINT32UOSTime; //系統(tǒng)運行的時間值voidOSTimeTick(void); //時鐘中斷服務程序voidOSTimeDly(INT16Uticks); //延遲指定時鐘節(jié)拍INT8UOSTimeDlyHMSM(…); //延遲指定時間長度INT8UOSTimeDlyResume(prio); //恢復等待(時延/阻塞)任務INT32UOSTimeGet(void); //讀取當前時間voidOSTimeSet(INT32Uticks); //設置當前時間uC/OS-II事件管理事件控制塊INT8UOSEventType; //事件類型void*OSEventPtr; //指向MBox或QueueINT16UOSEventCnt; //信號量計數(shù)器(注:Mutex)INT8UOSEventGrp; //事件等待組標志INT8UOSEventTbl[]; //時間任務等待表INT8UOSEventName[]; //時間名稱ECB管理機制OS_EXTOS_EVENT*OSEventFreeList; //空閑ECB鏈表指針OS_EXTOS_EVENTOSEventTbl[]; //ECB結(jié)構(gòu)體數(shù)組ECB管理函數(shù)OS_InitEventList():初始化ECB;OS_EventWaitListInit():在創(chuàng)建事件時調(diào)用,初始化ECB任務等待表;OS_EventTaskRdy():在事件發(fā)生時調(diào)用,修改此事件中最高優(yōu)先級任務的TCB成員變量,在任務就緒表中添加此任務,將相應信息傳遞給該任務TCB,并將此任務從事件的任務等代表中刪除;OS_EventTaskWait():在申請資源失敗而暫停當前任務時被調(diào)用,將任務從任務就緒表中刪除,并添加到事件的任務等代表中;OS_EventTO():在事件等待超時時調(diào)用,將此任務從事件的任務等代表中刪除,并修改該任務的TCB成員變量;uC/OS-II任務管理C可執(zhí)行代碼結(jié)構(gòu)代碼段.text:存放CPU執(zhí)行的機器指令,通常.text是可共享且只讀的。數(shù)據(jù)段.data:.rodata(常量數(shù)據(jù))、.rwdata(已初始化全局變量、靜態(tài)變量)。未初始化數(shù)據(jù)段.bss:未初始化的全局變量、靜態(tài)變量。棧.stack:存放函數(shù)參數(shù)、局部變量及任務切換時的上下文。堆.heap:用于動態(tài)內(nèi)存分配。任務結(jié)構(gòu)在uC/OS-II中,任務是事件運行和管理的基本單元。一個uC/OS-II任務至少包含程序代碼、棧和TCB,還可選擇性使用相當于堆的動態(tài)內(nèi)存空間。程序運行時,uC/OS-II中的任務相當于可執(zhí)行代碼(可單獨運行的單元)。uC/OS-II任務的各部分如何管理???任務棧任務棧數(shù)據(jù)類型:typedefunsignedshortOS_STK任務棧增長方向:#defineOS_STK_GROWTH0/1任務棧基本功能:???任務控制塊TCB描述主要用來存儲任務的當前屬性。(問:任務第一次被調(diào)度時,該如何運行?)TCB主要成員任務??臻g位置:OSTCBStkPtr、OSTCBStkBottom、OSTCBStkSize;任務通信與同步:OSTCBEventPtr、OSTCBMsg;任務事件組標志:OSTCBFlagNode、OSTCBFlagsRdy;任務等待/阻塞:OSTCBDly、OSTCBPendTO;任務當前狀態(tài):OSTCBStat;任務優(yōu)先級:OSTCBPrio;TCB全局變量OS_EXTOS_TCBOSTCBTbl[OS_MAX_TASKS+OS_N_SYS_TASKS];OS_EXTOS_TCBOSTCBPrioTbl[OS_LOWEST_PRIO+1];OS_EXTOS_TCB*OSTCBFreeList;OS_EXTOS_TCB*OSTCBList;OS_EXTOS_TCB*OSTCBHighRdy;OS_EXTOS_TCB*OSTCBCur;任務狀態(tài)切換任務管理函數(shù)OS_TASK.C:11個函數(shù)OSTaskCreate();OSTaskCreateExt();OSTaskDel();OSTaskDelReq();OSTaskChangePrio();OSTaskSuspend();OSTaskResume();OSTaskNameGet();OSTaskNameSet();OSTaskStkChk();OS_TaskStkClr();OSTaskQuery();uC/OS-II通信與同步消息郵箱MboxMbox用于多任務間單一消息的傳遞,uC/OS-II使用ECB管理Mbox的基本信息,OSEventPtr指向創(chuàng)建Mbox時指定的內(nèi)存空間。事件的創(chuàng)建由具體的事件管理程序?qū)崿F(xiàn)。主要包含在C源文件OS_MBOX.C中。OS_EVENT*OSMboxCreate(void*msg);void*OSMboxPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err);void*OSMboxAccept(OS_EVENT*pevent);INT8UOSMboxPost(OS_EVENT*pevent,void*msg);INT8UOSMboxPostOpt(OS_EVENT*pevent,void*msg,INT8Uopt);OS_EVENT*OSMboxDel(OS_EVENT*pevent,INT8Uopt,INT8U*err);INT8UOSMboxQuery(OS_EVENT*pevent,OS_MBOX_DATA*);消息隊列msgQmsgQ基本內(nèi)容msgQ是uC/OS-II任務間通信的機制,可實現(xiàn)多條消息傳遞,即可以同時存儲多條消息。uC/OS-II使用循環(huán)隊列管理機制。主要包含在C源文件OS_Q.C中。msgQ管理:使用指針數(shù)組存儲所有消息的位置;使用QCB標識指針數(shù)組中消息的基本信息;使用ECB管理整個msgQ。QCB在編譯時分配空間,即當前系統(tǒng)中可用的msgQ個數(shù)是預先設置的,系統(tǒng)運行時不能修改。msgQ全局變量OS_EXTOS_Q*OSQTbl[OS_MAX_QS]; //QCB結(jié)構(gòu)體數(shù)組OS_EXTOS_Q*OSQFreeList; //空閑QCB頭指針typedefstructos_q{ //消息隊列控制塊structos_q*OSQPtr; //用于構(gòu)建空閑QCB鏈表void**OSQStart; //指向msgQ指針數(shù)組的起始位置void**OSQEnd; //指向msgQ指針數(shù)組的結(jié)束位置void**OSQIn; //指向msgQ指針數(shù)組下一個可以插入消息的位置void**OSQOut; //指向msgQ指針數(shù)組下一個可以讀出消息的位置INT16UOSQSize; //msgQ指針數(shù)組的大小INT16UOSQEntries; //msgQ指針數(shù)組當前可以讀取的消息個數(shù) }OS_Q;msgQ管理函數(shù)OS_EVENT*OSQCreate(void**start,INT16Usize);INT8UOSQPost(OS_EVENT*pevent,void*msg); //發(fā)送消息到隊尾INT8UOSQPostFront(OS_EVENT*pevent,void*msg); //msg至隊首INT8UOSQPostOpt(OS_EVENT*pevent,void*msg,INT8Uopt);void*OSQPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err);void*OSQAccept(OS_EVENT*pevent,INT8U*err);OS_EVENT*OSQDel(OS_EVENT*pevent,INT8Uopt,INT8U*err);INT8UOSQQuery(OS_EVENT*pevent,OS_Q_DATA*);INT8UOSQFlush(OS_EVENT*pevent);msgQ幾個問題uC/OS-II中,什么是事件?事件是uC/OS-II管理任務間同步與通信的機制。事件是處理事件的對象感興趣的,能夠感知或捕獲到一種事件狀態(tài)的改變。信號量SemSem主要用來實現(xiàn)任務間同步及標識某類資源的可用個數(shù),即某個特定資源可供多少任務同時使用。主要包含在C源文件OS_SEM.C中。OS_EVENT*OSSemCreate(INT16Ucnt);voidOSSemPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err);INT16UOSSemAccept(OS_EVENT*pevent);INT8UOSSemPost(OS_EVENT*pevent);OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8Uopt,INT8U*err);INT8UOSSemQuery(OS_EVENT*pevent,OS_SEM_DATA*);voidOSSemSet(OS_EVENT*pevent,INT16Ucnt,INT8U*err);互斥鎖MutexMutex基本原理Mutex用來實現(xiàn)對資源的排他性訪問,可能引起優(yōu)先級反轉(zhuǎn)。任何任務在占有某個互斥鎖事件時,都不能阻塞等待其它任何事件,否則會造成死鎖。主要包含在C源文件OS_MUTEX.C中。優(yōu)先級反轉(zhuǎn)是指,低優(yōu)先級任務占有高優(yōu)先級任務運行所需的資源,而使高優(yōu)先級不得不等低優(yōu)先級任務把資源釋放才能執(zhí)行。uC/OS-II使用ECB管理Mutex,其成員變量OSEventCnt:高8位存儲Mutex被使用時提供給任務的prio;低8位在沒有任務占有Mutex時為0xFF,否則為占有任務的prio。提升/恢復優(yōu)先級提升Mutex擁有者任務的優(yōu)先級的相關操作:如果該任務原來處于就緒狀態(tài),則從就緒表中將其刪除;如果該任務正在等待某個事件,則從該事件的任務等待表中將其刪除;修改擁有Mutex的TCB,將其OSTCBPrio修改為欲提升的優(yōu)先級;如果該任務處于就緒狀態(tài),則將提升的優(yōu)先級加載到任務就緒表中;如果該任務未就緒且正在等待某個事件,則將提升的優(yōu)先級添加到該事件的任務等待表中,并修改TCB中OSTCBEventPtr;修改TCB中與優(yōu)先級相關的成員變量?;謴蚆utex擁有任務的優(yōu)先級的相關操作:從任務就緒表中刪除提升過的優(yōu)先級值,修改當前TCB中與優(yōu)先級相關的所有成員變量;再次保留提升的優(yōu)先級值控制塊入口,避免將其分配給其它任務。Mutex管理函數(shù)#defineOS_MUTEX_KEEP_LOWER_80x00FF#defineOS_MUTEX_KEEP_UPPER_80xFF00#defineOS_MUTEX_AVAILABLE0x00FFOS_EVENT*OSMutexCreate(INT8Uprio,INT8U*err);voidOSMutexPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err);INT8UOSMutexAccept(OS_EVENT*pevent,INT8U*err);INT8UOSMutexPost(OS_EVENT*pevent);OS_EVENT*OSMutexDel(OS_EVENT*,INT8Uopt,INT8U*err);INT8UOSMutexQuery(OS_EVENT*,OS_MUTEX_DATA*);事件組標志FlagFlag基本原理uC/OS-II提供事件組標志實現(xiàn)多事件管理。Flag只是使用0/1來表示某個事件是否發(fā)生過,而不能直接被用來傳遞數(shù)據(jù)和消息??梢赃x擇性地設置一個Flag最多可以管理的任務同步狀態(tài)。主要包含在C源文件OS_FLAG.C中。Flag數(shù)據(jù)結(jié)構(gòu)#defineOS_FLAGS_NBITS8/16/32 //定義OS_FLAGS的位數(shù)FCB結(jié)構(gòu)體:typedefstructos_flag_grp{ INT8UOSFlagType; //事件類型 void*OSFlagWaitList; //指向等待的任務鏈表 OS_FLAGSOSFlagFlags; //信號列表 INT8UOSFlagName[OS_FLAG_NAME_SIZE];}OS_FLAG_GRP;事件標志等待鏈表結(jié)點typedefstructos_flag_node{ void*OSFlagNodeNext; void*OSFlagNodePrev; void*OSFlagNodeTCB; void*OSFlagNodeFlagGrp; //指向此任務所等待的事件組標志 OS_FLAGSOSFlagNodeFlags; //等待的事件 INT8UOSFlagNodeWaitType; //等待方式}OS_FLAG_NODE;OS_EXTOS_FLAG_GRPOSFlagTbl[OS_MAX_FLAGS];OS_EXTOS_FLAG_GRP*OSFlagFreeList;Flag管理函數(shù)OS_FLAG_GRP*OSFlagCreate(OS_FLAGSflags,INT8U*err);OS_FLAGSOSFlagPend(OS_FLAG_GRP*pgrp,OS_FLAGSflags,INT8Uwait_type,INT16Utimeout,INT8U*err);StaticvoidOS_FlagBlock(OS_FLAG_GRP*pgrp,OS_FLAG_NODE*pnode,OS_FLAGSflags,INT8Uwait_type, //掛起任務,INT16Utimeout); //直到等待的事件或超時類似于:OS_EventTaskWait();voidOS_FlagUnlink(OS_FLAG_NODE*pnode); //等待超時刪除結(jié)點類似于:OS_EventTO();OS_FLAGSOSFlagAccept(OS_FLAG_GRP*pgrp,OS_FLAGSflags,INT8Uwait_type,INT8U*err);OS_FLAGSOSFlagPost(OS_FLAG_GRP*pgrp,OS_FLAGSflags,INT8Uopt,INT8U*err);staticBOOLEANOS_FLAGTaskRdy(OS_FLAG_NODE*pnode,OS_FLAGSflags_rdy);OS_FLAG_GRP*OSFlagDel(OS_FLAG_GRP*,INT8Uopt,INT8U*err);OS_FLAGSOSFlagPendGetFlagsRdy(void); //獲取任務就緒標志OS_FLAGSOSFlagQuery(OS_FLAG_GRP*,INT8U*err);INT8UOSFlagNameGet(OS_FLAG_GRP*,INT8U*pname,INT8U*err);voidOSFlagNameSet(OS_FLAG_GRP*,INT8U*pname,INT8U*err);Task就緒狀態(tài)判斷???OSRdyTbl[ptcb->OSTCBY]&ptcb->OSTCBBitX!=0如:函數(shù)OSMutexPend()(ptcb->OS

溫馨提示

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

評論

0/150

提交評論