uCOS-II內(nèi)核架構(gòu)解析_第1頁(yè)
uCOS-II內(nèi)核架構(gòu)解析_第2頁(yè)
uCOS-II內(nèi)核架構(gòu)解析_第3頁(yè)
uCOS-II內(nèi)核架構(gòu)解析_第4頁(yè)
uCOS-II內(nèi)核架構(gòu)解析_第5頁(yè)
已閱讀5頁(yè),還剩23頁(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、目錄嵌入式.5.6.RTOS嵌入式系統(tǒng)基本模型RTOS設(shè)計(jì)原則.GPOS與 RTOS . 嵌入式開(kāi)發(fā)模式(不)可重入互斥條件..4.4.uC/OS-II基本介紹1. uC/OS-II文件結(jié)構(gòu)2. uC/OS-II組成部分3. uC/OS-II任務(wù)狀態(tài)uC/OS-II系統(tǒng)核心1. uC/OS-II任務(wù)調(diào)度uC/OS-II調(diào)度算法. 任務(wù)就緒表任務(wù)級(jí)任務(wù)調(diào)度中斷級(jí)任務(wù)調(diào)度. 調(diào)度器上鎖與解鎖. 中斷管理函數(shù)中斷相關(guān)問(wèn)題2. uC/OS-II系統(tǒng)啟動(dòng)初始化函數(shù)OSInit().,(2) 啟動(dòng)函數(shù) OSStartO.,(3) 統(tǒng)計(jì)任務(wù) OSTaskStat3. uC/OS

2、-II系統(tǒng)時(shí)鐘4. uC/OS-II事件管理(1) 事件控制塊(2) ECB管理機(jī)制(3) ECB管理函數(shù)uC/OS-ll任務(wù)管理 1. C可執(zhí)行代碼結(jié)構(gòu)4222233 333. 任務(wù)棧4. 任務(wù)控制塊.(1) TCB描述141414(2) TCB主要成員(3) TCB全局變量5. 任務(wù)狀態(tài)切換6. 任務(wù)管理函數(shù)14141515uC/OS-II通信與同步1. 消息郵箱Mbox2. 消息隊(duì)列msgQmsgQ基本內(nèi)容 msgQ全局變量 msgQ管理函數(shù) msgQ幾個(gè)問(wèn)題(1)(2)(3)(4)3. 信號(hào)量Sem4. 互斥鎖Mutex(1) Mutex基本原理(2) 提升/恢復(fù)優(yōu)先級(jí)(3) Mute

3、x管理函數(shù)5. 事件組標(biāo)志Flag .(1) Flag基本原理(2) Flag數(shù)據(jù)結(jié)構(gòu) Flag管理函數(shù)6. Task就緒狀態(tài)判斷?16161.616171718181.919.19192020202122uC/OS-ll內(nèi)存管理1. memPart基本原理2. memPart管理函數(shù)3. memPart幾個(gè)問(wèn)題23232324uC/OS-II 應(yīng)用開(kāi)發(fā).1. 開(kāi)發(fā)步驟.2. 編寫(xiě)任務(wù)函數(shù)3. 堆棧設(shè)計(jì)擴(kuò)展.4. 一些借鑒經(jīng)驗(yàn).242424.2525uC/OS-II內(nèi)核移植1. uC/OS-II正常運(yùn)行的條件2. 運(yùn)行態(tài)代碼分布3. 移植的幾個(gè)問(wèn)題錯(cuò)誤!未定義書(shū)簽。 錯(cuò)誤!未定義書(shū)簽。 錯(cuò)誤!

4、未定義書(shū)簽。 錯(cuò)誤!未定義書(shū)簽。嵌入式RTOS1. 嵌入式系統(tǒng)基本模型FN Zt1 谿 N l;VFiWn 話節(jié)汽N 技.I亦時(shí)世fi待;統(tǒng)內(nèi)擺瓶冷;fRTC引2. RTOS設(shè)計(jì)原則采用各種算法和策略,始終保持系統(tǒng)行為的可預(yù)測(cè)性。即在任何情況下,在 系統(tǒng)運(yùn)行的任何時(shí)刻,OS的資源配置策略都能為爭(zhēng)奪資源(包括 CPU、內(nèi)存、網(wǎng)絡(luò)帶寬等)的多個(gè)實(shí)時(shí)任務(wù)合理地分配資源,使每個(gè)實(shí)時(shí)任務(wù)的實(shí)時(shí)性要求都 能得到滿足。3. GPOS 與 RTOS? GPOS:注重每次執(zhí)行的平均響應(yīng)時(shí)間,而不是某次特定執(zhí)行的響應(yīng)時(shí)間。RTOS:除滿足應(yīng)用功能需求外,還要滿足實(shí)時(shí)性要求,始終保證系統(tǒng)行為的可預(yù)測(cè)性(Predic

5、tability )。與GPOS不同,RTOS注重的不是系統(tǒng)的平均表現(xiàn),而是要滿足每個(gè)實(shí)時(shí)任 務(wù)在最壞情況下的實(shí)時(shí)性要求。也就是說(shuō), RTOS注重的是個(gè)體表現(xiàn),更準(zhǔn)確地說(shuō)是個(gè)體最壞情況表現(xiàn)。RTOS與GPOS的差別主要表現(xiàn)在:a)任務(wù)調(diào)度策略不同;b)內(nèi)存管理方式不同;c)中斷處理方式不同;d)系統(tǒng)管理方式不同;4. 嵌入式開(kāi)發(fā)模式? 單片機(jī)系統(tǒng)的前后臺(tái)程序:不使用OS,將應(yīng)用程序設(shè)計(jì)成死循環(huán),系統(tǒng) 輪流處理各事件,對(duì)時(shí)間響應(yīng)要求高的異步事件采用中斷進(jìn)行處理。基于任務(wù)(進(jìn)程)的軟件設(shè)計(jì)方法:使用OS,由OS管理硬件資源,任務(wù) 只是在需要資源時(shí)申請(qǐng)即可,至于 when/which,完全由OS決定

