版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1.μC/OSII基礎(chǔ)2.μC/OSII移植3.嵌入式系統(tǒng)的初始化操作第六章μC/OSII程序設(shè)計(jì)基礎(chǔ)1.μC/OSII基礎(chǔ)第六章μC/OSII程序設(shè)計(jì)基礎(chǔ)1RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺(tái)BSPKERNELFSTCP/IP設(shè)備驅(qū)動(dòng)設(shè)備I/O調(diào)試工具其它組件應(yīng)用RTOSC/C++RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺(tái)BSPKERNEL2C/OS簡(jiǎn)介
C/OS簡(jiǎn)介
3μC/OS-II意為“微控制器操作系統(tǒng)版本2”。世界上已有數(shù)千人在各個(gè)領(lǐng)域使用μC/OS,例如,照相機(jī)行業(yè)、醫(yī)療器械、音響設(shè)施、發(fā)動(dòng)機(jī)控制、網(wǎng)絡(luò)設(shè)備、高速公路電話系統(tǒng)、自動(dòng)提款機(jī)、工業(yè)機(jī)器人等等。很多高等院校將μC/OS用于實(shí)時(shí)系統(tǒng)教學(xué)。μC/OS-II意為“微控制器操作系統(tǒng)版本2”。世界上已有數(shù)4μC/OS-II圖籍描述了μC/OS-II內(nèi)部的工作原理隨書(shū)的CD中包含了源代碼工業(yè)界最清晰的源代碼除英文版外,有中文和韓文版ChineseKoreanEnglishISBN1-57820-103-9美國(guó)CMPBOOKISBN7-81077-290-2北京航空航天大學(xué)出版社ISBN89-951540-5-5μC/OS-II圖籍描述了μC/OS-II內(nèi)部的工作原理Ch5μC/OS-II的各種商業(yè)應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用:Avionics(航空電子設(shè)備)MedicalCellphonesRoutersandswitchesHigh-endaudioequipmentWashingmachinesanddryersUPS(uninterruptiblePowerSupplies)IndustrialcontrollersGPSNavigationSystemsMicrowaveRadiosInstrumentationPoint-of-saleterminals更多μC/OS-II的各種商業(yè)應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用:6μC/OS-Ⅱ是一個(gè)免費(fèi)的、源代碼公開(kāi)的實(shí)時(shí)嵌入式內(nèi)核,其內(nèi)核提供了實(shí)時(shí)系統(tǒng)所需要的一些基本功能。其中包含全部功能的核心部分代碼占用8.3KB,全部的源代碼約5500行,結(jié)構(gòu)合理、清晰易懂,且注解詳盡,非常適合初學(xué)者進(jìn)行學(xué)習(xí)分析。μC/OS-Ⅱ不僅使用戶得到廉價(jià)的解決方案,而且由于μC/OS-Ⅱ的開(kāi)放源代碼特性,還使用戶可針對(duì)自己的硬件優(yōu)化代碼,獲得更好的性能。μC/OS-Ⅱ是在PC機(jī)上開(kāi)發(fā)的,C編輯器使用的是BorlandC/C++3.1版。從早期使用的μCOS到現(xiàn)在的μC/OS-ⅡV2.52版,應(yīng)用的實(shí)例也進(jìn)一步說(shuō)明了該內(nèi)核的實(shí)用性和可靠性。6.1C/OS-II系統(tǒng)的特點(diǎn)及結(jié)構(gòu)
μC/OS-Ⅱ是一個(gè)免費(fèi)的、源代碼公開(kāi)的實(shí)時(shí)嵌入式內(nèi)核,其內(nèi)76.1.1μC/OS-Ⅱ系統(tǒng)的特點(diǎn)6.1.1μC/OS-Ⅱ系統(tǒng)的特點(diǎn)8
3.可固化(ROMable),μC/OS-Ⅱ是為嵌入式應(yīng)用而設(shè)計(jì)的操作系統(tǒng),只要具備有合適的軟硬件工具,就可將μC/OS-Ⅱ嵌入到產(chǎn)品中去,從而成為產(chǎn)品的一部分。4.可裁剪(Scalable),μC/OS-Ⅱ可根據(jù)實(shí)際用戶的應(yīng)用需要使用條件編譯來(lái)完成對(duì)操作系統(tǒng)的裁剪,這樣就可以減少μC/OS-Ⅱ?qū)Υa空間和數(shù)據(jù)空間的占用。5.可剝奪型(Preemptive),μC/OS-Ⅱ是完全可剝奪型的實(shí)時(shí)內(nèi)核,運(yùn)行就緒條件下優(yōu)先級(jí)最高的任務(wù)。6.多任務(wù),μC/OS-Ⅱ可管理64個(gè)任務(wù)。一般情況下,建議用戶保留8個(gè)任務(wù)給μC/OS-Ⅱ。這樣,留給用戶應(yīng)用程序的任務(wù)最多可有56個(gè)。系統(tǒng)賦給每個(gè)任務(wù)的優(yōu)先級(jí)必須不同,這意味著μC/OS-Ⅱ不支持時(shí)間片輪轉(zhuǎn)調(diào)度法(Round-robinScheduling)。7.可確定性,絕大多數(shù)μC/OS-Ⅱ的函數(shù)調(diào)用和服務(wù)的執(zhí)行時(shí)間具有確定性。在任何時(shí)候用戶都能知道μC/OS-Ⅱ的函數(shù)調(diào)用與服務(wù)的執(zhí)行時(shí)間。 3.可固化(ROMable),μC/OS-Ⅱ是為嵌入式應(yīng)用9
8.任務(wù)棧,μC/OS-Ⅱ的每個(gè)任務(wù)都有自己?jiǎn)为?dú)的棧和??臻g。使用μC/OS-Ⅱ的棧空間校驗(yàn)函數(shù)可確定每個(gè)任務(wù)到底需要多少??臻g。9.系統(tǒng)服務(wù),提供了例如信號(hào)量、互斥信號(hào)量、消息郵箱、事件標(biāo)志、數(shù)據(jù)隊(duì)列、塊大小固定的內(nèi)存的申請(qǐng)與釋放及時(shí)間管理函數(shù)等。10.中斷管理,中斷可使正在執(zhí)行的任務(wù)暫時(shí)掛起,如果優(yōu)先級(jí)更高的任務(wù)被中斷喚醒,則高優(yōu)先級(jí)的任務(wù)在中斷嵌套全部退出后立即執(zhí)行。中斷嵌套層數(shù)可達(dá)255層。11.穩(wěn)定性與可靠性,2000年7月,μC/OS-Ⅱ在一個(gè)航空項(xiàng)目中得到了美國(guó)聯(lián)邦航空管理局對(duì)商用飛機(jī)的符合RTCADO--178B標(biāo)準(zhǔn)的認(rèn)證。可以說(shuō),μC/OS-Ⅱ的每一種功能、每一個(gè)函數(shù)及每一行代碼都經(jīng)過(guò)了考驗(yàn)與測(cè)試。 8.任務(wù)棧,μC/OS-Ⅱ的每個(gè)任務(wù)都有自己?jiǎn)为?dú)的棧和???0
6.1.2μC/OS-Ⅱ系統(tǒng)的內(nèi)核結(jié)構(gòu)
與其他操作系統(tǒng)不同,μC/OS-Ⅱ其實(shí)只有一個(gè)內(nèi)核,提供任務(wù)調(diào)度、任務(wù)間的通信與同步、任務(wù)管理、時(shí)間管理和內(nèi)存管理等基本功能。1)任務(wù)在μC/OS-Ⅱ中,一個(gè)任務(wù)通常是一個(gè)無(wú)限的循環(huán)。一個(gè)任務(wù)看起來(lái)像其他c語(yǔ)言的函數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變量,但任務(wù)是決不會(huì)返回的。故返回參數(shù)必須定義成void,例如:VoidYoμrTask(void*pdata){for(;;){/*用戶代碼*//*調(diào)用μC/OS-II的某種系統(tǒng)服務(wù):*//*用戶代碼*/}} 6.1.2μC/OS-Ⅱ系統(tǒng)的內(nèi)核結(jié)11
2)任務(wù)調(diào)度μC/OS-II可以管理多達(dá)64個(gè)任務(wù),其優(yōu)先級(jí)可以從0開(kāi)始,優(yōu)先級(jí)號(hào)越低,其任務(wù)的優(yōu)先級(jí)就越高。但目前版本的μC/OS-II有兩個(gè)任務(wù)已經(jīng)被系統(tǒng)占用了,而且保留了優(yōu)先級(jí)0、1、2、3、和OS_LOWEST_PRIO-3、OS_LOWEST__PRIO-2、0S_LOWEST_PRIO-1以及OS_LOWEST_PRIO這8個(gè)任務(wù)已備將來(lái)使用。OS_LOWEST_PRIO是作為常數(shù)在OS_CFG.H文件中用定義常數(shù)語(yǔ)句#defineconstant來(lái)定義的。因此用戶可以使用多達(dá)56個(gè)應(yīng)用任務(wù),但首先要給每個(gè)任務(wù)賦以不同的優(yōu)先級(jí)。μC/OS-II總是運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)。目前版本的μC/OS-II中,任務(wù)的優(yōu)先級(jí)號(hào)就是任務(wù)編號(hào)(ID)。優(yōu)先級(jí)號(hào)(或任務(wù)的ID號(hào))也可以被一些內(nèi)核服務(wù)函數(shù)調(diào)用,比如改變優(yōu)先級(jí)函數(shù)OSTaskChangePrio()或者OSTaskDel()。為了使μC/OS-II能管理用戶任務(wù),用戶必須在建立一個(gè)任務(wù)的時(shí)候,將任務(wù)的起始地址與其他參數(shù)一起傳給OSTaskCreate()或者OSTaskCreateExt()這兩個(gè)函數(shù)中的任何一個(gè)函數(shù)。 2)任務(wù)調(diào)度12在任一給定的時(shí)刻,任務(wù)的狀態(tài)一定是以下五種狀態(tài)之一:睡眠態(tài)(taskdormant)就緒態(tài)(taskready)運(yùn)行態(tài)(taskrunning)等待狀態(tài)(taskwaiting)中斷服務(wù)態(tài)(ISRrunning)μC/OSII的五種狀態(tài)在任一給定的時(shí)刻,任務(wù)的狀態(tài)一定是以下五種狀態(tài)之一:μC/O13睡眠態(tài)(taskdormant)指任務(wù)駐留在程序空間(ROM或RAM),還沒(méi)有交給系統(tǒng)來(lái)管理的狀態(tài)任務(wù)交給系統(tǒng)通過(guò)調(diào)用以下函數(shù)之一來(lái)實(shí)現(xiàn):OSTaskCreate()OSTaskCreateExt()告知系統(tǒng):任務(wù)的起始地址任務(wù)建立時(shí),用戶給任務(wù)賦予的優(yōu)先級(jí)任務(wù)要使用的棧空間大小等睡眠態(tài)(taskdormant)指任務(wù)駐留在程序空間(RO14就緒態(tài)(taskready)任務(wù)一旦創(chuàng)建就進(jìn)入就緒態(tài),準(zhǔn)備運(yùn)行任務(wù)的創(chuàng)建可以是在多任務(wù)開(kāi)始之前,也可以動(dòng)態(tài)地由一個(gè)運(yùn)行著的任務(wù)創(chuàng)建若剛創(chuàng)建任務(wù)的優(yōu)先級(jí)高于創(chuàng)建它的任務(wù)的優(yōu)先級(jí),它將立即獲得cpu的使用權(quán)任務(wù)可通過(guò)OSTaskDel()返回睡眠態(tài);或調(diào)用該函數(shù)讓另一個(gè)任務(wù)進(jìn)入睡眠態(tài)就緒態(tài)(taskready)任務(wù)一旦創(chuàng)建就進(jìn)入就緒態(tài),準(zhǔn)備15運(yùn)行態(tài)(taskrμnning)就緒的任務(wù)只有當(dāng)所有優(yōu)先級(jí)高于它的任務(wù)都轉(zhuǎn)為等待狀態(tài),或被刪除后,才能進(jìn)入運(yùn)行態(tài)任何時(shí)刻只有一個(gè)任務(wù)處于運(yùn)行態(tài)調(diào)用OSStart()可以啟動(dòng)多任務(wù)。該函數(shù)只能在啟動(dòng)時(shí)調(diào)用一次OSStart()運(yùn)行用戶初始化代碼中已經(jīng)建立的、進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)運(yùn)行態(tài)(taskrμnning)就緒的任務(wù)只有當(dāng)所有優(yōu)先級(jí)16等待狀態(tài)(taskwaiting)正在運(yùn)行的任務(wù)可以通過(guò)下面的調(diào)用進(jìn)入等待狀態(tài)。延遲時(shí)間到,立即強(qiáng)制執(zhí)行任務(wù)切換,讓下一個(gè)優(yōu)先級(jí)最高、并進(jìn)入就緒態(tài)的任務(wù)執(zhí)行。OSTimeDly()OSTimeDlyHMSM()等待時(shí)間過(guò)去后,系統(tǒng)服務(wù)(內(nèi)部)函數(shù)OSTimeTick()使延遲了的任務(wù)進(jìn)入就緒態(tài)用戶無(wú)需在應(yīng)用程序代碼中調(diào)用這個(gè)函數(shù)等待狀態(tài)(taskwaiting)正在運(yùn)行的任務(wù)可以通過(guò)下17等待狀態(tài)(續(xù))正在運(yùn)行的任務(wù)可能需要通過(guò)調(diào)用函數(shù)等待某一事件發(fā)生。如果該事件并未發(fā)生,任務(wù)就進(jìn)入等待狀態(tài)OSFlagPend();OSMμtexPend()OSSemPend();OSMboxPend()當(dāng)事件發(fā)生或等待超時(shí),被掛起的任務(wù)就進(jìn)入就緒態(tài)等待狀態(tài)(續(xù))正在運(yùn)行的任務(wù)可能需要通過(guò)調(diào)用函數(shù)等待某一事件18中斷服務(wù)態(tài)(ISRrunning)正在執(zhí)行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)閉,或系統(tǒng)將中斷關(guān)閉。被中斷的任務(wù)便進(jìn)入了中斷服務(wù)態(tài)響應(yīng)中斷后,正在運(yùn)行的任務(wù)被掛起,中斷服務(wù)子程序控制了CPu的使用權(quán)中斷服務(wù)態(tài)(ISRrunning)正在執(zhí)行的任務(wù)是可以被中19中斷服務(wù)態(tài)(ISRrunning)中斷服務(wù)子程序可能會(huì)報(bào)告一個(gè)或多個(gè)事件的發(fā)生,而使一個(gè)或多個(gè)任務(wù)進(jìn)入就緒態(tài)上述情況下,從中斷服務(wù)子程序返回之前,C/OS–II
要判定:被中斷的任務(wù)是否還是就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的如果中斷服務(wù)子程序使另一個(gè)優(yōu)先級(jí)更高的任務(wù)進(jìn)入了就緒態(tài),則新進(jìn)入就緒態(tài)的這個(gè)優(yōu)先級(jí)更高的任務(wù)將得以運(yùn)行;否則,原來(lái)被中斷了的任務(wù)將繼續(xù)運(yùn)行。中斷服務(wù)態(tài)(ISRrunning)中斷服務(wù)子程序可能會(huì)報(bào)告20任務(wù)狀態(tài)當(dāng)所有的任務(wù)都在等待時(shí)間發(fā)生或等待延遲時(shí)間結(jié)束時(shí),C/OS–II執(zhí)行被稱為空閑任務(wù)(IdleTask)的內(nèi)部函數(shù),即:OSTaskIdle()任務(wù)狀態(tài)當(dāng)所有的任務(wù)都在等待時(shí)間發(fā)生或等待延遲時(shí)間結(jié)束時(shí),21任務(wù)的CPU使用權(quán)被剝奪中斷任務(wù)的CPU使用權(quán)被剝奪中斷22
6.1.3主要模塊介紹1.內(nèi)存管理在ANSIC中,一般采用內(nèi)存分配函數(shù)malloc()和內(nèi)存釋放函數(shù)free()兩個(gè)函數(shù)動(dòng)態(tài)地分配和釋放內(nèi)存。為了消除多次動(dòng)態(tài)分配與釋放內(nèi)存所引起的內(nèi)存碎片和分配、釋放函數(shù)執(zhí)行時(shí)間的不確定性的現(xiàn)象,μC/OS-Ⅱ把連續(xù)的大塊內(nèi)存按分區(qū)來(lái)進(jìn)行管理。每個(gè)分區(qū)中都包含若干個(gè)存儲(chǔ)容量大小相同的內(nèi)存塊,但不同分區(qū)之間的內(nèi)存塊容量大小是可以不同的。在需要?jiǎng)討B(tài)分配內(nèi)存時(shí),可選擇一個(gè)適當(dāng)?shù)姆謪^(qū),按塊來(lái)分配內(nèi)存。在釋放內(nèi)存時(shí),將該塊放回它以前所屬的分區(qū)。這樣,就能有效解決內(nèi)存碎片問(wèn)題。而且每次調(diào)用malloc()和free()分配和釋放的都是整數(shù)倍的固定內(nèi)存塊長(zhǎng),這樣執(zhí)行時(shí)間就是確定的了。 6.1.3主要模塊介紹1.內(nèi)存管理23
(1)內(nèi)存管理控制塊OS_MEM
為便于內(nèi)存的管理,μC/OS-II中使用內(nèi)存控制塊(MemoryControlBlocks)的數(shù)據(jù)結(jié)構(gòu)跟蹤每一個(gè)內(nèi)存分區(qū)系統(tǒng),每個(gè)分區(qū)都有屬于自己的內(nèi)存控制塊,系統(tǒng)是通過(guò)內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu)OS_MEM來(lái)管理內(nèi)存的。(2)內(nèi)存管理
內(nèi)存管理主要通過(guò)以下4個(gè)函數(shù)來(lái)實(shí)現(xiàn):①OSMemCreate()函數(shù),用于建立一個(gè)內(nèi)存分區(qū)。該函數(shù)共有4個(gè)參數(shù):內(nèi)存分區(qū)的起始地址、分區(qū)內(nèi)的內(nèi)存塊數(shù)、每個(gè)內(nèi)存塊的字節(jié)數(shù)和一個(gè)指向錯(cuò)誤信息代碼的指針。②OSMemGet()函數(shù),用于分配一個(gè)內(nèi)存塊。當(dāng)調(diào)度某任務(wù)執(zhí)行時(shí),必須先從已建立的內(nèi)存分區(qū)中為該任務(wù)申請(qǐng)一個(gè)內(nèi)存塊。③OSMemPut()函數(shù),釋放一個(gè)內(nèi)存塊。當(dāng)某一任務(wù)不再使用一個(gè)內(nèi)存塊時(shí),必須及時(shí)地把它放回到相應(yīng)的內(nèi)存分區(qū)中,以便下一次的分配操作。④OSMemQuery()函數(shù),用于查詢一個(gè)特定內(nèi)存分區(qū)的狀態(tài)。如查詢某內(nèi)存分區(qū)中內(nèi)存塊的大小、可用內(nèi)存塊數(shù)和正在使用的內(nèi)存塊數(shù)等信息。 (1)內(nèi)存管理控制塊OS_MEM24
(3)時(shí)間管理與大部分內(nèi)核一樣,μC/OS-Ⅱ要求提供定時(shí)中斷,以實(shí)現(xiàn)延時(shí)與超時(shí)控制等功能。這個(gè)定時(shí)中斷也可以被叫作為時(shí)鐘節(jié)拍。時(shí)鐘節(jié)拍函數(shù)的作用是用于通知μC/OS-Ⅱ發(fā)生了時(shí)鐘節(jié)拍中斷,下面再介紹幾個(gè)可以處理時(shí)間問(wèn)題的函數(shù)。①任務(wù)延時(shí)函數(shù)OSTimeDIy()調(diào)用該函數(shù)會(huì)使μC/OS-Ⅱ進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個(gè)優(yōu)先級(jí)最高的就緒態(tài)任務(wù)。任務(wù)調(diào)用OSTimeDly()后,一旦規(guī)定的時(shí)間期滿或者有其他任務(wù)通過(guò)調(diào)用OSTimeDlyResume()取消了延時(shí),它就會(huì)立即進(jìn)入就緒狀態(tài)。只有當(dāng)該任務(wù)在所有就緒任務(wù)中具有最高的優(yōu)先級(jí)時(shí),它才會(huì)立即運(yùn)行。②恢復(fù)延時(shí)的任務(wù)函數(shù)OSTimeDlyResume()μC/OS-II具有允許結(jié)束正處于延時(shí)期的任務(wù)的功能。具體方法是通過(guò)調(diào)用OSTimeDlyResume()和指定要恢復(fù)的任務(wù)的優(yōu)先級(jí)的方式,這樣延時(shí)的任務(wù)就可以不用等待延時(shí)期滿,而是通過(guò)其他任務(wù)取消延時(shí)來(lái)使自己處于就緒態(tài)。實(shí)際上,OSTimeDlyResume()也可喚醒正在等待事件的任務(wù)。 (3)時(shí)間管理25
③按時(shí)、分、秒、毫秒延時(shí)函數(shù)OSTimeDlyHMSM()OSTimeDly()是一個(gè)非常有用的函數(shù),但用戶的應(yīng)用程序須要知道延時(shí)時(shí)間所對(duì)應(yīng)的時(shí)鐘節(jié)拍的數(shù)目。增加了OSTimeDlyHMSM()函數(shù)后,就可按時(shí)、分、秒和毫秒來(lái)定義時(shí)間了,這樣會(huì)顯得更加方便。與OSTimeDly()一樣,調(diào)用OSTimeDIyHMSM()函數(shù)也會(huì)使μC/OS-II進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個(gè)優(yōu)先級(jí)最高的就緒態(tài)任務(wù)。任務(wù)調(diào)用OSTimeDlyHMSM()后,一旦規(guī)定的時(shí)間期滿或有其他任務(wù)通過(guò)調(diào)用OSTimeDlyResμme()取消了延時(shí),它就會(huì)立即處于就緒態(tài)。同樣,只有當(dāng)該任務(wù)在所有就緒態(tài)任務(wù)中具有最高的優(yōu)先級(jí)時(shí),它才會(huì)立即運(yùn)行。④系統(tǒng)時(shí)間函數(shù)OSTimeGet()和OSTimeSet()無(wú)論時(shí)鐘節(jié)拍何時(shí)發(fā)生,μC/OS-II都會(huì)將一個(gè)32位的計(jì)數(shù)器加1。這個(gè)計(jì)數(shù)器在調(diào)用OSStart()初始化多任務(wù)和4294967295個(gè)節(jié)拍執(zhí)行完一遍后,從0開(kāi)始計(jì)數(shù)。在時(shí)鐘節(jié)拍頻率等于100Hz時(shí),這個(gè)32位的計(jì)數(shù)器每隔497天就重新開(kāi)始計(jì)數(shù)。在執(zhí)行的過(guò)程中可以通過(guò)調(diào)用OSTimeGet()函數(shù)來(lái)獲得該計(jì)數(shù)器的當(dāng)前值,也可以通過(guò)調(diào)用OSTimeSet()函數(shù)來(lái)改變?cè)撚?jì)數(shù)器的值。 ③按時(shí)、分、秒、毫秒延時(shí)函數(shù)OSTimeDlyHMSM()262、任務(wù)的管理μC/OS-II提過(guò)大量的API函數(shù)實(shí)現(xiàn)對(duì)任務(wù)的管理,主要的任務(wù)有:(1)建立任務(wù)μC/OS-II要管理用戶的任務(wù),就必須先建立任務(wù)。通過(guò)將任務(wù)的地址和其他參數(shù)傳遞給以下兩個(gè)函數(shù)來(lái)建立任務(wù)。OSTaskCreate()和帶有擴(kuò)展附加功能的OSTaskCreateExt()函數(shù)。在main()函數(shù)內(nèi)開(kāi)始多任務(wù)調(diào)度(OSStart()前,必須至少建立一個(gè)任務(wù),而且任務(wù)不能由中斷服務(wù)程序(ISR)建立。創(chuàng)建一個(gè)任務(wù)控制塊,并通過(guò)任務(wù)控制塊把任務(wù)代碼和任務(wù)堆棧關(guān)聯(lián)起來(lái)形成一個(gè)完整的任務(wù)。還有使剛創(chuàng)建的任務(wù)進(jìn)入就緒狀態(tài),并引發(fā)一次任務(wù)調(diào)度(取決于任務(wù)是否處于多多任務(wù)工作狀態(tài))。2、任務(wù)的管理μC/OS-II提過(guò)大量的API函數(shù)實(shí)現(xiàn)對(duì)任務(wù)27兩個(gè)函數(shù)OSTaskCreate()和OSTaskCreateExt()原型如下:INT8UOSTaskCreate(void(*task)(void*pd);//指向任務(wù)的指針void*pdata;//傳遞給任務(wù)的參數(shù)OS_STK*ptos;//指向任務(wù)堆棧棧頂?shù)闹羔業(yè)NT8Uprio//任務(wù)的優(yōu)先級(jí))兩個(gè)函數(shù)OSTaskCreate()和OSTaskCreat28INT8UOSTaskCreateExt(void(*task)(void*pd);//指向任務(wù)的指針void*pdata;//傳遞給任務(wù)的參數(shù)OS_STK*ptos;//指向任務(wù)堆棧棧頂?shù)闹羔業(yè)NT8Uprio//任務(wù)的優(yōu)先級(jí)INT16Uid//任務(wù)的標(biāo)識(shí)OS_STK*pbos;//指向任務(wù)堆棧棧低的指針I(yè)NT32Ustk_siaze;//任務(wù)堆棧容量void*pext;//指向附加數(shù)據(jù)域的指針I(yè)NT16Uopt//用于設(shè)定操作選項(xiàng))
在調(diào)用任務(wù)建立函數(shù)后,μC/OS-II內(nèi)核會(huì)首先從TCB空閑列表內(nèi)申請(qǐng)一個(gè)空的TCB指針;然后根據(jù)用戶給出的參數(shù)初始化任務(wù)堆棧,并在內(nèi)部的任務(wù)就緒表中標(biāo)記該任務(wù)為就緒狀態(tài);最后返回。這樣就建立了一個(gè)任務(wù)。INT8UOSTaskCreateExt(29(2)任務(wù)堆棧在μC/OS-II中,每個(gè)任務(wù)都有自己的堆??臻g。堆棧必須聲明為OS_STK類型,并且由連續(xù)的內(nèi)存空間組成??梢造o態(tài)分配堆??臻g(在編譯時(shí)分配),也可以動(dòng)態(tài)分配堆??臻g(在運(yùn)行時(shí)分配),這兩種聲明方式都應(yīng)放置在函數(shù)外面。任務(wù)所需堆棧的容量由應(yīng)用程序確定。但必須考慮到任務(wù)調(diào)用的所有函數(shù)的嵌套情況、任務(wù)調(diào)用的所有函數(shù)為局部變量分配的所有內(nèi)存的數(shù)目,以及所有可能的中斷服務(wù)子程序嵌套對(duì)堆棧的需求。此外,堆棧必須能夠保存CPU所有的寄存器。μC/OS-II提供了堆棧檢驗(yàn)函數(shù)OSTaskStkChk(),用來(lái)確定任務(wù)實(shí)際需要的堆??臻g的大小。這樣能夠避免為任務(wù)分配過(guò)多的堆??臻g,從而減少應(yīng)用程序代碼所需的RAM數(shù)量。調(diào)用堆棧檢驗(yàn)函數(shù)后,所得到的只是一個(gè)大致的堆棧使用情況,并不能說(shuō)明堆棧使用的全部實(shí)際情況。為了適應(yīng)系統(tǒng)以后的升級(jí)和擴(kuò)展,應(yīng)該多分配10%~100%的堆??臻g。(2)任務(wù)堆棧30(3)任務(wù)的掛起和恢復(fù)掛起一個(gè)任務(wù),就是停止這個(gè)任務(wù)的運(yùn)行。在μC/OS-II中,用戶任務(wù)可以通過(guò)調(diào)用系統(tǒng)提供的函數(shù)OSTaskSuspend()來(lái)掛起自身或者除空閑任務(wù)之外的其他任務(wù)。掛起的任務(wù),只能在其他任務(wù)中通過(guò)調(diào)用恢復(fù)函數(shù)OSTaskResume()使其恢復(fù)為就緒狀態(tài)。但是,如果任務(wù)在被掛起的同時(shí)還在等待延遲時(shí)間到,則需要對(duì)任務(wù)取消掛起操作,并且要繼續(xù)等待延遲時(shí)間到,任務(wù)才能轉(zhuǎn)入就緒狀態(tài)。(3)任務(wù)的掛起和恢復(fù)掛起一個(gè)任務(wù),就是停止這個(gè)31(4)任務(wù)的刪除刪除一個(gè)任務(wù),就是把該任務(wù)置于睡眠狀態(tài),任務(wù)的代碼不再被μC/OS-II使用,而并不是說(shuō)任務(wù)的代碼被刪除了。調(diào)用OSTaskDel()后,先進(jìn)行條件判斷,當(dāng)所有的條件都滿足后,就會(huì)從所有可能的μC/OS-II的數(shù)據(jù)結(jié)構(gòu)中去除任務(wù)的任務(wù)控制塊OS_TCB,這樣就不會(huì)被其他的任務(wù)或中斷服務(wù)子程序置于就緒態(tài),即任務(wù)置于休眠狀態(tài)。函數(shù)原型如下:INT8UOSTaskDel(INT8Uprio)可刪除任務(wù)自身或者除了空閑任務(wù)之外的其他任務(wù)。刪除自己參數(shù)為:OS_PRIO_SELF直接調(diào)用這樣的刪除任務(wù),可能出現(xiàn)某些問(wèn)題,如果任務(wù)擁有一些動(dòng)態(tài)的內(nèi)存或者信號(hào)量之類的資源,那么如果它被刪除了,它的資源就不會(huì)被釋放而丟失,會(huì)造成同樣使用資源的其他任務(wù)進(jìn)入死等待,出現(xiàn)錯(cuò)誤情況。要慎重使用。提供了一個(gè)可以在請(qǐng)求刪除方和被刪除方通信完成刪除的函數(shù)。原型如下:INT8UOSTaskDelReq(INT8Uprio)返回是否被刪除和是否有要?jiǎng)h除自己的要求。被刪除方調(diào)用得知要?jiǎng)h除自己,釋放資源后,在刪除自己。(4)任務(wù)的刪除32(5)其他任務(wù)管理函數(shù)任務(wù)優(yōu)先級(jí)別修改任務(wù)運(yùn)行過(guò)程中,用戶可以根據(jù)需要來(lái)改變?nèi)蝿?wù)的優(yōu)先級(jí)別。調(diào)用的函數(shù)原型如下:INT8UOSTaskChangePrio(INT8Uoldprio;//任務(wù)現(xiàn)在的優(yōu)先級(jí)別INT8Unewprio//要修改的優(yōu)先級(jí)別)查詢?nèi)蝿?wù)的信息查詢一些任務(wù)中的信息,函數(shù)原型如下:INT8UOSTaskQuery(INT8Uprio;OS_TCB*pdata)(5)其他任務(wù)管理函數(shù)任務(wù)優(yōu)先級(jí)別修改333、任務(wù)間同步與通信的管理μC/OS-II中,使用信號(hào)量、郵箱(消息郵箱)和消息隊(duì)列來(lái)實(shí)現(xiàn)任務(wù)相互同步或相互之間的通信。μC/OS-II把關(guān)于它們的操作都定義為全局函數(shù),以供應(yīng)用程序的所有任務(wù)來(lái)調(diào)用.等待任務(wù)列表采用INT8U類型的數(shù)組OSEventTbl[]作為記錄等待事件任務(wù)的記錄表,叫做等待任務(wù)表,每個(gè)任務(wù)占1位,為1表示是等待任務(wù)。任務(wù)的等待時(shí)限,記錄在等待任務(wù)的任務(wù)控制塊TCB的成員OSTCBDly中3、任務(wù)間同步與通信的管理μC/OS-II中,使用信號(hào)量、郵34(1)事件控制塊μC/OS-II使用叫做事件控制塊ECB的數(shù)據(jù)結(jié)構(gòu)來(lái)描述諸如信號(hào)量、郵箱和消息隊(duì)列這些事件。事件控制塊包含包括等待任務(wù)表在內(nèi)的所有有關(guān)事件的數(shù)據(jù)。(1)事件控制塊35操作事件控制塊的函數(shù)
μC/OS-II有4個(gè)對(duì)事件控制塊進(jìn)行基本操作的函數(shù)(定義在OS_CORE.C中)。事件控制塊的初始化函數(shù)voidOS_EventWaitListInit(OS_ENENT*pevent)把變量OSEventGrp及任務(wù)等待表中的每一位都清0,即令事件的任務(wù)等待表中不含有任何等待任務(wù)。該函數(shù)被OSXXXCreate()創(chuàng)建時(shí)所調(diào)用。XXXSem信號(hào)量Mutex互斥信號(hào)量Mbox消息郵箱Q消息隊(duì)列操作事件控制塊的函數(shù)36使一個(gè)任務(wù)進(jìn)入等待狀態(tài)的函數(shù)voidOS_EventTaskWait(OS_ENENT*pevent)將在任務(wù)調(diào)用函數(shù)OSXXXPend()請(qǐng)求一個(gè)事件時(shí)調(diào)用。使一個(gè)正在等待任務(wù)進(jìn)入就緒狀態(tài)的函數(shù)INT8UOS_EventTaskRdy(OS_EVENT*pevent,void*msg,INT8Umsk)作用:把調(diào)用這個(gè)函數(shù)的任務(wù)在任務(wù)等待表中的位置清0后,再把任務(wù)在任務(wù)就緒表中的對(duì)應(yīng)的位置1,然后引發(fā)一次任務(wù)調(diào)度將在任務(wù)調(diào)用函數(shù)OSXXXPost()發(fā)送一個(gè)事件時(shí),被調(diào)用。使一個(gè)等待超時(shí)的任務(wù)僅需就緒狀態(tài)的函數(shù)voidOS_EventTo(OS_EVENT*pevent)作用:當(dāng)任務(wù)已經(jīng)超過(guò)了等待的時(shí)間,卻要使它進(jìn)入就緒狀態(tài)。將在任務(wù)調(diào)用函數(shù)OSXXXPend()請(qǐng)求一個(gè)事件時(shí),被調(diào)用。使一個(gè)任務(wù)進(jìn)入等待狀態(tài)的函數(shù)37(2)信號(hào)量管理使用信號(hào)量可以在任務(wù)間傳遞信息,實(shí)現(xiàn)任務(wù)與任務(wù)或中斷服務(wù)子程序的同步。μC/OS-II中的信號(hào)量由兩部分組成:16位的無(wú)符號(hào)整數(shù)信號(hào)量的計(jì)數(shù)值(0~65535);另一部分是由等待該信號(hào)量的任務(wù)組成的等待任務(wù)列表。μC/OS-II提供了以下6個(gè)函數(shù)對(duì)信號(hào)量進(jìn)行操作。操作創(chuàng)建信號(hào)量OSSemCreat(INT16Ucnt)創(chuàng)建,返回已創(chuàng)建信號(hào)量的指針。請(qǐng)求信號(hào)量OSSemPend(OS_EVENT*pevent,INT16Utimeout,NT8U*err)(2)信號(hào)量管理使用信號(hào)量可以在任務(wù)間傳遞信息,實(shí)現(xiàn)任務(wù)與任38time為0,則表示無(wú)限等待。不等待調(diào)用的函數(shù)為OSSemAccept(OS_EVENT*pevent)。發(fā)送信號(hào)量INT8UOSSemPost(OS_EVENT*pevent)當(dāng)獲得信號(hào)量,訪問(wèn)共享資源結(jié)束以后,釋放信號(hào)量,調(diào)用該函數(shù)。先檢查是否有等待該信號(hào)量的任務(wù)。沒(méi)有,信號(hào)量計(jì)數(shù)器加1,有,則調(diào)用調(diào)度器OS_Sched()。time為0,則表示無(wú)限等待。39刪除信號(hào)量OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8Uopt,INT8U*err)optOS_DEL_NO_PEND沒(méi)有等待任務(wù)刪除OS_DEL_ALLWAYS立即刪除只能任務(wù)執(zhí)行,不能在中斷服務(wù)程序中刪除查詢信號(hào)量的狀態(tài)INT8UOSSemQuery(OS_EVENT*pevent,OS_SEM_DATA*pdata)pdata是一個(gè)結(jié)構(gòu)指針,存儲(chǔ)信號(hào)量的狀態(tài)。刪除信號(hào)量40(3)消息郵箱管理消息郵箱是μC/OS-II中的一種通信機(jī)制,通常使用時(shí)要先定義一個(gè)指針型的變量該指針指向一個(gè)包含了消息內(nèi)容的特定數(shù)據(jù)結(jié)構(gòu)。發(fā)送消息的任務(wù)或中斷服務(wù)子程序把這個(gè)變量送往郵箱,接收消息的任務(wù)從郵箱中取出該指針變量,完成信息交換。μC/OS-II提供6種對(duì)消息郵箱的操作,它們通過(guò)以下函數(shù)實(shí)現(xiàn):創(chuàng)建OS_EVENT*OSMoxCreate(void*msg)Msg為消息指針,一般初始為NuLL。(3)消息郵箱管理消息郵箱是μC/OS-II中的一種通信機(jī)制41向消息郵箱發(fā)送消息INT8UOSMboxPost(OS_EVENT*pevent,void*msg)發(fā)送廣播消息INT8UOSMboxPostOpt(OS_EVENT*pevent,void*msg,INT8Uopt)opt:OS_POST_OPT_BROADCAST廣播消息OS_POST_OPT_NONE最高優(yōu)先級(jí)向消息郵箱發(fā)送消息42請(qǐng)求消息郵箱void*OSMboxPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)查詢郵箱狀態(tài)INT8UOSMboxQuery(OS_EVENT*pevent,OS_MBOX_DATA*pdata)刪除郵箱OS_EVENT*OSMboxDel(OS_EVENT*pevent,INT8Uopt,INT8U*err)請(qǐng)求消息郵箱43(4)消息隊(duì)列管理消息隊(duì)列是μC/OS-II的另一種通信機(jī)制,它可以使一個(gè)任務(wù)或中斷服務(wù)子程序向另一個(gè)任務(wù)發(fā)送以指針定義的變量。μC/OS-II提供了9個(gè)對(duì)消息隊(duì)列進(jìn)行操作的函數(shù)。創(chuàng)建先創(chuàng)建一個(gè)指針數(shù)組,然后用該數(shù)組來(lái)創(chuàng)建消息隊(duì)列OS_EVENTOSQCreate(void**start,INT16Usize)請(qǐng)求消息隊(duì)列void*OSQPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)(4)消息隊(duì)列管理消息隊(duì)列是μC/OS-II的另一種通信機(jī)制44向消息隊(duì)列發(fā)送消息INT8UOSQPost(OS_EVENT*pevent,void*msg)工作方式FIFOINT8UOSQPostFront(OS_EVENT*pevent,void*msg)工作方式LIFO發(fā)送廣播消息INT8UOSQPostOpt(OS_EVENT*pevent,void*msg,INT8Uopt)向消息隊(duì)列發(fā)送消息45清空消息隊(duì)列INT8UOSQFlμsh(OS_EVENT*pevent)刪除消息隊(duì)列OS_EVENT*OSQDel(OS_EVENT*pevent)查詢消息隊(duì)列INT8UOSQQuery(OS_EVENT*pevent,OS_Q_DATA*pdata)清空消息隊(duì)列46
μC/OS-II操作系統(tǒng)的文件體系結(jié)構(gòu)如圖2所示,其核心主要可分為以下3部分:(1)應(yīng)用軟件層,指的是基于μC/OS-II的應(yīng)用程序代碼。(2)內(nèi)核的核心代碼層,主要包括8個(gè)源代碼文件。這8個(gè)源代碼文件為OS_CORE.C、OS_MBOX.C、OS_MEM.C、OS_SEM.C、OS_TIME.C、μCOS_II.C、OS_Q.C和OS_TASK.C,其主要實(shí)現(xiàn)的功能分別是核心管理、事件管理、存儲(chǔ)管理、消息隊(duì)列管理、定時(shí)管理、信號(hào)量處理、消息管理和任務(wù)調(diào)度等,這部分代碼與處理器無(wú)關(guān)。(3)系統(tǒng)設(shè)置與移植層。系統(tǒng)設(shè)置部分的代碼由兩個(gè)頭文件OS_CFG.H和INCLμDES.H組成。其主要功能是用來(lái)配置事件控制塊的數(shù)目以及是否包含消息管理的相關(guān)代碼等。與處理器相關(guān)的移植代碼部分包括:一個(gè)頭文件OS_CPU.H、一個(gè)匯編文件OS_CPU_A.ASM和一個(gè)C代碼文件OS_CPU_C.C。系統(tǒng)設(shè)置與移植層與具體應(yīng)用和處理器相關(guān),在隨后的μC/OS-II的移植和開(kāi)發(fā)過(guò)程中,用戶所需要關(guān)注的就是這部分文件。4、μC/OS-II操作系統(tǒng)的文件系統(tǒng) μC/OS-II操作系統(tǒng)的文件體系結(jié)構(gòu)如圖2所示,其核心主47
圖2μC/OS-II文件體系結(jié)構(gòu) 圖2μC/OS-II文件體系結(jié)構(gòu)486.1.4μC/OS-II操作系統(tǒng)的初始化在調(diào)用μC/OS-II操作系統(tǒng)的其他服務(wù)之前,μC/OS-II操作系統(tǒng)要求用戶首先調(diào)用系統(tǒng)初始化函數(shù)OSInit()。執(zhí)行OSInit()函數(shù)后將初始化μC/OS-II所有的變量和數(shù)據(jù)結(jié)構(gòu),另外OSInit()會(huì)建立空閑任務(wù),并且這個(gè)任務(wù)總是處于就緒狀態(tài)的??臻e任務(wù)OSTaskldle()函數(shù)的優(yōu)先級(jí)總是設(shè)置成為最低級(jí)別,即OS_LOWEST_PRIO。多任務(wù)的啟動(dòng)是用戶通過(guò)調(diào)用OSStart()函數(shù)來(lái)實(shí)現(xiàn)的。然而,在啟動(dòng)μC/OS-II之前,用戶至少要建立一個(gè)應(yīng)用任務(wù),例如:voidmain(){OSInit(); ..通過(guò)OSTaskCreate()或OSTaskCreateExt()創(chuàng)建至少一個(gè)任務(wù) ..OSStart();/*開(kāi)始多任務(wù)調(diào)度,OSStart()永遠(yuǎn)都不會(huì)返回*/}6.1.4μC/OS-II操作系統(tǒng)的初始化在調(diào)用μC/O491.μC/OSII基礎(chǔ)2.μC/OSII移植3.嵌入式系統(tǒng)的初始化操作第六章μC/OSII程序設(shè)計(jì)基礎(chǔ)1.μC/OSII基礎(chǔ)第六章μC/OSII程序設(shè)計(jì)基礎(chǔ)506.2μC/OS-II系統(tǒng)在ARM系統(tǒng)中的移植所謂移植,就是指使一個(gè)實(shí)時(shí)操作系統(tǒng)能夠在其他的微處理器平臺(tái)上進(jìn)行運(yùn)行。由于μC/OS-II的主要代碼都是由標(biāo)準(zhǔn)的C語(yǔ)言寫成的,所以,一般來(lái)說(shuō)移植過(guò)程并不復(fù)雜。6.2.1μC/OS-II移植條件雖然μC/OS-II的大部分源代碼是用C語(yǔ)言寫成的,但是,仍需要用匯編語(yǔ)言完成一些與微處理器相關(guān)的代碼。例如,μC/OS-II在讀寫微處理器、寄存器時(shí)只能通過(guò)匯編語(yǔ)言來(lái)實(shí)現(xiàn)。這是因?yàn)棣藽/OS-II在設(shè)計(jì)的時(shí)候就已經(jīng)充分考慮了可移植性。為了要使μC/OS-II可以正常工作,處理器必須要滿足如下要求:6.2μC/OS-II系統(tǒng)在ARM系統(tǒng)中的移植51
1).微處理器的C編譯器能產(chǎn)生可重入代碼可重入的代碼指的是一段代碼(如一個(gè)函數(shù))可以被多個(gè)任務(wù)同時(shí)調(diào)用,而不必?fù)?dān)心會(huì)破壞其內(nèi)部的數(shù)據(jù)。也就是說(shuō),可重入型函數(shù)在任何時(shí)候都可以被中斷執(zhí)行,也不會(huì)因?yàn)樵诤瘮?shù)中斷的時(shí)候被其他的任務(wù)重新調(diào)用,影響函數(shù)中的數(shù)據(jù)??芍厝氪a或者只使用局部變量,即變量保存在CPU寄存器中或堆棧中;或者使用全局變量,則要對(duì)全局變量予以保護(hù)。通常的C編譯器,把局部變量分配在棧中。所以,多次調(diào)用同一個(gè)函數(shù),可以保證每次的局部變量互不受影響。而全局變量,在多次調(diào)用函數(shù)的時(shí)候,必然受到影響。代碼的可重入性是保證完成多任務(wù)的基礎(chǔ),除了在C程序中使用局部變量以外,還需要C編譯器的支持?;贏RM的SDT、ADS等集成開(kāi)發(fā)環(huán)境,都可以生成可重入的代碼。 1).微處理器的C編譯器能產(chǎn)生可重入代碼52
2).在程序中可以使用c語(yǔ)言打開(kāi)或者關(guān)閉中斷在μC/OS-II中,可以通過(guò)進(jìn)入中斷屏蔽的宏定義OS_ENTER_CRITICAL()或者退出中斷屏蔽的宏定義OSEXIT_CRITICAL()來(lái)控制系統(tǒng)關(guān)閉中斷或者打開(kāi)中斷,這需要微處理器的支持。在目前的ARM系列的微處理器上,都可以設(shè)置相應(yīng)的寄存器來(lái)關(guān)閉或者打開(kāi)系統(tǒng)的所有中斷。3).微處理器支持中斷,并且能產(chǎn)生定時(shí)中斷(通常在10Hz-1000Hz之間)。μC/OS-II是通過(guò)微處理器產(chǎn)生定時(shí)的中斷來(lái)實(shí)現(xiàn)多任務(wù)之間的調(diào)度的。4).微處理器支持能夠容納一定量數(shù)據(jù)的硬件堆棧,并具有將堆棧指針和其他CPU寄存器讀寫到堆棧(或者內(nèi)存)的指令。5).μC/OS-II進(jìn)行任務(wù)調(diào)度的時(shí)候,會(huì)把當(dāng)前任務(wù)的CPU內(nèi)部寄存器的內(nèi)容存放到此任務(wù)的堆棧中。然后,再?gòu)牧硪粋€(gè)任務(wù)的堆棧中恢復(fù)原來(lái)的工作寄存器,繼續(xù)運(yùn)行另一個(gè)任務(wù)。所以,寄存器中內(nèi)容的入棧和出棧是μC/OS-II多任務(wù)調(diào)度的基礎(chǔ)。 2).在程序中可以使用c語(yǔ)言打開(kāi)或者關(guān)閉中斷53
6.2.2μC/OS-II的移植步驟在的移植過(guò)程中,使用的是基于ARM公司架構(gòu)的軟件開(kāi)發(fā)工具作為編譯器,所值得關(guān)注的問(wèn)題是與微處理器相關(guān)的代碼,這部分主要包括一個(gè)頭文件OS_CPU.H、一個(gè)匯編文件OS_CPU_A.ASM和一個(gè)C代碼文件OS_CPU_C.C。1.設(shè)置頭文件OS_CPU.H中與處理器和編譯器相關(guān)的代碼(1)與編譯器相關(guān)的數(shù)據(jù)類型 #defineINT8Uunsignedchar#defineINTl6Uunsignedshort#defineINT32Uunsignedlong#defineOS_STKunsignedlong#defineBOOLEANint#defineOS_CPU_SRunsignedlong#defineINT8Schar因?yàn)椴煌奈⑻幚砥饔胁煌淖珠L(zhǎng),所以μC/OS-Ⅱ的移植包括了一系列的類型定義以確保其可移植性。
6.2.2μC/OS-II的移植步驟54
用戶必須將任務(wù)堆棧的數(shù)據(jù)類型定義到μC/OS-II操作系統(tǒng)中,這個(gè)過(guò)程是通過(guò)為OS_STK聲明正確的C語(yǔ)言數(shù)據(jù)類型來(lái)完成的。由于使用的微處理器上的堆棧成員是16位的,所以將OS_TSK聲明為無(wú)符號(hào)整形數(shù)據(jù)類型。值得注意的是,所有的任務(wù)堆棧都必須使用OS_STK聲明數(shù)據(jù)類型。(2)進(jìn)入中斷屏蔽的宏定義OS_ENTER_CRITICAL()和退出中斷屏蔽的宏定義OS_EXIT_CRITICAL()externintINTS_OFF(void);externvoidINTS_ON(void);#defineOS_ENTER_CRITICAL(){CPU_sr=INTS_OFF();}#defineOS_EXIT_CRITICAL(){if(CPU_sr==0)INTS_ON();}與所有的實(shí)時(shí)內(nèi)核一樣,μC/OS-II操作系統(tǒng)在進(jìn)行任務(wù)切換時(shí)需要先禁止中斷在訪問(wèn)代碼的臨界區(qū),并且在訪問(wèn)完畢后重新允許中斷。這就使得μC/OS-II能夠保護(hù)臨界區(qū)代碼免受多任務(wù)或中斷服務(wù)例程(ISR)的破壞。在S3C44B0微處理器上是通過(guò)OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()兩個(gè)函數(shù)來(lái)實(shí)現(xiàn)開(kāi)、關(guān)中斷的。 用戶必須將任務(wù)堆棧的數(shù)據(jù)類型定義到μC/OS-II操作系統(tǒng)55
(3)棧增長(zhǎng)方向標(biāo)OS_STK_GROWTH #defineOS_STK_GROWTH1#defineSTACKSIZE256絕大多數(shù)的微處理器的堆棧是從高地址向低地址增長(zhǎng)的,但是有些微處理器是采用相反方式工作的。鑒于這種情況μC/OS-II操作系統(tǒng)被設(shè)計(jì)成為這兩種情況都可以處理,只要在結(jié)構(gòu)常量OS_STK_GROWTH中指定堆棧的生長(zhǎng)方式就可以了。例如:設(shè)OS_STK_GROWTH為0表示堆棧從下往上增長(zhǎng)。設(shè)OS_STK_GROWTH為1表示堆棧從上往下增長(zhǎng)。 (3)棧增長(zhǎng)方向標(biāo)OS_STK_GROWTH56
2.用匯編語(yǔ)言在OS_CPU_A.ASM文件中編寫4個(gè)與微處理器相關(guān)的函數(shù)(1)
調(diào)用優(yōu)先級(jí)最高的就緒任務(wù)函數(shù)OSStartHighRdy()(2)任務(wù)級(jí)的任務(wù)切換函數(shù)OSCtxSw()(3)中斷級(jí)的任務(wù)切換函數(shù)OSIntCtxSw()(4)時(shí)鐘節(jié)拍中斷服務(wù)函數(shù)OSTickISR()3.用C語(yǔ)言編寫6個(gè)操作系統(tǒng)相關(guān)的函數(shù)(OS_CPU_C.C)這里主要涉及6個(gè)函數(shù):OSTaskStkInit()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()及OSTimeTickHook()。這些函數(shù)中,惟一必須移植的是任務(wù)堆棧初始化函數(shù)OSTaskStkInit()。這個(gè)函數(shù)在任務(wù)創(chuàng)建時(shí)被調(diào)用,負(fù)責(zé)初始化任務(wù)的堆棧結(jié)構(gòu)并返回新堆棧的指針stk。在ARM體系結(jié)構(gòu)下,任務(wù)堆??臻g由高至低依次保存著PC、LR、R12、R11、R10、…、R1、R0、CPSR及SPSR。堆棧初始化工作結(jié)束后,返回新的堆棧棧頂指針。
2.用匯編語(yǔ)言在OS_CPU_A.ASM文件中編寫4個(gè)與57
以下5個(gè)Hook函數(shù),又稱為鉤子函數(shù),主要用來(lái)擴(kuò)展μC/OS-Ⅱ功能,使用前必須被聲明,但并不一定要包含任何代碼。(1)
0STaskCreateHook()函數(shù)當(dāng)用OSTaskCreate()函數(shù)或OSTaskCreateExt()函數(shù)建立任務(wù)時(shí),就會(huì)調(diào)用OSTaskCreateHook()函數(shù)。μC/OS-Ⅱ設(shè)置完自己的內(nèi)部結(jié)構(gòu)后,會(huì)在調(diào)用任務(wù)調(diào)度程序之前調(diào)用OSTaskCreateHook()函數(shù)。該函數(shù)被調(diào)用時(shí)中斷是禁止的,因此應(yīng)盡量減少該函數(shù)中的代碼,以縮短中斷的響應(yīng)時(shí)問(wèn)。
(2)
OSTaskDelHook()函數(shù)當(dāng)任務(wù)被刪除時(shí),就會(huì)調(diào)用OSTaskDelHook()函數(shù)。該函數(shù)在把任務(wù)從μC/OS-Ⅱ的內(nèi)部任務(wù)鏈表中解開(kāi)之前被調(diào)用。當(dāng)OSTaskDelHook()函數(shù)被調(diào)用時(shí),會(huì)收到指向正被刪除任務(wù)的OS_TCB的指針,這樣它就可訪問(wèn)所有的結(jié)構(gòu)成員了。OSTaskDelHook()函數(shù)可用來(lái)檢驗(yàn)TCB擴(kuò)展是否被建立了(一個(gè)非空指針),并進(jìn)行一些清除操作。注意,此函數(shù)不返回任何值。
以下5個(gè)Hook函數(shù),又稱為鉤子函數(shù),主要用來(lái)擴(kuò)展μC/O58
(3)
OSTaskSwHook()函數(shù)當(dāng)發(fā)生任務(wù)切換時(shí),調(diào)用OSTaskSwHook()函數(shù)。不管任務(wù)切換是通過(guò)OSCtxSw()函數(shù),還是通過(guò)OSIntCtxSw()函數(shù)來(lái)執(zhí)行的,都會(huì)調(diào)用該函數(shù)。OSTaskSwHook()函數(shù)可直接訪問(wèn)OSTCBCμr和OSTCBHighRdy,這是因?yàn)樗鼈兌际侨肿兞?。OSTCBCμr指向被切換出去的任務(wù)的OS_TCB,而OSTCBHighRdy指向新任務(wù)的OS_TCB。在調(diào)用OSTaskSwHook()函數(shù)期間,中斷一直是被禁止的。這時(shí)因?yàn)榇a的多少會(huì)影響到中斷的響應(yīng)時(shí)間,所以應(yīng)盡量使代碼簡(jiǎn)化。此函數(shù)沒(méi)有任何參數(shù),也不返回任何值。(4)
OSTaskStatHook()函數(shù)OSTaskStatHook()函數(shù)每秒都會(huì)被OSTaskStat()函數(shù)調(diào)用一次,可用OSTaskStatHook()函數(shù)來(lái)擴(kuò)展統(tǒng)計(jì)功能。該函數(shù)沒(méi)有任何參數(shù),也不返回任何值。(5)
OSTimeTickHook()函數(shù)OSTimeTickHook()函數(shù)在每個(gè)時(shí)鐘節(jié)拍都會(huì)被0STimeTick()函數(shù)調(diào)用。實(shí)際上,OSTimeTickHook()函數(shù)是在節(jié)拍被μC/OS-Ⅱ處理,并在通知用戶的移植實(shí)例或應(yīng)用程序之前被調(diào)用的。OSTimeTickHook()函數(shù)沒(méi)有任何參數(shù),也不返回任何值。 (3)
OSTaskSwHook()函數(shù)591.μC/OSII基礎(chǔ)2.μC/OSII移植3.嵌入式系統(tǒng)的初始化操作第六章μC/OSII程序設(shè)計(jì)基礎(chǔ)1.μC/OSII基礎(chǔ)第六章μC/OSII程序設(shè)計(jì)基礎(chǔ)60
6.2.3μC/OS-IIBSP編寫B(tài)SP(板級(jí)支持包)是介于底層硬件和操作系統(tǒng)之間的軟件層次,它完成系統(tǒng)上電后最初的硬件和軟件初始化,并對(duì)底層硬件進(jìn)行封裝,使得操作系統(tǒng)不再面對(duì)具體的操作。BSP的特點(diǎn):硬件相關(guān)性:因?yàn)榍度胧綄?shí)時(shí)系統(tǒng)的硬件環(huán)境具有應(yīng)用相關(guān)性,所以,作為高層軟件與硬件之間的接口,BSP必須為操作系統(tǒng)提供操作和控制具體硬件的方法。操作系統(tǒng)相關(guān)性:不同的操作系統(tǒng)具有各自的軟件層次結(jié)構(gòu),因此,不同的操作系統(tǒng)具有特定的硬件接口形式。6.2.3μC/OS-IIBSP編寫B(tài)SP(板級(jí)支持包61嵌入式系統(tǒng)初始化過(guò)程及BSP功能嵌入式系統(tǒng)初始化過(guò)程及BSP功能62初始化程序的下載執(zhí)行目標(biāo)機(jī)宿主機(jī)1)通過(guò)編程器將可執(zhí)行目標(biāo)文件燒寫到BootROM(ROM、EPROM、FLASH)等;2)通過(guò)串行口和網(wǎng)口下載執(zhí)行目標(biāo)文件,要求宿主機(jī)系統(tǒng)上有數(shù)據(jù)傳輸工具程序、目標(biāo)機(jī)裝載器、嵌入式監(jiān)視器或目標(biāo)機(jī)系統(tǒng)上的調(diào)試代理。3)通過(guò)JTAG或BDM接口下載;初始化程序的下載執(zhí)行目標(biāo)機(jī)宿主機(jī)1)通過(guò)編程器將可執(zhí)行目標(biāo)文63嵌入式系統(tǒng)的初始化過(guò)程嵌入式系統(tǒng)的初始化過(guò)程64嵌入式系統(tǒng)的初始化過(guò)程硬件初始化階段1、復(fù)位向量
ENTRYbResetHandler;fordebugbHandlerundef;handlerundefbHandlerSWI;SWIinterrupthandlerbHandlerPabort;handlerPAbortbHandlerDabort;handlerDAbortb ;handlerReservedbHandlerIRQbHandlerFIQ嵌入式系統(tǒng)的初始化過(guò)程硬件初始化階段1、復(fù)位向量65嵌入式系統(tǒng)的初始化過(guò)程(2)硬件初始化階段2、最小硬件初始化1)設(shè)置適當(dāng)?shù)募拇嫫?,使嵌入式處理器處于一個(gè)已知的狀態(tài):獲得CPU的類型;獲得或設(shè)置CPU的時(shí)鐘頻率。2)禁止中斷和高速緩存3)初始化內(nèi)存控制器、內(nèi)存芯片和高速緩存單元,包括:得到內(nèi)存的開(kāi)始地址;得到內(nèi)存的大??;如果有要求,則還需要進(jìn)行主存測(cè)試;嵌入式系統(tǒng)的初始化過(guò)程(2)硬件初始化階段2、最小硬件初始化66嵌入式系統(tǒng)的初始化過(guò)程(3)硬件初始化階段3、其余硬件初始化1)引導(dǎo)代碼調(diào)用合適的函數(shù)對(duì)目標(biāo)機(jī)系統(tǒng)上的全部硬件部件進(jìn)行初始化,包括:建立執(zhí)行處理程序初始化中斷處理程序初始化總線接口初始化板級(jí)外設(shè)得到內(nèi)存的開(kāi)始地址;嵌入式系統(tǒng)的初始化過(guò)程(3)硬件初始化階段3、其余硬件初始化67嵌入式系統(tǒng)的初始化過(guò)程(4)RTOS初始化階段4、RTOS初始化1)RTOS初始化2)RTOS對(duì)象和服務(wù)初始化任務(wù)信號(hào)量定時(shí)器中斷內(nèi)存管理3)RTOS任務(wù)堆棧初始化4)RTOS擴(kuò)展部件初始化5)啟動(dòng)RTOS嵌入式系統(tǒng)的初始化過(guò)程(4)RTOS初始化階段4、RTOS初68ARM7TDMI系統(tǒng)初始化的一般過(guò)程啟動(dòng)(系統(tǒng)上電/復(fù)位)從程序入口點(diǎn)關(guān)閉中斷初始化時(shí)鐘等硬件相關(guān)寄存器初始化存儲(chǔ)器系統(tǒng)初始化C所需要的存儲(chǔ)器空間調(diào)用C入口函數(shù)ARM7TDMI系統(tǒng)初始化的一般過(guò)程啟動(dòng)(系統(tǒng)上電/復(fù)位)從69一、設(shè)置程序入口指針上電復(fù)位后直接到程序入口點(diǎn)執(zhí)行,入口點(diǎn)一般為一個(gè)跳轉(zhuǎn)表,跳轉(zhuǎn)到復(fù)位處理程序處開(kāi)始執(zhí)行ARM系統(tǒng)的初始化;啟動(dòng)程序首先必須定義入口指針,而且整個(gè)應(yīng)用程序只有一個(gè)入口指針例:AREABoot,CODE,READONLYENTRY/*設(shè)置程序入口指針*/一、設(shè)置程序入口指針上電復(fù)位后直接到程序入口點(diǎn)執(zhí)行,入口點(diǎn)一70二、設(shè)置中斷向量ARM要求中斷向量必須設(shè)置在從OX00000000地址開(kāi)始,連續(xù)8*4字節(jié)的地址空間;向量表包含一系列跳轉(zhuǎn)指令,跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序;對(duì)各未用中斷,使其指向一個(gè)含返回指令的啞函數(shù),以防止錯(cuò)誤中斷引起系統(tǒng)的混亂;二、設(shè)置中斷向量ARM要求中斷向量必須設(shè)置在從OX0000071中斷向量表FIQ0x1C外部快速中斷IRQ0x18一般外部中斷(Reserved)0x14保留DataAbort0x10數(shù)據(jù)異常FrefetchAbort0x0C預(yù)取指異常Softwareint0x08軟件中斷μndef0x04未定義指令中斷Reset0x00復(fù)位中斷中斷向量表FIQ0x1C外部快速中斷IRQ0x18一般外部中72中斷向量表的程序AREABoot,CODE,READONLYENTRYBReset_handlerBμndef_HandlerBSWI_HandlerBPreAbort_HandlerB.;forreservedinterrupt,stophereBIRQ_handlerBFIQ_handler中斷向量表的程序AREABoot,CODE,READONL73三、初始化時(shí)鐘和設(shè)置相關(guān)的寄存器通過(guò)設(shè)置時(shí)鐘控制器來(lái)確定CPU的工作頻率,設(shè)置中斷控制寄存器屏蔽中斷三、初始化時(shí)鐘和設(shè)置相關(guān)的寄存器通過(guò)設(shè)置時(shí)鐘控制器來(lái)確定CP74四、初始化存儲(chǔ)器系統(tǒng)存儲(chǔ)器類型和時(shí)序配置(參考芯片手冊(cè),設(shè)置與內(nèi)存映射相關(guān)的寄存器)一個(gè)復(fù)雜的系統(tǒng)可能存在多種存儲(chǔ)器類型的接口,需要根據(jù)實(shí)際的系統(tǒng)設(shè)計(jì)對(duì)此加以正確配置。對(duì)同一種存儲(chǔ)器類型來(lái)說(shuō),也因?yàn)樵L問(wèn)速度的差異,需要不同的時(shí)序設(shè)置。通常Flash和SRAM同屬于靜態(tài)存儲(chǔ)器類型,可以合用同一個(gè)存儲(chǔ)器端口;而DRAM因?yàn)閯?dòng)態(tài)刷新和地址線復(fù)用等特性,通常配有專用的存儲(chǔ)器端口。存儲(chǔ)器端口的接口時(shí)序優(yōu)化是非常重要的,影響到整個(gè)系統(tǒng)的性能。因?yàn)橐话阆到y(tǒng)運(yùn)行的速度瓶頸都存在于存儲(chǔ)器訪問(wèn),所以存儲(chǔ)器訪問(wèn)時(shí)序應(yīng)盡可能地快;但同時(shí)又要考慮由此帶來(lái)的穩(wěn)定性問(wèn)題。只有根據(jù)具體選定的芯片,進(jìn)行多次的測(cè)試之后,才能確定最佳的時(shí)序配置。四、初始化存儲(chǔ)器系統(tǒng)存儲(chǔ)器類型和時(shí)序配置(參考芯片手冊(cè),設(shè)置75存儲(chǔ)器地址分布有些系統(tǒng)具有非常靈活的存儲(chǔ)器地址分配特性,進(jìn)行存儲(chǔ)器初始化設(shè)計(jì)的時(shí)候一定要根據(jù)應(yīng)用程序的具體要求來(lái)完成地址分配。一種典型的情況是啟動(dòng)ROM的地址重映射(remap)。當(dāng)一個(gè)系統(tǒng)上電后程序?qū)⒆詣?dòng)從0地址處開(kāi)始執(zhí)行,因此在系統(tǒng)的初始狀態(tài),必須保證在0地址處存在正確的代碼,即要求0地址開(kāi)始處的存儲(chǔ)器是非易性的ROM或Flash等。但是因?yàn)镽OM或Flash的訪問(wèn)速度相對(duì)較慢,每次中斷發(fā)生后都要從讀取ROM或Flash上面的向量表開(kāi)始,影響了中斷響應(yīng)速度。因此有的系統(tǒng)便提供一種靈活的地址重映射方法,可以把0地址重新指向到RAM中去。在這種地址映射的變化過(guò)程當(dāng)中,程序員需要仔細(xì)考慮的是程序的執(zhí)行流程不能被這種變化所打斷。存儲(chǔ)器地址分布有些系統(tǒng)具有非常靈活的存儲(chǔ)器地址分配特性,進(jìn)行76ROM地址的重映射(remap)0x0200(bootcode)0x0100(Reset_handler)……BReset_Handler0x0000Flash(remap)0x0204(bootcode)0x0200(Reset_handler)BReset_Handler0x0000RAMROM地址的重映射(remap)0x0200(bootco77ROM地址重映射的實(shí)現(xiàn)movr8,#RAM_BASE_BOOT //RAM_BASE_BOOT是重映射前內(nèi)部RAM區(qū)地址addr9,pc,#-(8+.-VectorTable)//VectorTale是異常向量表入口ldmiar9!,{r0-r7}//讀8個(gè)異常向量 stmiar8!,{r0-r7}//保存8個(gè)異常向量到RAM區(qū)ldmiar9!,{r0-r4}//讀5個(gè)異常處理程序絕對(duì)地址stmiar8!,{r0-r4}//保存5個(gè)異常處理程序絕對(duì)地址到RAM區(qū)為保證重映射之后提供正確的中斷入口地址,在重映射之前就必須把中斷和異常向量表拷貝到內(nèi)部RAM中。其程序?qū)崿F(xiàn)如下:ROM地址重映射的實(shí)現(xiàn)movr8,#RAM_BAS78五、初始化堆棧ARM處理器有好幾種運(yùn)行狀態(tài)(模式),各種狀態(tài)都需要有自己的堆棧,所以需要分別為這些堆棧分配空間并設(shè)置好各自的堆棧指針每一種狀態(tài)的堆棧指針寄存器(SP)都是獨(dú)立的(System和user模式使用相同的SP寄存器)。因此對(duì)程序中需要用到的每一種模式都要給SP寄存器定義一個(gè)堆棧地址。方法是改變狀態(tài)寄存器CPSR內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),然后給SP賦值。(意不要切換到user模式進(jìn)行user模式的堆棧設(shè)置,因?yàn)檫M(jìn)入user模式后就不能再操作CPSR回到別的模式了。可能會(huì)對(duì)接下去的程序執(zhí)行造成影響。)一般堆棧的大小要根據(jù)需要而定,但是要盡可能給堆棧分配快速和高帶寬的存儲(chǔ)器。堆棧性能的提高對(duì)系統(tǒng)整體性能的影響是非常明顯的。五、初始化堆棧ARM處理器有好幾種運(yùn)行狀態(tài)(模式),各種狀態(tài)79六、初始化應(yīng)用程序執(zhí)行環(huán)境映像一開(kāi)始總是存儲(chǔ)在ROM/Flash里面的,其RO部分既可以在ROM/Flash里面執(zhí)行,也可以轉(zhuǎn)移到速度更快的RAM中去;而RW和ZI這兩部分必須是需要轉(zhuǎn)移到可寫的RAM里去的。所謂應(yīng)用程序執(zhí)行環(huán)境的初始化,就是完成必要的從ROM到RAM的數(shù)據(jù)傳輸和內(nèi)容清零。六、初始化應(yīng)用程序執(zhí)行環(huán)境映像一開(kāi)始總是存儲(chǔ)在ROM/Fla80六、初始化C環(huán)境在目標(biāo)文件中,代碼、數(shù)據(jù)放在不同的段中。源文件編譯鏈接生成含.data、.text段的目標(biāo)文件,且鏈接器生成的.data段是以系統(tǒng)RAM為參考地址故在系統(tǒng)啟動(dòng)時(shí)需要拷貝ROM或FLASH中的.data段到RAM,以完成對(duì)RAM的初始化。在初始化期間應(yīng)將系統(tǒng)需要讀寫的數(shù)據(jù)和變量從ROM拷貝到RAM里運(yùn)行六、初始化C環(huán)境在目標(biāo)文件中,代碼、數(shù)據(jù)放在不同的段中。源文81鏈接器產(chǎn)生的符號(hào)表符號(hào)由鏈接器自動(dòng)產(chǎn)生,只讀段(read-onlyRO)就是代碼段,讀寫段(read-writeRW)是已經(jīng)初始化的全局變量,而零初始化段(zero-initializedsectionZI)中存放未初始化的全局變量;鏈接器產(chǎn)生的符號(hào)表符號(hào)由鏈接器自動(dòng)產(chǎn)生,只讀段(read-o82初始化C環(huán)境(1)C環(huán)境初始化,就是利用上述符號(hào)初始化RW和ZI段以使后面使用的全局變量的C程序正常運(yùn)行;這里有兩個(gè)循環(huán),第一個(gè)循環(huán)把預(yù)初始化的數(shù)據(jù)段RW(位于代碼段的后面)復(fù)制到RAM中,另一個(gè)循環(huán)把未初始化的數(shù)據(jù)段ZI初始化為0,也就是實(shí)現(xiàn)把從ROM中的.data段拷貝到RAM,對(duì)ZI段內(nèi)的數(shù)據(jù)初始化為0,以完成對(duì)C環(huán)境的實(shí)始化;初始化C環(huán)境(1)C環(huán)境初始化,就是利用上述符號(hào)初始化RW和83初始化C環(huán)境(2)初始化C環(huán)境(2)84改變處理器模式除用戶模式以外,其他6種模式都是特權(quán)模式。因?yàn)樵诔跏蓟^(guò)程中許多操作需要在特權(quán)模式下才能進(jìn)行(比如CPSR的修改),所以要特別注意不能過(guò)早地進(jìn)入用戶模式。一般地,在初始化過(guò)程中會(huì)經(jīng)歷以下一些模式變化:改變處理器模式除用戶模式以外,其他6種模式都是特權(quán)模式。因85七、調(diào)用C程序?qū)ain函數(shù)的調(diào)用進(jìn)入μc/OS的入口,通過(guò)這個(gè)入口就進(jìn)入μC/OS的主函數(shù),啟動(dòng)對(duì)μC/OS的初始化例IMPORTMainbMain;CEntry七、調(diào)用C程序?qū)ain函數(shù)的調(diào)用進(jìn)入μc/OS的入口,通過(guò)86μC/OS系統(tǒng)的初始化完成了前面的硬件初始化和運(yùn)行環(huán)境的相關(guān)設(shè)置后,進(jìn)入Main(),Main()是μC/OS的入口函數(shù),啟動(dòng)對(duì)μC/OS的初始化μC/OS系統(tǒng)的初始化完成了前面的硬件初始化和運(yùn)行環(huán)境的相關(guān)87μC/OS系統(tǒng)的初始化(2)μC/OS系統(tǒng)的初始化(2)881.μC/OSII基礎(chǔ)2.μC/OSII移植3.嵌入式系統(tǒng)的初始化操作第六章μC/OSII程序設(shè)計(jì)基礎(chǔ)1.μC/OSII基礎(chǔ)第六章μC/OSII程序設(shè)計(jì)基礎(chǔ)89RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺(tái)BSPKERNELFSTCP/IP設(shè)備驅(qū)動(dòng)設(shè)備I/O調(diào)試工具其它組件應(yīng)用RTOSC/C++RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺(tái)BSPKERNEL90C/OS簡(jiǎn)介
C/OS簡(jiǎn)介
91μC/OS-II意為“微控制器操作系統(tǒng)版本2”。世界上已有數(shù)千人在各個(gè)領(lǐng)域使用μC/OS,例如,照相機(jī)行業(yè)、醫(yī)療器械、音響設(shè)施、發(fā)動(dòng)機(jī)控制、網(wǎng)絡(luò)設(shè)備、高速公路電話系統(tǒng)、自動(dòng)提款機(jī)、工業(yè)機(jī)器人等等。很多高等院校將μC/OS用于實(shí)時(shí)系統(tǒng)教學(xué)。μC/OS-II意為“微控制器操作系統(tǒng)版本2”。世界上已有數(shù)92μC/OS-II圖籍描述了μC/OS-II內(nèi)部的工作原理隨書(shū)的CD中包含了源代碼工業(yè)界最清晰的源代碼除英文版外,有中文和韓文版ChineseKoreanEnglishISBN1-57820-103-9美國(guó)CMPBOOKISBN7-81077-290-2北京航空航天大學(xué)出版社ISBN89-951540-5-5μC/OS-II圖籍描述了μC/OS-II內(nèi)部的工作原理Ch93μC/OS-II的各種商業(yè)應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用:Avionics(航空電子設(shè)備)MedicalCellphonesRoutersandswitchesHigh-endaudioequipmentWashingmachinesanddryersUPS(uninterruptiblePowerSupplies)IndustrialcontrollersGPSNavigationSystemsMicrowaveRadiosInstrumentationPoint-of-saleterminals更多μC/OS-II的各種商業(yè)應(yīng)用全世界有數(shù)百種產(chǎn)品在應(yīng)用:94μC/OS-Ⅱ是一個(gè)免費(fèi)的、源代碼公開(kāi)的實(shí)時(shí)嵌入式內(nèi)核,其內(nèi)核提供了實(shí)時(shí)系統(tǒng)所需要的一些基本功能。其中包含全部功能的核心部分代碼占用8.3KB,全部的源代碼約5500行,結(jié)構(gòu)合理、清晰易懂,且注解詳盡,非常適合初學(xué)者進(jìn)行學(xué)習(xí)分析。μC/OS-Ⅱ不僅使用戶得到廉價(jià)的解決方案,而且由于μC/OS-Ⅱ的開(kāi)放源代碼特性,還使用戶可針對(duì)自己的硬件優(yōu)化代碼,獲得更好的性能。μC/OS-Ⅱ是在PC機(jī)上開(kāi)發(fā)的,C編輯器使用的是BorlandC/C++3.1版。從早期使用的μCOS到現(xiàn)在的μC/OS-ⅡV2.52版,應(yīng)用的實(shí)例也進(jìn)一步說(shuō)明了該內(nèi)核的實(shí)用性和可靠性。6.1C/OS-II系統(tǒng)的特點(diǎn)及結(jié)構(gòu)
μC/OS-Ⅱ是一個(gè)免費(fèi)的、源代碼公開(kāi)的實(shí)時(shí)嵌入式內(nèi)核,其內(nèi)956.1.1μC/OS-Ⅱ系統(tǒng)的特點(diǎn)6.1.1μC/OS-Ⅱ系統(tǒng)的特點(diǎn)96
3.可固化(ROMable),μC/OS-Ⅱ是為嵌入式應(yīng)用而設(shè)計(jì)的操作系統(tǒng),只要具備有合適的軟硬件工具,就可將μC/OS-Ⅱ嵌入到產(chǎn)品中去,從而成為產(chǎn)品的一部分。4.可裁剪(Scalable),μC/OS-Ⅱ可根據(jù)實(shí)際用戶的應(yīng)用需要使用條件編譯來(lái)完成對(duì)操作系統(tǒng)的裁剪,這樣就可以減少μC/OS-Ⅱ?qū)Υa空間和數(shù)據(jù)空間的占用。5.可剝奪型(Preemptive),μC/OS-Ⅱ是完全可剝奪型的實(shí)時(shí)內(nèi)核,運(yùn)行就緒條件下優(yōu)先級(jí)最高的任務(wù)。6.多任務(wù),μC/OS-Ⅱ可管理64個(gè)任務(wù)。一般情況下,建議用戶保留8個(gè)任務(wù)給μC/OS-Ⅱ。這樣,留給用戶應(yīng)用程序的任務(wù)最多可有56個(gè)。系統(tǒng)賦給每個(gè)任務(wù)的優(yōu)先級(jí)必須不同,這意味著μC/OS-Ⅱ不支持時(shí)間片輪轉(zhuǎn)調(diào)度法(Round-robinScheduling)。7.可確定性,絕大多數(shù)μC/OS-Ⅱ的函數(shù)調(diào)用和服務(wù)的執(zhí)行時(shí)間具有確定性。在任何時(shí)候用戶都能知道μC/OS-Ⅱ的函數(shù)調(diào)用與服務(wù)的執(zhí)行時(shí)間。 3.可固化(ROMable),μC/OS-Ⅱ是為嵌入式應(yīng)用97
8.任務(wù)棧,μC/OS-Ⅱ的每個(gè)任務(wù)都有自己?jiǎn)为?dú)的棧和??臻g。使用μC/OS-Ⅱ的棧空間校驗(yàn)函數(shù)可確定每個(gè)任務(wù)到底需要多少??臻g。9.系統(tǒng)服務(wù),提供了例如信號(hào)量、互斥信號(hào)量、消息郵箱、事件標(biāo)志、數(shù)據(jù)隊(duì)列、塊大小固定的內(nèi)存的申請(qǐng)與釋放及時(shí)間管理函數(shù)等。10.中斷管理,中斷可使正在執(zhí)行的任務(wù)暫時(shí)掛起,如果優(yōu)先級(jí)更高的任務(wù)被中斷喚醒,則高優(yōu)先級(jí)的任務(wù)在中斷嵌套全部退出后立即執(zhí)行。中斷嵌套層數(shù)可達(dá)255層。11.穩(wěn)定性與可靠性,2000年7月,μC/OS-Ⅱ在一個(gè)航空項(xiàng)目中得到了美國(guó)聯(lián)邦航空管理局對(duì)商用飛機(jī)的符合RTCADO--178B標(biāo)準(zhǔn)的認(rèn)證??梢哉f(shuō),μC/OS-Ⅱ的每一種功能、每一個(gè)函數(shù)及每一行代碼都經(jīng)過(guò)了考驗(yàn)與測(cè)試。 8.任務(wù)棧,μC/OS-Ⅱ的每個(gè)任務(wù)都有自己?jiǎn)为?dú)的棧和???8
6.1.2μC/OS-Ⅱ系統(tǒng)的內(nèi)核結(jié)構(gòu)
與其他操作系統(tǒng)不同,μC/OS-Ⅱ其實(shí)只有一個(gè)內(nèi)核,提供任務(wù)調(diào)度、任務(wù)間的通信與同步、任務(wù)管理、時(shí)間管理和內(nèi)存管理等基本功能。1)任務(wù)在μC/OS-Ⅱ中,一個(gè)任務(wù)通常是一個(gè)無(wú)限的循環(huán)。一個(gè)任務(wù)看起來(lái)像其他c語(yǔ)言的函數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變量,但任務(wù)是決不會(huì)返回的。故返回參數(shù)必須定義成void,例如:VoidYoμrTask(void*pdata){for(;;){/*用戶代碼*//*調(diào)用μC/OS-II的某種系統(tǒng)服務(wù):*//*用戶代碼*/}} 6.1.2μC/OS-Ⅱ系統(tǒng)的內(nèi)核結(jié)99
2)任務(wù)調(diào)度μC/OS-II可以管理多達(dá)64個(gè)任務(wù),其優(yōu)先級(jí)可以從0開(kāi)始,優(yōu)先級(jí)號(hào)越低,其任務(wù)的優(yōu)先級(jí)就越高。但目前版本的μC/OS-II有兩個(gè)任務(wù)已經(jīng)被系統(tǒng)占用了,而且保留了優(yōu)先級(jí)0、1、2、3、和OS_LOWEST_PRIO-3、OS_LOWEST__PRIO-2、0S_LOWEST_PRIO-1以及OS_LOWEST_PRIO這8個(gè)任務(wù)已備將來(lái)使用。OS_LOWEST_PRIO是作為常數(shù)在OS_CFG.H文件中用定義常數(shù)語(yǔ)句#defineconstant來(lái)定義的。因此用戶可以使用多達(dá)56個(gè)應(yīng)用任務(wù),但首先要給每個(gè)任務(wù)賦以不同的優(yōu)先級(jí)。μC/OS-II總是運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)。目前版本的μC/OS-II中,任務(wù)的優(yōu)先級(jí)號(hào)就是任務(wù)編號(hào)(ID)。優(yōu)先級(jí)號(hào)(或任務(wù)的ID號(hào))也可以被一些內(nèi)核服務(wù)函數(shù)調(diào)用,比如改變優(yōu)先級(jí)函數(shù)OSTaskChangePrio()或者OSTaskDel()。為了使μC/OS-II能管理用戶任務(wù),用戶必須在建立一個(gè)任務(wù)的時(shí)候,將任務(wù)的起始地址與其他參數(shù)一起傳給OSTaskCreate()或者OSTaskCreateExt()這兩個(gè)函數(shù)中的任何一個(gè)函數(shù)。 2)任務(wù)調(diào)度100在任一給定的時(shí)刻,任務(wù)的狀態(tài)一定是以下五種狀態(tài)之一:睡眠態(tài)(taskdormant)就緒態(tài)(taskready)運(yùn)行態(tài)(taskrunning)等待狀態(tài)(taskwaiting)中斷服務(wù)態(tài)(ISRrunning)μC/OSII的五種狀態(tài)在任一給定的時(shí)刻,任務(wù)的狀態(tài)一定是以下五種狀態(tài)之一:μC/O101睡眠態(tài)(taskdormant)指任務(wù)駐留在程序空間(ROM或RAM),還沒(méi)有交給系統(tǒng)來(lái)管理的狀態(tài)任務(wù)交給系統(tǒng)通過(guò)調(diào)用以下函數(shù)之一來(lái)實(shí)現(xiàn):OSTaskCreate()OSTaskCreateExt()告知系統(tǒng):任務(wù)的起始地址任務(wù)建立時(shí),用戶給任務(wù)賦予的優(yōu)先級(jí)任務(wù)要使用的??臻g大小等睡眠態(tài)(taskdormant)指任務(wù)駐留在程序空間(RO102就緒態(tài)(taskready)任務(wù)一旦創(chuàng)建就進(jìn)入就緒態(tài),準(zhǔn)備運(yùn)行任務(wù)的創(chuàng)建可以是在多任務(wù)開(kāi)始之前,也可以動(dòng)態(tài)地由一個(gè)運(yùn)行著的任務(wù)創(chuàng)建若剛創(chuàng)建任務(wù)的優(yōu)先級(jí)高于創(chuàng)建它的任務(wù)的優(yōu)先級(jí),它將立即獲得cpu的使用權(quán)任務(wù)可通過(guò)OSTaskDel()返回睡眠態(tài);或調(diào)用該函數(shù)讓另一個(gè)任務(wù)進(jìn)入睡眠態(tài)就緒態(tài)(taskready)任務(wù)一旦創(chuàng)建就進(jìn)入就緒態(tài),準(zhǔn)備103運(yùn)行態(tài)(taskrμnning)就緒的任務(wù)只有當(dāng)所有優(yōu)先級(jí)高于它的任務(wù)都轉(zhuǎn)為等待狀態(tài),或被刪除后,才能進(jìn)入運(yùn)行態(tài)任何時(shí)刻只有一個(gè)任務(wù)處于運(yùn)行態(tài)調(diào)用OSStart()可以啟動(dòng)多任務(wù)。該函數(shù)只能在啟動(dòng)時(shí)調(diào)用一次OSStart()運(yùn)行用戶初始化代碼中已經(jīng)建立的、進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)運(yùn)行態(tài)(taskrμnning)就緒的任務(wù)只有當(dāng)所有優(yōu)先級(jí)104等待狀態(tài)(taskwaiting)正在運(yùn)行的任務(wù)可以通過(guò)下面的調(diào)用進(jìn)入等待狀態(tài)。延遲時(shí)間到,立即強(qiáng)制執(zhí)行任務(wù)切換,讓下一個(gè)優(yōu)先級(jí)最高、并進(jìn)入就緒態(tài)的任務(wù)執(zhí)行。OSTimeDly()OSTimeDlyHMSM()等待時(shí)間過(guò)去后,系統(tǒng)服務(wù)(內(nèi)部)函數(shù)OSTimeTick()使延遲了的任務(wù)進(jìn)入就緒態(tài)用戶無(wú)需在應(yīng)用程序代碼中調(diào)用這個(gè)函數(shù)等待狀態(tài)(taskwaiting)正在運(yùn)行的任務(wù)可以通過(guò)下105等待狀態(tài)(續(xù))正在運(yùn)行的任務(wù)可能需要通過(guò)調(diào)用函數(shù)等待某一事件發(fā)生。如果該事件并未發(fā)生,任務(wù)就進(jìn)入等待狀態(tài)OSFlagPend();OSMμtexPend()OSSemPend();OSMboxPend()當(dāng)事件發(fā)生或等待超時(shí),被掛起的任務(wù)就進(jìn)入就緒態(tài)等待狀態(tài)(續(xù))正在運(yùn)行的任務(wù)可能需要通過(guò)調(diào)用函數(shù)等待某一事件106中斷服務(wù)態(tài)(ISRrunning)正在執(zhí)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)各類合同范例
- 供應(yīng)生產(chǎn)合同范例
- 關(guān)于工資合同范例
- 2024年春八年級(jí)歷史下冊(cè) 第3課 社會(huì)主義制度的建立教案2(pdf) 川教版
- 一次性離職補(bǔ)償協(xié)議
- 獵頭業(yè)務(wù)合作協(xié)議
- 鋼材物流運(yùn)輸協(xié)議三篇
- 森林公園徒步道建設(shè)協(xié)議
- 海關(guān)設(shè)施板房施工協(xié)議
- 《紅樓春趣》2024創(chuàng)新教案教學(xué)設(shè)計(jì)與實(shí)施
- 美國(guó)營(yíng)養(yǎng)標(biāo)簽標(biāo)示成分
- 客服話術(shù)大全-
- 干果加工項(xiàng)目建議書(shū)范文
- 護(hù)理核心制度督查表20179
- 紅色古色綠色文化教育活動(dòng)策劃方案
- 《正交分解法》導(dǎo)學(xué)案
- 建筑材料知識(shí)點(diǎn)匯總
- 小學(xué)五年級(jí)上學(xué)期家長(zhǎng)會(huì)課件.ppt
- 平面構(gòu)成作品欣賞
- 英語(yǔ)管道專業(yè)術(shù)語(yǔ)
- 社會(huì)工作畢業(yè)論文(優(yōu)秀范文8篇)
評(píng)論
0/150
提交評(píng)論