6、。5. (不)可重入(1) 可重入函數(shù):指函數(shù)代碼在運(yùn)行過(guò)程中可以被中斷,中斷返回后仍能夠恢復(fù)到原來(lái)的狀態(tài),并能準(zhǔn)確無(wú)誤執(zhí)行的函數(shù)。而不必?fù)?dān)心數(shù)據(jù)被破壞??芍厝牒芍厝牒瘮?shù)可以被一個(gè)以上的任務(wù)調(diào)用, 數(shù)或者只使用局部變量,即變量保存在 CPU寄存器或堆棧中;或者使用全局變 量,則要對(duì)全局變量予以保護(hù)。(2) 不可重入函數(shù):函數(shù)在運(yùn)行過(guò)程中不可以被中斷。6. 互斥條件實(shí)現(xiàn)任務(wù)間通信最簡(jiǎn)便的辦法是使用共享數(shù)據(jù), 但要保證任務(wù)在處理共享數(shù) 據(jù)時(shí)的排它性。使共享資源滿足 互斥條件,最一般的方法有:(1) 關(guān)中斷使用某種實(shí)時(shí)內(nèi)核,一般情況下關(guān)中斷的時(shí)間最長(zhǎng)不超過(guò)內(nèi)核本身的關(guān)中斷時(shí)間,這樣就不會(huì)影響系統(tǒng)中

7、斷延遲。(2)使用測(cè)試并置位指令Test&Set操作可能是微處理器一條不會(huì)被中斷的指令,否則應(yīng)該在程序 中關(guān)中斷做TAS操作再開(kāi)中斷。(3) 禁止做任務(wù)切換此時(shí)任務(wù)切換雖然是禁止的,但仍允許中斷。如果這時(shí)中斷來(lái)了,ISR會(huì)在這一臨界區(qū)內(nèi)立即執(zhí)行。(4)利用信號(hào)量;7. 臨界狀態(tài)臨界狀態(tài)指當(dāng)前程序處于不可中斷狀態(tài)。一般情況下,在調(diào)用不可重入函數(shù) 前或在修改全局變量數(shù)據(jù)時(shí),都需要先進(jìn)入臨界狀態(tài)。進(jìn)入臨界狀態(tài)的主要操作是關(guān)閉所有可以屏蔽的中斷;而退出臨界狀態(tài)的主要操作是恢復(fù)到上次進(jìn)入臨界狀態(tài)時(shí)前中斷管理的狀態(tài)。在uC/OS-ll中,宏OS_ENTER_CRITICAL()描述進(jìn)入臨界狀態(tài)所完成的操

8、作,宏OS_EXIT_CRITICAL()描述退出臨界狀態(tài)的操作。CPU類型由宏uC/OS-II提供了 3種進(jìn)入和退出臨界狀態(tài)的辦法,可以根據(jù)OS_CRITICAL_MOTHOD 指定具體的臨界狀態(tài)處理辦法。uC/OS-II基本介紹1. uC/OS-II文件結(jié)構(gòu)III 旨9tV甲曲亠5上=X.F鬧 EC04Cb u呂-JSi.EI Ot wid.*:I- 口三上r-U 玉jDI.lJUn TKWf nSTTKH.CI jCCi5_II_ L吟HLl丄H卜*” 乩 畑彈JI?l2J- wLl sI: vk幣:總t E I叩逅if * 71npt.tr 弓 口*g JOfljCW-HIKCLUDt

9、S.if2. uC/OS-IIvar 弓 M Jl5r. Mn i*rn J*;PU HL JU 皿 L-組成部分uC/OS-II大致可以分成系統(tǒng)核心(包含任務(wù)調(diào)度)、任務(wù)管理、時(shí)間管理、多任務(wù)同步與通信、內(nèi)存管理、CPU移植等部分。(1)核心部分(OSCore.c) : uC/OS-II處理核心,包括初始化、啟動(dòng)、中斷管理、時(shí)鐘中斷、任務(wù)調(diào)度及事件處理等用于系統(tǒng)基本維持的函數(shù)。(2) 任務(wù)管理(OSTask.c):包含與任務(wù)操作密切相關(guān)的函數(shù),包括任務(wù)建立、刪除、掛起及恢復(fù)等,uC/OS II以任務(wù)為基本單位進(jìn)行調(diào)度。時(shí)鐘部分(OSTime.c) : uC/OS-II中最小時(shí)鐘單位是time

10、tick (時(shí)鐘節(jié)拍),其中包含時(shí)間延遲、時(shí)鐘設(shè)置及時(shí)鐘恢復(fù)等與時(shí)鐘相關(guān)的函數(shù)。多任務(wù)同步與通信(OSMbox.c, OSQ.c, OSSem.c, OSMutex.c, OSFlag.c)包含事件管理函數(shù),涉及 Mbox、msgQ、Sem Mutex、Flag等。(5)內(nèi)存管理部分(OSMem.c):主要用于構(gòu)建私有的內(nèi)存分區(qū)管理機(jī)制,其中包含創(chuàng)建memPart、申請(qǐng)/釋放memPart、獲取分區(qū)信息等函數(shù)。CPU接口部分:uC/OS-ll針對(duì)特定CPU的移植部分,由于牽涉到 SP等系統(tǒng)指針,通常用匯編語(yǔ)言編寫(xiě),包括任務(wù)切換、中斷處理等內(nèi)容。3. uC/OS-II任務(wù)狀態(tài)在uC/OS-II中

11、,一個(gè)任務(wù)就是一個(gè)線程,該任務(wù)可以認(rèn)為CPU完全屬于它 自己。任務(wù)有自己的堆棧和 CPU寄存器,并且被賦予一定的優(yōu)先級(jí)。任務(wù)可能處于睡眠、就緒、運(yùn)行、等待或中斷服務(wù)狀態(tài)之一。(JOSMtXHdPoitO:OSMbcxPcatOptC) OSMolHpQsm OSQPWIOOSOP0*Frtrtt() OSOP OS_SchedNew() - OS_TASK_SW()(1)逹蘭前任務(wù)的PC佼苣、送冃孝存罷數(shù)班、gu旳妝態(tài)入我: 傷改OSPrioCur芝前任務(wù)優(yōu)完塗變重:的恒為空局 妥量OPrloHigriRd量高X先綜任勞憂先級(jí))的值,勺把靈査並 緒任夯藝完眾設(shè)直為新的蘭芋任券憂完裂: 悟改怎任

12、務(wù)TCE第1傘或員(指向棧項(xiàng)的mr*OSTCBStkPtr; 的嵋為半KSP哥與,WSR次逞衛(wèi):荻取董高優(yōu)去的任務(wù)掛釗疑中第P4咸員;向拳棧疫:拒 *OSTCBStkPlr)的爼刮即率存簽;5)俸咬CS丁GBCu的值為新就第怎高優(yōu)元曖仟?jiǎng)?wù)的任務(wù)控制衣也 U; 將新1三各旳PCfe巻.謹(jǐn)用尋存黑tr丸,CPU的;U態(tài)出役,開(kāi) 始執(zhí)行新的三熒,(4) 中斷級(jí)任務(wù)調(diào)度uC/OS-ll中斷響應(yīng)的過(guò)程(1)進(jìn)人比斷.現(xiàn)場(chǎng)保護(hù),保護(hù)芻前任等戰(zhàn)扶行位S、奪在 器臨時(shí)寂S以及CPU欣態(tài);芳I行系統(tǒng)進(jìn)入T斷處建函數(shù)OSIntEnt訓(xùn).然后撫行關(guān)于 此中廬的ISR,根?S不同的中斷扶行不同的代瑪:(3) 抉行OS

13、IntExitm如有更宴ft先級(jí)Sf:緒任務(wù),潯引岌新 的凋度,召則恢g現(xiàn)場(chǎng),返到原任務(wù)徒置至新運(yùn)行.篥2涉中斷脈詹理序是預(yù)5t設(shè)亀的,如皋中凌生,頁(yè)統(tǒng)會(huì) 垠考牛斷向#表射入口地址鈞定轉(zhuǎn)移到該地址開(kāi)始龍行.霆/;拿AJ- “ f/VS -If中的申體嚴(yán)務(wù)子程序(27W4J用盧中斷#干序,11# 亍W OW 爵#B.UHI asj-:tb,trf li OEInrtetf bn4 Kit jV L,jf i OSinc Maatifi -w 1 flSWKUg-agCgjtJtFLt si-痔中KflbS折開(kāi)中h執(zhí)和用戶咸疇犠舉*,理聊 ai.rctfixtKih 桂庚荘門(mén)皿囂林、 tn打申赫壇

14、筑券Tff 葉卜:*11II肯乂碼橋.AT;孑眩占比加檸并戒iD$L44HNrt1酥唧山+斷國(guó)應(yīng)IWttff * 和,目禹 saziuig* OSIntEnter() - ISR - OSIntExit() - OSIntCtxSW()(5) 調(diào)度器上鎖與解鎖uC/OS-IIuC/OS-II提供調(diào)度器鎖定功能,在鎖定期間不能進(jìn)行任務(wù)調(diào)度。使用全局變量OSLockNesting標(biāo)識(shí)是否鎖定了任務(wù)調(diào)度器。? OS_EXT INT8U OSLockNesti ng? void OSSchedLockvoid);? void OSSchedU niockvoid);(6) 中斷管理函數(shù)在中斷處理中,不

15、允許進(jìn)行任務(wù)管理、事件管理及任務(wù)調(diào)度等操作。uC/OS-ll 通過(guò)全局變量OSIntNesting標(biāo)識(shí)當(dāng)前是否處于中斷狀態(tài)。在所有任務(wù)及事件管理 的程序中,都有對(duì)OSIntNesting進(jìn)行判斷的語(yǔ)句。? void OSI ntE nter(void);? void OSI ntExit(void);vol#!it輝的一強(qiáng):磁 十$OS.酗虛比時(shí)TTGIL門(mén).if r&Sf沁TmX 1if (oerntliftstirtg 5 ft) iOeistHostiaa -,=n if. M帖pTbl LOSBdjSri)(CWPr j(i gWMy - ISTSU) f f OS I Rtbdt J

16、 OS_SchedNew() -OSStartHighRdy()問(wèn)題:任務(wù)第一次被調(diào)用時(shí),哪來(lái)的上下文供其恢復(fù)呢?創(chuàng)建任務(wù)時(shí), 調(diào)用 了 OSTaskStkInit()初始化任務(wù)堆棧,可此函數(shù)中沒(méi)有涉及任務(wù)的上下文呀?統(tǒng)計(jì)任務(wù)OSTaskStatOSTaskSta用于計(jì)算 CPU利用率。設(shè)置 OS_CFGH 中的 OS_TASK_STAT_EN為1,創(chuàng)建統(tǒng)計(jì)任務(wù),在系統(tǒng)啟動(dòng)后一直處于就緒狀態(tài)。剛開(kāi)始時(shí),空閑任務(wù)運(yùn) 行1S,為計(jì)算CPU利用率提供一個(gè)基準(zhǔn)值,并保存在統(tǒng)計(jì)任務(wù)的堆棧中,這個(gè) 值不會(huì)改變除非重新啟動(dòng) CPU。此后空閑任每次被其它任務(wù)搶去 CPU時(shí),它里面的計(jì)數(shù)器就會(huì)直接記錄下 CPU

17、空閑的時(shí)間。3. uC/OS-ll系統(tǒng)時(shí)鐘任何實(shí)時(shí)系統(tǒng)的時(shí)鐘硬件設(shè)備每隔一段時(shí)間(一個(gè)系統(tǒng)tick)產(chǎn)生一個(gè)硬件 中斷,OS接收到該中斷后,更新時(shí)間計(jì)數(shù)器,更新所有對(duì)時(shí)鐘依賴的程序代碼, 從而維持系統(tǒng)有序穩(wěn)定的運(yùn)行。系統(tǒng)時(shí)鐘中斷間隔系統(tǒng)運(yùn)行的時(shí)間值主要包含在C源文件OS_TIME.C中。? #defi ne OS_TICKS _P ER_SEC100? OS_EXT volatile INT32U OSTime? void OSTimeTicKvoid);時(shí)鐘中斷服務(wù)程序? void OSTimeDly(INT16U ticks);延遲指定時(shí)鐘節(jié)拍? INT8U OSTimeDlyHMSM(-

18、);/延遲指定時(shí)間長(zhǎng)度? INT8U OSTimeDlyResumeDrio);/恢復(fù)等待(時(shí)延/阻塞)任務(wù)? INT32U OSTimeGetvoid);讀取當(dāng)前時(shí)間? void OSTimeSe(INT32U ticks);設(shè)置當(dāng)前時(shí)間4. uC/OS-II事件管理(1)事件控制塊? INT8U OSEve ntType/事件類型? void *OSEve ntPtr;指向 MBox 或 Queue? INT16U OSEve ntCnt;信號(hào)量計(jì)數(shù)器(注:Mutex)? INT8U OSEve ntGrp/事件等待組標(biāo)志? INT8U OSEve ntTb;時(shí)間任務(wù)等待表? INT8U

19、OSEve ntName;時(shí)間名稱(2) ECB管理機(jī)制? OS_EXT OS_EVENT OSEventFreeList /空閑 ECB 鏈表指針? OS_EXT OS_EVENlOSEventTb ; /ECB 結(jié)構(gòu)體數(shù)組ECB管理函數(shù)? OS_InitEventList():初始化 ECB;? OS_EventWaitListInit():在創(chuàng)建事件時(shí)調(diào)用,初始化 ECB任務(wù)等待表;? OS_EventTaskRdyO在事件發(fā)生時(shí)調(diào)用,修改此事件中最高優(yōu)先級(jí)任務(wù)的TCB成員變量,在任務(wù)就緒表中添加此任務(wù),將相應(yīng)信息傳遞給該 任務(wù)TCB,并將此任務(wù)從事件的任務(wù)等代表中刪除;? OS_Eve

20、ntTaskWaitO在申請(qǐng)資源失敗而暫停當(dāng)前任務(wù)時(shí)被調(diào)用,將任務(wù) 從任務(wù)就緒表中刪除,并添加到事件的任務(wù)等代表中;? OS_EventTO():在事件等待超時(shí)時(shí)調(diào)用,將此任務(wù)從事件的任務(wù)等代表 中刪除,并修改該任務(wù)的TCB成員變量;uC/OS-II任務(wù)管理1. C可執(zhí)行代碼結(jié)構(gòu)代碼段.text:存放CPU執(zhí)行的機(jī)器指令,通常.text是可共享且只讀的。 數(shù)據(jù)段.data: .rodata(常量數(shù)據(jù))、.rwdata (已初始化全局變量、靜態(tài)變量)。? 未初始化數(shù)據(jù)段.bss:未初始化的全局變量、靜態(tài)變量。? 棧.stack:存放函數(shù)參數(shù)、局部變量及任務(wù)切換時(shí)的上下文。堆.heap:用于動(dòng)態(tài)內(nèi)

21、存分配。2. 任務(wù)結(jié)構(gòu)甲i店的糧空間畀療優(yōu)網(wǎng)可功;態(tài)分記內(nèi)在uC/OS-ll中,任務(wù)是事件運(yùn)行和管理的基本單元。一個(gè)uC/OS-ll任務(wù)至少包含程序代碼、棧和 TCB,還可選擇性使用相當(dāng)于堆的動(dòng)態(tài)內(nèi)存空間。程序運(yùn)行時(shí),uC/OS-II中的任務(wù)相當(dāng)于 可執(zhí)行代碼(可單獨(dú)運(yùn)行的單元)。uC/OS-II任務(wù)的各部分如何管理?? 任務(wù)棧數(shù)據(jù)類型:?任務(wù)棧增長(zhǎng)方向:3. 任務(wù)棧 typ edef un sig ned short OS_STK#defi ne OS_STK_GROWTH 0/1?任務(wù)棧基本功能:?4. 任務(wù)控制塊 TCB描述主要用來(lái)存儲(chǔ)任務(wù)的當(dāng)前屬性。(問(wèn):任務(wù)第一次被調(diào)度時(shí),該如何運(yùn)行

22、?)TCB主要成員?任務(wù)??臻g位置:OSTCBStkPt、OSTCBStkBottom OSTCBStkSize?任務(wù)通信與同步:OSTCBEventPtr、OSTCBMsg;?任務(wù)事件組標(biāo)志:OSTCBFIagNode OSTCBFlagsRdy?任務(wù)等待 /阻塞:OSTCBDly、OSTCBPendTQ? 任務(wù)當(dāng)前狀態(tài):OSTCBStat? 任務(wù)優(yōu)先級(jí):OSTCB Prio;(3)TCB全局變量? OS_EXT OSTCBOSTCBTblOSMAXTASKS + OS_N_SYS_TASKS;? OS_EXT OS_TCBOSTCB PnoTblOS_LOWEST_ PRIO + 1;?

23、OS_EXT OS_TCB OSTCBFreeList? OS EXT OS TCB OSTCBList;? OS_EXT OS_TCB OSTCBHighRdy? OS_EXT OS_TCB OSTCBCur;5. 任務(wù)狀態(tài)切換| Kr斗U_ If Ifr初niiL 仍(枷毗 )7 就胡)V乂、/ I.利存撲6. 任務(wù)管理函數(shù)OS_TASK.C: 11 個(gè)函數(shù)? OSTaskCreate();OSTaskCreateExtO;OSTaskDelO;OSTaskDelReqO;OSTaskCha ngeP rio();OSTaskSus pen d();OSTaskResume();OSTas

24、kNameGetO;OSTaskNameSetO;OSTaskStkChk();OS_TaskStkClr();OSTaskQuery();uC/OS-ll通信與同步1. 消息郵箱MboxMbox用于多任務(wù)間單一消息的傳遞,uC/OS-II使用ECB管理Mbox的基本信息,OSEventPtr指向創(chuàng)建Mbox時(shí)指定的內(nèi)存空間。事件的創(chuàng)建由具體的事件 管理程序?qū)崿F(xiàn)。主要包含在C源文件OS_MBOX.C中。? OS_EVENT *OSMboxCreate(void *msg);? void *OSMbox Pen c(OS_EVENT *p eve nt, INT16U timeout, INT8

25、U *err);? void *OSMboxAcce p(OS_EVENT *p eve nt);? INT8U OSMbox Po s(OS_EVENT *p eve nt, void *msg);? INT8U OSMbox PostO p(OS_EVENT *p eve nt, void *msg, INT8U opt);? OS_EVENT *OSMboxDel(OS_EVENT *p eve nt, INT8U op t, INT8U *err);? INT8U OSMboxQuery(OS_EVENT *p eve nt, OS_MBOX_DATA *);2. 消息隊(duì)列msgQ(1

26、) msgQ基本內(nèi)容msgQ是uC/OS-II任務(wù)間通信的機(jī)制,可實(shí)現(xiàn)多條消息傳遞,即可以同時(shí)存 儲(chǔ)多條消息。uC/OS-II使用循環(huán)隊(duì)列管理機(jī)制。主要包含在C源文件OS_Q.C中。msgQ管理:使用指針數(shù)組存儲(chǔ)所有消息的位置;使用 QCB標(biāo)識(shí)指針數(shù)組 中消息的基本信息;使用 ECB管理整個(gè)msgQ。QCB在編譯時(shí)分配空間,即當(dāng)前系統(tǒng)中可用的msgQ個(gè)數(shù)是預(yù)先設(shè)置的,系統(tǒng)運(yùn)行時(shí)不能修改。(2) msgQ全局變量? OS_EXT OS_Q OSQTblOS_MAX_QS; /QCB 結(jié)構(gòu)體數(shù)組? OS_EXT OS_Q OSQFreeList空閑QCB頭指針/消息隊(duì)列控制塊struct os_q

27、 *OSQ Ptr;/用于構(gòu)建空閑QCB鏈表void * OSQStart指向msgQ指針數(shù)組的起始位置void * OSQEnd指向msgQ指針數(shù)組的結(jié)束位置? typ edef struct os_qvoid * OSQIn; 指向msgQ指針數(shù)組下一個(gè)可以插入消息的位置void * OSQOut; /指向msgQ指針數(shù)組下一個(gè)可以讀出消息的位置INT16U OSQSize/msgQ指針數(shù)組的大小INT16U OSQE ntries;/msgQ指針數(shù)組當(dāng)前可以讀取的消息個(gè)數(shù)OS_Q;(3) msgQ管理函數(shù)? OS_EVENT *OSQCreate(void *start, INT16U

28、size);? INT8U OSQ Po s(OS_EVENT *p eve nt, void *msg); / 發(fā)送消息到隊(duì)尾? INT8U OSQ PostFro n1(OS_EVENT *p eve nt, void *msg)msg 至隊(duì)首? INT8U OSQ Post Op (OS_EVENT *p eve nt, void *msg, INT8U opt);? void *OSQ Pen c(OS_EVENT *p eve nt, INT16U timeout, INT8U *err);? void *OSQAcce p(OS_EVENT *p eve nt, INT8U *er

29、r);? OS_EVENT *OSQDel(OS_EVENT *p eve nt, INT8U op t, INT8U *err);? INT8U OSQQueryOS_EVENT *p eve nt, OS_Q_DATA*);? INT8U OSQFlush(OS_EVENT *p eve nt);msgQ幾個(gè)問(wèn)題uC/OS-II中,什么是事件?事件是uC/OS-II管理任務(wù)間同步與通信的機(jī)制。事件是處理事件的對(duì)象感興趣的,能夠感知或捕獲到一種事件狀態(tài)的改變。3. 信號(hào)量SemSem主要用來(lái)實(shí)現(xiàn)任務(wù)間同步及標(biāo)識(shí)某類資源的可用個(gè)數(shù),即某個(gè)特定資源 可供多少任務(wù)同時(shí)使用。主要包含在 C源文件OS

30、_SEM.C中。? OS_EVENT *0SSemCreateNT16U cn t);? void OSSe mPen dOS_EVENT *p eve nt, INT16U timeout, INT8U *err);? INT16U OSSemAccepOS_EVENT *p eve nt);? INT8U OSSe mPo SJOS_EVENT *p eve nt);? OS_EVENT *OSSemDe(OS_EVENT *p eve nt, INT8U op t, INT8U *err);? INT8U OSSemQueryOS_EVENT *p eve nt, OS_SEM_DATA

31、*);? void OSSemSe(OS_EVENT *p eve nt, INT16U cn t, INT8U *err);4. 互斥鎖Mutex Mutex基本原理Mutex用來(lái)實(shí)現(xiàn)對(duì)資源的排他性訪問(wèn),可能引起優(yōu)先級(jí)反轉(zhuǎn)。任何任務(wù)在占有某個(gè)互斥鎖事件時(shí),都不能阻塞等待其它任何事件,否則會(huì)造成死鎖。主要包 含在C源文件OS_MUTEX.C中。優(yōu)先級(jí)反轉(zhuǎn)是指,低優(yōu)先級(jí)任務(wù)占有高優(yōu)先級(jí)任務(wù)運(yùn)行所需的資源,而使高 優(yōu)先級(jí)不得不等低優(yōu)先級(jí)任務(wù)把資源釋放才能執(zhí)行。uC/OS-ll使用ECB管理Mutex,其成員變量 OSEventCnt:高8位存儲(chǔ)Mutex被使用時(shí)提供給任務(wù)的prio;低8位在沒(méi)有任

32、務(wù)占有Mutex時(shí)為OxFF,否則為 占有任務(wù)的prio。(2)提升/恢復(fù)優(yōu)先級(jí)a) 提升Mutex擁有者任務(wù)的優(yōu)先級(jí)的相關(guān)操作:? 如果該任務(wù)原來(lái)處于 就緒狀態(tài),則從就緒表中將其刪除;如果該任務(wù)正在等待某個(gè)事件,則從該事件的任務(wù)等待表中將其刪除;? 修改擁有Mutex的TCB,將其OSTCBPrio修改為欲提升的優(yōu)先級(jí);?如果該任務(wù)處于就緒狀態(tài),則將提升的優(yōu)先級(jí)加載到任務(wù)就緒表中;如果該任務(wù)未就緒且正在等待某個(gè)事件,則將提升的優(yōu)先級(jí)添加到該 事件的任務(wù)等待表中,并修改 TCB中OSTCBEventPtr;? 修改TCB中與優(yōu)先級(jí)相關(guān)的成員變量。b) 恢復(fù)Mutex擁有任務(wù)的優(yōu)先級(jí)的相關(guān)操作:

33、? 從任務(wù)就緒表中刪除提升過(guò)的優(yōu)先級(jí)值,修改當(dāng)前TCB中與優(yōu)先級(jí)相關(guān)的所有成員變量;? 再次保留提升的優(yōu)先級(jí)值控制塊入口,避免將其分配給其它任務(wù)。(3) Mutex管理函數(shù)? #defi neOS_MUTEX_KEE P_ LOWER_80x00FF? #defi neOS_MUTEX_KEE P_UPP ER_80xFF00? #defi neOS_MUTEX_AVAILABLE0x00FF? OS_EVENT *OSMutexCreateINT8U prio, INT8U *err);? void OSMutex Pen c(OS_EVENT *p eve nt, INT16U timeo

34、ut, INT8U *err);? INT8U OSMutexAcce ptOS_EVENT *p eve nt, INT8U *err);? INT8U OSMutex Po s(OS_EVENT *p eve nt);? OS_EVENT *OSMutexDel(OS_EVENT*, INT8U op t, INT8U *err);? INT8U OSMutexQueiyOS_EVENT*, OS_MUTEX_DATA*);OS恫texc噸對(duì)創(chuàng)N*s&暑勻苴斥號(hào)之刊岡矣K5. 事件組標(biāo)志Flag(1) Flag基本原理uC/OS-II提供事件組標(biāo)志實(shí)現(xiàn)多事件管理。Flag只是使用0/1來(lái)表

35、示某個(gè)事件是否發(fā)生過(guò),而不能直接被用來(lái)傳遞數(shù)據(jù)和消息。 可以選擇性地設(shè)置一個(gè)Flagliuiillljltj最多可以管理的任務(wù)同步狀態(tài)。主要包含在 C源文件OS FLAG.C中。Flag數(shù)據(jù)結(jié)構(gòu)? #define OS_FLAGS,NBITS 8/16/32定義OS_FLAGS的位數(shù)? FCB結(jié)構(gòu)體:typ edef struct os_flag_grpINT8U OSFlagT ype事件類型void *OSFIagWaitList;指向等待的任務(wù)鏈表OS_FLAGS OSFIagFlags;信號(hào)列表INT8U OSFIagNameOS_FLAG_NAME_SIZE;OS_FLAG_GR P

36、;?事件標(biāo)志等待鏈表結(jié)點(diǎn)typ edef struct os_flag_ no devoid *OSFlagNodeNext;void *OSFlagNode Prev;void *OSFlagNodeTCB;void *OSFIagNodeFIagGrp;指向此任務(wù)所等待的事件組標(biāo)志OS_FLAGS OSFIagNodeFlags 等待的事件INT8U OSFlagNodeWaitTy pg/ 等待方式OS_FLAG_NODE;? OS_EXT OS_FLAG_GRPOSFlagTblOS_MAX_FLAGS;? OS_EXT OS_FLAG_GR P OSFIagFreeList;Flag

37、管理函數(shù)? OS_FLAG_GR P *OSFIagCreate:OS_FLAGS flags, INT8U *err);? OS_FLAGSOSFIag Pen c(OS_FLAG_GR P *pgrp, OS_FLAGS flags,INT8U wait_t yp e, INT16U timeout, INT8U *err);? Static void OS_FlagBlock(OS_FLAG_GR P *p grp,OS_FLAG_NODE *pnode,OS_FLAGS flags,INT8U wait_t ype,/掛起任務(wù),INT16U timeout);/直到等待的事件或超時(shí)類似

38、于:OS_EventTaskWaitO;? void OS_FIagU niin k(OS_FLAG_NODE *pno de); / 等待超時(shí)刪除結(jié)點(diǎn)類似于:OS_EventTO();? OS_FLAGSOSFIagAcce p1(OS_FLAG_GR P *pgrp,OS_FLAGS flags,INT8U wait_t ype,INT8U *err);? OS_FLAGSOSFIag Po st(OS_FLAG_GR P *pgrp.OS_FLAGS flags,INT8U opt.INT8U *err);? static BOOLEAN OS_FLAGTaskRdyOS_FLAG_NO

39、DE *pnode,OS_FLAGS flags_rdy);? OS_FLAG_GR P *OSFIagDel(OS_FLAG_GR P*, INT8U op t, INT8U *err);? OS_FLAGSOSFlag Pen dGetFlagsRdyvoid); / 獲取任務(wù)就緒標(biāo)志? OS_FLAGSOSFIagQuery(OS_FLAG_GR P*, INT8U *err);? INT8U OSFlagNameGe(OS_FLAG_GR P*, INT8U *pn ame, INT8U *err);? void OSFIagNameSe(OS_FLAG_GR P*, INT8U *p

40、n ame, INT8U *err);6. Task就緒狀態(tài)判斷? ?a) OSRdyTblptcb-OSTCBY & ptcb-OSTCBBitX != 0如:函數(shù) OSMutexPend()b) (ptcb-OSTCBStat & OS_STAT_SUSPEND) = OS_STAT_RDY如:函數(shù) OSTimeTickOc) ptcb-OSTCBStat = OS_STAT_RDY如:函數(shù) OS_EventTaskRdyOuC/OS-ll內(nèi)存管理1. memPart基本原理uC/OS-II根據(jù)需要將內(nèi)存空間分成多個(gè) 內(nèi)存分區(qū),每個(gè)內(nèi)存分區(qū)由具有相同 大小的內(nèi)存塊(Block)組成。主要包含在 C源文件OS_MEM.C中。? OS_EXT OS_MEM OSMemTblOS_MAX_MEM_ART;? OS_EXT OS_MEM *OSMemFreeList;? memPart控制塊結(jié)構(gòu)體:typ edef struct os_me nvoid *OSMemAddr/首地址void *OSMemFreeList/分區(qū)中空閑空間的起始地址IN

溫馨提示

  • 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)論