ARM體系結(jié)構(gòu)與編程-第六章_第1頁(yè)
ARM體系結(jié)構(gòu)與編程-第六章_第2頁(yè)
ARM體系結(jié)構(gòu)與編程-第六章_第3頁(yè)
ARM體系結(jié)構(gòu)與編程-第六章_第4頁(yè)
ARM體系結(jié)構(gòu)與編程-第六章_第5頁(yè)
已閱讀5頁(yè),還剩83頁(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.C/OS II基礎(chǔ)2.C/OS II移植3.嵌入式系統(tǒng)的初始化操作第六章 C/OS II程序設(shè)計(jì)基礎(chǔ)RTOS在嵌入入式系統(tǒng)統(tǒng)中的位位置嵌入式硬硬件平臺(tái)臺(tái)BSPKERNELFSTCP/IP設(shè)備驅(qū)動(dòng)動(dòng)設(shè)備I/O調(diào)試工具具其它組件件應(yīng)用RTOSC/C+C/OS簡(jiǎn)介C/OS-II意為為“微控控制器操操作系統(tǒng)統(tǒng)版本2”。世世界上已已有數(shù)千千人在各各個(gè)領(lǐng)域域使用C/OS,例例如,照照相機(jī)行行業(yè)、醫(yī)醫(yī)療器械械、音響響設(shè)施、發(fā)動(dòng)機(jī)機(jī)控制、網(wǎng)絡(luò)設(shè)設(shè)備、高高速公路路電話系系統(tǒng)、自自動(dòng)提款款機(jī)、工工業(yè)機(jī)器器人等等等。很多多高等院院校將C/OS用于于實(shí)時(shí)系系統(tǒng)教學(xué)學(xué)。C/OS-II圖籍描述了C/OS-II內(nèi)部部的

2、工作作原理隨書(shū)的CD中包包含了源源代碼工業(yè)界最最清晰的的源代碼碼除英文版版外,有有中文和和韓文版版ChineseKoreanEnglishISBN 1-57820-103-9美國(guó)CMPBOOKISBN 7-81077-290-2北京航空空航天大大學(xué)出版版社ISBN 89-951540-5-5C/OS-II的各各種商業(yè)業(yè)應(yīng)用全世界有有數(shù)百種種產(chǎn)品在在應(yīng)用:Avionics(航空電電子設(shè)備備)MedicalCell phonesRouters andswitchesHigh-endaudioequipmentWashing machines anddryersUPS(uninterruptible

3、 Power Supplies)Industrial controllersGPSNavigationSystemsMicrowaveRadiosInstrumentationPoint-of-sale terminals更多COS-是一個(gè)個(gè)免費(fèi)的的、源代代碼公開(kāi)開(kāi)的實(shí)時(shí)時(shí)嵌入式式內(nèi)核,其內(nèi)核核提供了了實(shí)時(shí)系系統(tǒng)所需需要的一一些基本本功能。其中包包含全部部功能的的核心部部分代碼碼占用8.3KB,全部的的源代碼碼約5500行行,結(jié)構(gòu)構(gòu)合理、清晰易易懂,且且注解詳詳盡,非非常適合合初學(xué)者者進(jìn)行學(xué)學(xué)習(xí)分析析。COS-不不僅使用用戶得到到廉價(jià)的的解決方方案,而而且由于于COS-的開(kāi)開(kāi)放源代代碼特性性,

4、還使使用戶可可針對(duì)自自己的硬硬件優(yōu)化化代碼,獲得更更好的性性能。COS-是在PC機(jī)上上開(kāi)發(fā)的的,C編編輯器使使用的是是BorlandC/C+3.1版。從早期期使用的的COS到現(xiàn)現(xiàn)在的COS- V2.52版,應(yīng)應(yīng)用的實(shí)實(shí)例也進(jìn)進(jìn)一步說(shuō)說(shuō)明了該該內(nèi)核的的實(shí)用性性和可靠靠性。6.1C/OS-II系統(tǒng)的的特點(diǎn)及及結(jié)構(gòu)6.1.1COS-系統(tǒng)的的特點(diǎn)3可固固化(ROMable),COS-是為嵌嵌入式應(yīng)應(yīng)用而設(shè)設(shè)計(jì)的操操作系統(tǒng)統(tǒng),只要要具備有有合適的的軟硬件件工具,就可將將COS-嵌入入到產(chǎn)品品中去,從而成成為產(chǎn)品品的一部部分。4可裁裁剪(Scalable),COS-可根根據(jù)實(shí)際際用戶的的應(yīng)用需需要使用用條

5、件編編譯來(lái)完完成對(duì)操操作系統(tǒng)統(tǒng)的裁剪剪,這樣樣就可以以減少COS-對(duì)代碼碼空間和和數(shù)據(jù)空空間的占占用。5可剝剝奪型(Preemptive),COS-是完完全可剝剝奪型的的實(shí)時(shí)內(nèi)內(nèi)核,運(yùn)運(yùn)行就緒緒條件下下優(yōu)先級(jí)級(jí)最高的的任務(wù)。6多任任務(wù),COS-可管理理64個(gè)個(gè)任務(wù)。一般情情況下,建議用用戶保留留8個(gè)任任務(wù)給COS-。這樣樣,留給給用戶應(yīng)應(yīng)用程序序的任務(wù)務(wù)最多可可有56個(gè)。系統(tǒng)統(tǒng)賦給每每個(gè)任務(wù)務(wù)的優(yōu)先先級(jí)必須須不同,這意味味著COS-不不支持時(shí)時(shí)間片輪輪轉(zhuǎn)調(diào)度度法(Round-robinScheduling)。7可確確定性,絕大多多數(shù)COS-的的函數(shù)調(diào)調(diào)用和服服務(wù)的執(zhí)執(zhí)行時(shí)間間具有確確定性。在任

6、何何時(shí)候用用戶都能能知道COS-的函數(shù)數(shù)調(diào)用與與服務(wù)的的執(zhí)行時(shí)時(shí)間。8任務(wù)務(wù)棧,COS-的每個(gè)個(gè)任務(wù)都都有自己己?jiǎn)为?dú)的的棧和棧??臻g。使用COS-的??湛臻g校驗(yàn)驗(yàn)函數(shù)可可確定每每個(gè)任務(wù)務(wù)到底需需要多少少??臻g間。9系統(tǒng)統(tǒng)服務(wù),提供了了例如信信號(hào)量、互斥信信號(hào)量、消息郵郵箱、事事件標(biāo)志志、數(shù)據(jù)據(jù)隊(duì)列、塊大小小固定的的內(nèi)存的的申請(qǐng)與與釋放及及時(shí)間管管理函數(shù)數(shù)等。10中中斷管理理,中斷斷可使正正在執(zhí)行行的任務(wù)務(wù)暫時(shí)掛掛起,如如果優(yōu)先先級(jí)更高高的任務(wù)務(wù)被中斷斷喚醒,則高優(yōu)優(yōu)先級(jí)的的任務(wù)在在中斷嵌嵌套全部部退出后后立即執(zhí)執(zhí)行。中中斷嵌套套層數(shù)可可達(dá)255層。11穩(wěn)穩(wěn)定性與與可靠性性,2000年年7月,C

7、OS-在一一個(gè)航空空項(xiàng)目中中得到了了美國(guó)聯(lián)聯(lián)邦航空空管理局局對(duì)商用用飛機(jī)的的符合RTCA DO-178B標(biāo)準(zhǔn)的的認(rèn)證??梢哉f(shuō)說(shuō),COS-的的每一種種功能、每一個(gè)個(gè)函數(shù)及及每一行行代碼都都經(jīng)過(guò)了了考驗(yàn)與與測(cè)試。6.1.2COS-系統(tǒng)的的內(nèi)核結(jié)結(jié)構(gòu)與其他操操作系統(tǒng)統(tǒng)不同,COS-其實(shí)實(shí)只有一一個(gè)內(nèi)核核,提供供任務(wù)調(diào)調(diào)度、任任務(wù)間的的通信與與同步、任務(wù)管管理、時(shí)時(shí)間管理理和內(nèi)存存管理等等基本功功能。1)任任務(wù)在COS-中,一個(gè)任任務(wù)通常常是一個(gè)個(gè)無(wú)限的的循環(huán)。一個(gè)任任務(wù)看起起來(lái)像其其他c語(yǔ)語(yǔ)言的函函數(shù)一樣樣,有函函數(shù)返回回類型,有形式式參數(shù)變變量,但但任務(wù)是是決不會(huì)會(huì)返回的的。故返返回參數(shù)數(shù)必須定定

8、義成void,例如如:Void YorTask(void*pdata)for(;)*用戶戶代碼*調(diào)用用COS-II的的某種系系統(tǒng)服務(wù)務(wù):*用戶戶代碼*2)任任務(wù)調(diào)度度COS-II可以管管理多達(dá)達(dá)64個(gè)個(gè)任務(wù),其優(yōu)先先級(jí)可以以從0開(kāi)開(kāi)始,優(yōu)優(yōu)先級(jí)號(hào)號(hào)越低,其任務(wù)務(wù)的優(yōu)先先級(jí)就越越高。但但目前版版本的COS-II有兩兩個(gè)任務(wù)務(wù)已經(jīng)被被系統(tǒng)占占用了,而且保保留了優(yōu)優(yōu)先級(jí)0、1、2、3、和OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、0S_LOWEST_PRIO-1以以及OS_LOWEST_PRIO這8個(gè)個(gè)任務(wù)已已備將來(lái)來(lái)使用。OS_LOWEST_PRIO是是作為常常數(shù)在OS_C

9、FG.H文件件中用定定義常數(shù)數(shù)語(yǔ)句#define constant來(lái)定義義的。因因此用戶戶可以使使用多達(dá)達(dá)56個(gè)應(yīng)用任任務(wù),但但首先要要給每個(gè)個(gè)任務(wù)賦賦以不同同的優(yōu)先先級(jí)。COS-II總是是運(yùn)行進(jìn)進(jìn)入就緒緒態(tài)的優(yōu)優(yōu)先級(jí)最最高的任任務(wù)。目目前版本本的COS-II中,任任務(wù)的優(yōu)優(yōu)先級(jí)號(hào)號(hào)就是任任務(wù)編號(hào)號(hào)(ID)。優(yōu)優(yōu)先級(jí)號(hào)號(hào)(或任任務(wù)的ID號(hào))也可以以被一些些內(nèi)核服服務(wù)函數(shù)數(shù)調(diào)用,比如改改變優(yōu)先先級(jí)函數(shù)數(shù)OSTaskChangePrio()或者OSTaskDel()。為了使COS-II能管管理用戶戶任務(wù),用戶必必須在建建立一個(gè)個(gè)任務(wù)的的時(shí)候,將任務(wù)務(wù)的起始始地址與與其他參參數(shù)一起起傳給OSTask

10、Create()或者者OSTaskCreateExt()這這兩個(gè)函函數(shù)中的的任何一一個(gè)函數(shù)數(shù)。在任一給給定的時(shí)時(shí)刻,任任務(wù)的狀狀態(tài)一定定是以下下五種狀狀態(tài)之一一:睡眠態(tài)(taskdormant)就緒態(tài)(taskready)運(yùn)行態(tài)(taskrunning)等待狀態(tài)態(tài)(taskwaiting)中斷服務(wù)務(wù)態(tài)(ISRrunning)C/OSII的的五種狀狀態(tài)睡眠態(tài)(taskdormant)指任務(wù)駐駐留在程程序空間間(ROM或RAM),還沒(méi)沒(méi)有交給給系統(tǒng)來(lái)來(lái)管理的的狀態(tài)任務(wù)交給給系統(tǒng)通通過(guò)調(diào)用用以下函函數(shù)之一一來(lái)實(shí)現(xiàn)現(xiàn):OSTaskCreate()OSTaskCreateExt()告知系統(tǒng)統(tǒng):任務(wù)的起起

11、始地址址任務(wù)建立立時(shí),用用戶給任任務(wù)賦予予的優(yōu)先先級(jí)任務(wù)要使使用的棧棧空間大大小等就緒態(tài)(taskready)任務(wù)一旦旦創(chuàng)建就就進(jìn)入就就緒態(tài),準(zhǔn)備運(yùn)運(yùn)行任務(wù)的創(chuàng)創(chuàng)建可以以是在多多任務(wù)開(kāi)開(kāi)始之前前,也可可以動(dòng)態(tài)態(tài)地由一一個(gè)運(yùn)行行著的任任務(wù)創(chuàng)建建若剛創(chuàng)建建任務(wù)的的優(yōu)先級(jí)級(jí)高于創(chuàng)創(chuàng)建它的的任務(wù)的的優(yōu)先級(jí)級(jí),它將將立即獲獲得cpu的使使用權(quán)任務(wù)可通通過(guò)OSTaskDel()返回睡睡眠態(tài);或調(diào)用用該函數(shù)數(shù)讓另一一個(gè)任務(wù)務(wù)進(jìn)入睡睡眠態(tài)運(yùn)行態(tài)(taskrnning)就緒的任任務(wù)只有有當(dāng)所有有優(yōu)先級(jí)級(jí)高于它它的任務(wù)務(wù)都轉(zhuǎn)為為等待狀狀態(tài),或或被刪除除后,才才能進(jìn)入入運(yùn)行態(tài)態(tài)任何時(shí)刻刻只有一一個(gè)任務(wù)務(wù)處于運(yùn)運(yùn)行態(tài)

12、調(diào)用OSStart()可以以啟動(dòng)多多任務(wù)。該函數(shù)數(shù)只能在在啟動(dòng)時(shí)時(shí)調(diào)用一一次OSStart()運(yùn)運(yùn)行用戶戶初始化化代碼中中已經(jīng)建建立的、進(jìn)入就就緒態(tài)的的優(yōu)先級(jí)級(jí)最高的的任務(wù)等待狀態(tài)態(tài)(taskwaiting)正在運(yùn)行行的任務(wù)務(wù)可以通通過(guò)下面面的調(diào)用用進(jìn)入等等待狀態(tài)態(tài)。延遲遲時(shí)間到到,立即即強(qiáng)制執(zhí)執(zhí)行任務(wù)務(wù)切換,讓下一一個(gè)優(yōu)先先級(jí)最高高、并進(jìn)進(jìn)入就緒緒態(tài)的任任務(wù)執(zhí)行行。OSTimeDly()OSTimeDlyHMSM()等待時(shí)間間過(guò)去后后,系統(tǒng)統(tǒng)服務(wù)(內(nèi)部)函數(shù)OSTimeTick()使使延遲了了的任務(wù)務(wù)進(jìn)入就就緒態(tài)用戶無(wú)需需在應(yīng)用用程序代代碼中調(diào)調(diào)用這個(gè)個(gè)函數(shù)等待狀態(tài)態(tài)(續(xù))正在運(yùn)行行的任務(wù)務(wù)

13、可能需需要通過(guò)過(guò)調(diào)用函函數(shù)等待待某一事事件發(fā)生生。如果果該事件件并未發(fā)發(fā)生,任任務(wù)就進(jìn)進(jìn)入等待待狀態(tài)OSFlagPend();OSMtexPend()OSSemPend();OSMboxPend()當(dāng)事件發(fā)發(fā)生或等等待超時(shí)時(shí),被掛掛起的任任務(wù)就進(jìn)進(jìn)入就緒緒態(tài)中斷服務(wù)務(wù)態(tài)(ISRrunning)正在執(zhí)行行的任務(wù)務(wù)是可以以被中斷斷的,除非該該任務(wù)將將中斷關(guān)關(guān)閉,或或系統(tǒng)將將中斷關(guān)關(guān)閉。被被中斷的的任務(wù)便便進(jìn)入了了中斷服服務(wù)態(tài)響應(yīng)中斷斷后,正正在運(yùn)行行的任務(wù)務(wù)被掛起起,中斷斷服務(wù)子子程序控控制了CPu的的使用權(quán)權(quán)中斷服務(wù)務(wù)態(tài)(ISRrunning)中斷服務(wù)務(wù)子程序序可能會(huì)會(huì)報(bào)告一一個(gè)或多多個(gè)事件件的

14、發(fā)生生,而使使一個(gè)或或多個(gè)任任務(wù)進(jìn)入入就緒態(tài)態(tài)上述情況況下,從從中斷服服務(wù)子程程序返回回之前,C/OSII要判定:被中斷的的任務(wù)是是否還是是就緒態(tài)態(tài)任務(wù)中中優(yōu)先級(jí)級(jí)最高的的如果中斷斷服務(wù)子子程序使使另一個(gè)個(gè)優(yōu)先級(jí)級(jí)更高的的任務(wù)進(jìn)進(jìn)入了就就緒態(tài),則新進(jìn)進(jìn)入就緒緒態(tài)的這這個(gè)優(yōu)先先級(jí)更高高的任務(wù)務(wù)將得以以運(yùn)行;否則,原來(lái)被被中斷了了的任務(wù)務(wù)將繼續(xù)續(xù)運(yùn)行。任務(wù)狀態(tài)態(tài)當(dāng)所有的的任務(wù)都都在等待待時(shí)間發(fā)發(fā)生或等等待延遲遲時(shí)間結(jié)結(jié)束時(shí),C/OSII執(zhí)執(zhí)行被被稱為空空閑任務(wù)務(wù)(IdleTask)的的內(nèi)部函函數(shù),即即:OSTaskIdle()任務(wù)的CPU使使用權(quán)被被剝奪中斷6.1.3主主要模塊塊介紹1內(nèi)存存管理在

15、ANSIC中,一一般采用用內(nèi)存分分配函數(shù)數(shù)malloc()和和內(nèi)存釋釋放函數(shù)數(shù)free()兩個(gè)函函數(shù)動(dòng)態(tài)態(tài)地分配配和釋放放內(nèi)存。為了消消除多次次動(dòng)態(tài)分分配與釋釋放內(nèi)存存所引起起的內(nèi)存存碎片和和分配、釋放函函數(shù)執(zhí)行行時(shí)間的的不確定定性的現(xiàn)現(xiàn)象,COS-把連續(xù)續(xù)的大塊塊內(nèi)存按按分區(qū)來(lái)來(lái)進(jìn)行管管理。每每個(gè)分區(qū)區(qū)中都包包含若干干個(gè)存儲(chǔ)儲(chǔ)容量大大小相同同的內(nèi)存存塊,但但不同分分區(qū)之間間的內(nèi)存存塊容量量大小是是可以不不同的。在需要要?jiǎng)討B(tài)分分配內(nèi)存存時(shí),可可選擇一一個(gè)適當(dāng)當(dāng)?shù)姆謪^(qū)區(qū),按塊塊來(lái)分配配內(nèi)存。在釋放放內(nèi)存時(shí)時(shí),將該該塊放回回它以前前所屬的的分區(qū)。這樣,就能有有效解決決內(nèi)存碎碎片問(wèn)題題。而且且每次調(diào)

16、調(diào)用malloc()和free()分配配和釋放放的都是是整數(shù)倍倍的固定定內(nèi)存塊塊長(zhǎng),這這樣執(zhí)行行時(shí)間就就是確定定的了。(1)內(nèi)內(nèi)存管理理控制塊塊OS_MEM為便于內(nèi)內(nèi)存的管管理,COS-II中使使用內(nèi)存存控制塊塊(MemoryControl Blocks)的的數(shù)據(jù)結(jié)結(jié)構(gòu)跟蹤蹤每一個(gè)個(gè)內(nèi)存分分區(qū)系統(tǒng)統(tǒng),每個(gè)個(gè)分區(qū)都都有屬于于自己的的內(nèi)存控控制塊,系統(tǒng)是是通過(guò)內(nèi)內(nèi)存控制制塊數(shù)據(jù)據(jù)結(jié)構(gòu)OS_MEM來(lái)來(lái)管理內(nèi)內(nèi)存的。(2)內(nèi)內(nèi)存管理理內(nèi)存管理理主要通通過(guò)以下下4個(gè)函函數(shù)來(lái)實(shí)實(shí)現(xiàn):OSMemCreate()函數(shù)數(shù),用于于建立一一個(gè)內(nèi)存存分區(qū)。該函數(shù)數(shù)共有4個(gè)參數(shù)數(shù):內(nèi)存存分區(qū)的的起始地地址、分分區(qū)內(nèi)的的

17、內(nèi)存塊塊數(shù)、每每個(gè)內(nèi)存存塊的字字節(jié)數(shù)和和一個(gè)指指向錯(cuò)誤誤信息代代碼的指指針。OSMemGet()函數(shù)數(shù),用于于分配一一個(gè)內(nèi)存存塊。當(dāng)當(dāng)調(diào)度某某任務(wù)執(zhí)執(zhí)行時(shí),必須先先從已建建立的內(nèi)內(nèi)存分區(qū)區(qū)中為該該任務(wù)申申請(qǐng)一個(gè)個(gè)內(nèi)存塊塊。OSMemPut()函數(shù)數(shù),釋放放一個(gè)內(nèi)內(nèi)存塊。當(dāng)某一一任務(wù)不不再使用用一個(gè)內(nèi)內(nèi)存塊時(shí)時(shí),必須須及時(shí)地地把它放放回到相相應(yīng)的內(nèi)內(nèi)存分區(qū)區(qū)中,以以便下一一次的分分配操作作。OSMemQuery()函數(shù),用于查查詢一個(gè)個(gè)特定內(nèi)內(nèi)存分區(qū)區(qū)的狀態(tài)態(tài)。如查查詢某內(nèi)內(nèi)存分區(qū)區(qū)中內(nèi)存存塊的大大小、可可用內(nèi)存存塊數(shù)和和正在使使用的內(nèi)內(nèi)存塊數(shù)數(shù)等信息息。(3)時(shí)時(shí)間管理理與大部分分內(nèi)核一一樣,

18、COS-要求提提供定時(shí)時(shí)中斷,以實(shí)現(xiàn)現(xiàn)延時(shí)與與超時(shí)控控制等功功能。這這個(gè)定時(shí)時(shí)中斷也也可以被被叫作為為時(shí)鐘節(jié)節(jié)拍。時(shí)時(shí)鐘節(jié)拍拍函數(shù)的的作用是是用于通通知COS-發(fā)發(fā)生了時(shí)時(shí)鐘節(jié)拍拍中斷,下面再再介紹幾幾個(gè)可以以處理時(shí)時(shí)間問(wèn)題題的函數(shù)數(shù)。任務(wù)延延時(shí)函數(shù)數(shù)OSTimeDIy()調(diào)用該函函數(shù)會(huì)使使COS-進(jìn)行行一次任任務(wù)調(diào)度度,并且且執(zhí)行下下一個(gè)優(yōu)優(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ù)務(wù)中具有有最高的

19、的優(yōu)先級(jí)級(jí)時(shí),它它才會(huì)立立即運(yùn)行行。恢復(fù)延延時(shí)的任任務(wù)函數(shù)數(shù)OSTimeDlyResume()COS-II具有有允許結(jié)結(jié)束正處處于延時(shí)時(shí)期的任任務(wù)的功功能。具具體方法法是通過(guò)過(guò)調(diào)用OSTimeDlyResume()和指指定要恢恢復(fù)的任任務(wù)的優(yōu)優(yōu)先級(jí)的的方式,這樣延延時(shí)的任任務(wù)就可可以不用用等待延延時(shí)期滿滿,而是是通過(guò)其其他任務(wù)務(wù)取消延延時(shí)來(lái)使使自己處處于就緒緒態(tài)。實(shí)實(shí)際上,OSTimeDlyResume()也也可喚醒醒正在等等待事件件的任務(wù)務(wù)。按時(shí)、分、秒秒、毫秒秒延時(shí)函函數(shù)OSTimeDlyHMSM()OSTimeDly()是一一個(gè)非常常有用的的函數(shù),但用戶戶的應(yīng)用用程序須須要知道道延時(shí)時(shí)時(shí)

20、間所對(duì)對(duì)應(yīng)的時(shí)時(shí)鐘節(jié)拍拍的數(shù)目目。增加加了OSTimeDlyHMSM()函數(shù)數(shù)后,就就可按時(shí)時(shí)、分、秒和毫毫秒來(lái)定定義時(shí)間間了,這這樣會(huì)顯顯得更加加方便。與OSTimeDly()一樣,調(diào)用OSTimeDIyHMSM()函函數(shù)也會(huì)會(huì)使COS-II進(jìn)行一一次任務(wù)務(wù)調(diào)度,并且執(zhí)執(zhí)行下一一個(gè)優(yōu)先先級(jí)最高高的就緒緒態(tài)任務(wù)務(wù)。任務(wù)務(wù)調(diào)用OSTimeDlyHMSM()后后,一旦旦規(guī)定的的時(shí)間期期滿或有有其他任任務(wù)通過(guò)過(guò)調(diào)用OSTimeDlyResme()取消消了延時(shí)時(shí),它就就會(huì)立即即處于就就緒態(tài)。同樣,只有當(dāng)當(dāng)該任務(wù)務(wù)在所有有就緒態(tài)態(tài)任務(wù)中中具有最最高的優(yōu)優(yōu)先級(jí)時(shí)時(shí),它才才會(huì)立即即運(yùn)行。系統(tǒng)時(shí)時(shí)間函數(shù)數(shù)OS

21、TimeGet()和和OSTimeSet()無(wú)論時(shí)鐘鐘節(jié)拍何何時(shí)發(fā)生生,COS-II都會(huì)將將一個(gè)32位的的計(jì)數(shù)器器加1。這個(gè)計(jì)計(jì)數(shù)器在在調(diào)用OSStart()初初始化多多任務(wù)和和4294967295個(gè)節(jié)節(jié)拍執(zhí)行行完一遍遍后,從從0開(kāi)始始計(jì)數(shù)。在時(shí)鐘鐘節(jié)拍頻頻率等于于100Hz時(shí)時(shí),這個(gè)個(gè)32位位的計(jì)數(shù)數(shù)器每隔隔497天就重重新開(kāi)始始計(jì)數(shù)。在執(zhí)行行的過(guò)程程中可以以通過(guò)調(diào)調(diào)用OSTimeGet()函數(shù)來(lái)來(lái)獲得該該計(jì)數(shù)器器的當(dāng)前前值,也也可以通通過(guò)調(diào)用用OSTimeSet()函函數(shù)來(lái)改改變?cè)撚?jì)計(jì)數(shù)器的的值。2、任務(wù)務(wù)的管理理COS-II提過(guò)過(guò)大量的的API函數(shù)實(shí)實(shí)現(xiàn)對(duì)任任務(wù)的管管理,主主要的任任務(wù)有

22、:(1)建建立任務(wù)務(wù)COS-II要管管理用戶戶的任務(wù)務(wù),就必必須先建建立任務(wù)務(wù)。通過(guò)過(guò)將任務(wù)務(wù)的地址址和其他他參數(shù)傳傳遞給以以下兩個(gè)個(gè)函數(shù)來(lái)來(lái)建立任任務(wù)。OSTaskCreate()和帶帶有擴(kuò)展展附加功功能的OSTaskCreateExt()函數(shù)數(shù)。在main()函函數(shù)內(nèi)開(kāi)開(kāi)始多任任務(wù)調(diào)度度(OSStart()前,必須至至少建立立一個(gè)任任務(wù),而而且任務(wù)務(wù)不能由由中斷服服務(wù)程序序(ISR)建建立。創(chuàng)建一個(gè)個(gè)任務(wù)控控制塊,并通過(guò)過(guò)任務(wù)控控制塊把把任務(wù)代代碼和任任務(wù)堆棧棧關(guān)聯(lián)起起來(lái)形成成一個(gè)完完整的任任務(wù)。還還有使剛剛創(chuàng)建的的任務(wù)進(jìn)進(jìn)入就緒緒狀態(tài),并引發(fā)發(fā)一次任任務(wù)調(diào)度度(取決決于任務(wù)務(wù)是否處處于多

23、多多任務(wù)工工作狀態(tài)態(tài))。兩個(gè)函數(shù)數(shù)OSTaskCreate()和和OSTaskCreateExt()原原型如下下:INT8UOSTaskCreate(void (*task)(void*pd);/指向任任務(wù)的指指針void *pdata;/傳遞給給任務(wù)的的參數(shù)OS_STK*ptos;/指向向任務(wù)堆堆棧棧頂頂?shù)闹羔樶業(yè)NT8Uprio/任務(wù)的的優(yōu)先級(jí)級(jí) )INT8UOSTaskCreateExt(void (*task)(void*pd);/指向向任務(wù)的的指針void *pdata;/傳傳遞給任任務(wù)的參參數(shù)OS_STK*ptos;/指向任任務(wù)堆棧棧棧頂?shù)牡闹羔業(yè)NT8Uprio/任務(wù)的的優(yōu)先級(jí)級(jí)

24、INT16Uid/任務(wù)的的標(biāo)識(shí)OS_STK*pbos;/指向向任務(wù)堆堆棧棧低低的指針針I(yè)NT32Ustk_siaze;/任務(wù)務(wù)堆棧容容量void*pext;/指指向附加加數(shù)據(jù)域域的指針針I(yè)NT16Uopt/用于于設(shè)定操操作選項(xiàng)項(xiàng))在調(diào)用任任務(wù)建立立函數(shù)后后,COS-II內(nèi)核核會(huì)首先先從TCB空閑閑列表內(nèi)內(nèi)申請(qǐng)一一個(gè)空的的TCB指針;然后根根據(jù)用戶戶給出的的參數(shù)初初始化任任務(wù)堆棧棧,并在在內(nèi)部的的任務(wù)就就緒表中中標(biāo)記該該任務(wù)為為就緒狀狀態(tài);最最后返回回。這樣樣就建立立了一個(gè)個(gè)任務(wù)。(2)任任務(wù)堆棧棧在COS-II中中,每個(gè)個(gè)任務(wù)都都有自己己的堆棧??臻g。堆棧必必須聲明明為OS_STK類型型,并且

25、且由連續(xù)續(xù)的內(nèi)存存空間組組成??煽梢造o態(tài)態(tài)分配堆堆??臻g間(在編編譯時(shí)分分配),也可以以動(dòng)態(tài)分分配堆棧??臻g(在運(yùn)行行時(shí)分配配),這這兩種聲聲明方式式都應(yīng)放放置在函函數(shù)外面面。任務(wù)所需需堆棧的的容量由由應(yīng)用程程序確定定。但必必須考慮慮到任務(wù)務(wù)調(diào)用的的所有函函數(shù)的嵌嵌套情況況、任務(wù)務(wù)調(diào)用的的所有函函數(shù)為局局部變量量分配的的所有內(nèi)內(nèi)存的數(shù)數(shù)目,以以及所有有可能的的中斷服服務(wù)子程程序嵌套套對(duì)堆棧棧的需求求。此外外,堆棧棧必須能能夠保存存CPU所有的的寄存器器。COS-II提供供了堆棧棧檢驗(yàn)函函數(shù)OSTaskStkChk(),用來(lái)來(lái)確定任任務(wù)實(shí)際際需要的的堆棧空空間的大大小。這這樣能夠夠避免為為任務(wù)分

26、分配過(guò)多多的堆棧??臻g,從而減減少應(yīng)用用程序代代碼所需需的RAM數(shù)量量。調(diào)用用堆棧檢檢驗(yàn)函數(shù)數(shù)后,所所得到的的只是一一個(gè)大致致的堆棧棧使用情情況,并并不能說(shuō)說(shuō)明堆棧棧使用的的全部實(shí)實(shí)際情況況。為了了適應(yīng)系系統(tǒng)以后后的升級(jí)級(jí)和擴(kuò)展展,應(yīng)該該多分配配10100的的堆??湛臻g。(3)任任務(wù)的掛掛起和恢恢復(fù)掛起一個(gè)個(gè)任務(wù),就是停停止這個(gè)個(gè)任務(wù)的的運(yùn)行。在C/OS-II中,用用戶任務(wù)務(wù)可以通通過(guò)調(diào)用用系統(tǒng)提提供的函函數(shù)OSTaskSuspend()來(lái)掛掛起自身身或者除除空閑任任務(wù)之外外的其他他任務(wù)。掛起的的任務(wù),只能在在其他任任務(wù)中通通過(guò)調(diào)用用恢復(fù)函函數(shù)OSTaskResume()使其恢恢復(fù)為就就緒狀態(tài)

27、態(tài)。但是,如如果任務(wù)務(wù)在被掛掛起的同同時(shí)還在在等待延延遲時(shí)間間到,則則需要對(duì)對(duì)任務(wù)取取消掛起起操作,并且要要繼續(xù)等等待延遲遲時(shí)間到到,任務(wù)務(wù)才能轉(zhuǎn)轉(zhuǎn)入就緒緒狀態(tài)。(4)任任務(wù)的刪刪除刪除一個(gè)個(gè)任務(wù),就是把把該任務(wù)務(wù)置于睡睡眠狀態(tài)態(tài),任務(wù)務(wù)的代碼碼不再被被C/OS-II使使用,而而并不是是說(shuō)任務(wù)務(wù)的代碼碼被刪除除了。調(diào)調(diào)用OSTaskDel()后,先先進(jìn)行條條件判斷斷,當(dāng)所所有的條條件都滿滿足后,就會(huì)從從所有可可能的C/OS-II的數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu)中去除除任務(wù)的的任務(wù)控控制塊OS_TCB,這樣就就不會(huì)被被其他的的任務(wù)或或中斷服服務(wù)子程程序置于于就緒態(tài)態(tài),即任任務(wù)置于于休眠狀狀態(tài)。函數(shù)原型型如下:IN

28、T8UOSTaskDel(INT8Uprio)可刪除任任務(wù)自身身或者除除了空閑閑任務(wù)之之外的其其他任務(wù)務(wù)。刪除除自己參參數(shù)為: OS_PRIO_SELF直接調(diào)用用這樣的的刪除任任務(wù),可可能出現(xiàn)現(xiàn)某些問(wèn)問(wèn)題,如如果任務(wù)務(wù)擁有一一些動(dòng)態(tài)態(tài)的內(nèi)存存或者信信號(hào)量之之類的資資源,那那么如果果它被刪刪除了,它的資資源就不不會(huì)被釋釋放而丟丟失,會(huì)會(huì)造成同同樣使用用資源的的其他任任務(wù)進(jìn)入入死等待待,出現(xiàn)現(xiàn)錯(cuò)誤情情況。要要慎重使使用。提提供了一一個(gè)可以以在請(qǐng)求求刪除方方和被刪刪除方通通信完成成刪除的的函數(shù)。原型如如下:INT8UOSTaskDelReq(INT8Uprio)返返回是否否被刪除除和是否否有要?jiǎng)h刪除

29、自己己的要求求。被刪刪除方調(diào)調(diào)用得知知要?jiǎng)h除除自己,釋放資資源后,在刪除除自己。(5)其其他任務(wù)務(wù)管理函函數(shù)任務(wù)優(yōu)先先級(jí)別修修改任務(wù)運(yùn)行行過(guò)程中中,用戶戶可以根根據(jù)需要要來(lái)改變變?nèi)蝿?wù)的的優(yōu)先級(jí)級(jí)別。調(diào)調(diào)用的函函數(shù)原型型如下:INT8UOSTaskChangePrio(INT8Uoldprio;/任務(wù)務(wù)現(xiàn)在的的優(yōu)先級(jí)級(jí)別INT8Unewprio/要要修改的的優(yōu)先級(jí)級(jí)別)查詢?nèi)蝿?wù)務(wù)的信息息查詢一些些任務(wù)中中的信息息,函數(shù)數(shù)原型如如下:INT8UOSTaskQuery(INT8Uprio;OS_TCB*pdata)3、任務(wù)務(wù)間同步步與通信信的管理理C/OS-II中,使用信信號(hào)量、郵箱(消息郵郵箱)和

30、和消息隊(duì)隊(duì)列來(lái)實(shí)實(shí)現(xiàn)任務(wù)務(wù)相互同同步或相相互之間間的通信信。C/OS-II把關(guān)關(guān)于它們們的操作作都定義義為全局局函數(shù),以供應(yīng)應(yīng)用程序序的所有有任務(wù)來(lái)來(lái)調(diào)用.等待任務(wù)務(wù)列表采用INT8U類型的的數(shù)組OSEventTbl作為記錄錄等待事事件任務(wù)務(wù)的記錄錄表,叫叫做等待待任務(wù)表表,每個(gè)個(gè)任務(wù)占占1位,為1表表示是等等待任務(wù)務(wù)。任務(wù)的等等待時(shí)限限,記錄錄在等待待任務(wù)的的任務(wù)控控制塊TCB的的成員OSTCBDly中(1)事事件控制制塊C/OS-II使用用叫做事事件控制制塊ECB的數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu)來(lái)描述述諸如信信號(hào)量、郵箱和和消息隊(duì)隊(duì)列這些些事件。事件控控制塊包包含包括括等待任任務(wù)表在在內(nèi)的所所有有關(guān)關(guān)事件的

31、的數(shù)據(jù)。操作事件件控制塊塊的函數(shù)數(shù)C/OS-II有4個(gè)對(duì)事事件控制制塊進(jìn)行行基本操操作的函函數(shù)(定定義在OS_CORE.C中中)。事件控制制塊的初初始化函函數(shù)void OS_EventWaitListInit(OS_ENENT *pevent )把變量OSEventGrp及任務(wù)務(wù)等待表表中的每每一位都都清0,即令事事件的任任務(wù)等待待表中不不含有任任何等待待任務(wù)。該函數(shù)數(shù)被OSXXXCreate()創(chuàng)創(chuàng)建時(shí)所所調(diào)用。XXXSem信信號(hào)號(hào)量Mutex互互斥信信號(hào)量Mbox消消息郵郵箱Q消消息隊(duì)隊(duì)列使一個(gè)任任務(wù)進(jìn)入入等待狀狀態(tài)的函函數(shù)void OS_EventTaskWait( OS_ENENT *

32、pevent)將在任務(wù)務(wù)調(diào)用函函數(shù)OSXXXPend()請(qǐng)求一一個(gè)事件件時(shí)調(diào)用用。使一個(gè)正正在等待待任務(wù)進(jìn)進(jìn)入就緒緒狀態(tài)的的函數(shù)INT8UOS_EventTaskRdy( OS_EVENT *pevent,void*msg,INT8Umsk)作用:把把調(diào)用這這個(gè)函數(shù)數(shù)的任務(wù)務(wù)在任務(wù)務(wù)等待表表中的位位置清0后,再再把任務(wù)務(wù)在任務(wù)務(wù)就緒表表中的對(duì)對(duì)應(yīng)的位位置1,然后引引發(fā)一次次任務(wù)調(diào)調(diào)度將在任務(wù)務(wù)調(diào)用函函數(shù)OSXXXPost()發(fā)送一一個(gè)事件件時(shí),被被調(diào)用。使一個(gè)等等待超時(shí)時(shí)的任務(wù)務(wù)僅需就就緒狀態(tài)態(tài)的函數(shù)數(shù)void OS_EventTo(OS_EVENT*pevent)作用:當(dāng)當(dāng)任務(wù)已已經(jīng)超過(guò)過(guò)了

33、等待待的時(shí)間間,卻要要使它進(jìn)進(jìn)入就緒緒狀態(tài)。將在任務(wù)務(wù)調(diào)用函函數(shù)OSXXXPend()請(qǐng)求一一個(gè)事件件時(shí),被被調(diào)用。(2)信信號(hào)量管管理使用信號(hào)號(hào)量可以以在任務(wù)務(wù)間傳遞遞信息,實(shí)現(xiàn)任任務(wù)與任任務(wù)或中中斷服務(wù)務(wù)子程序序的同步步。C/OS-II中的的信號(hào)量量由兩部部分組成成:16位的無(wú)無(wú)符號(hào)整整數(shù)信號(hào)號(hào)量的計(jì)計(jì)數(shù)值(065535);另一部部分是由由等待該該信號(hào)量量的任務(wù)務(wù)組成的的等待任任務(wù)列表表。C/OS-II提供供了以下下6個(gè)函函數(shù)對(duì)信信號(hào)量進(jìn)進(jìn)行操作作。操作創(chuàng)建信號(hào)號(hào)量OSSemCreat(INT16U cnt)創(chuàng)創(chuàng)建,返返回已創(chuàng)創(chuàng)建信號(hào)號(hào)量的指指針。請(qǐng)求信號(hào)號(hào)量OSSemPend(OS_EV

34、ENT*pevent,INT16Utimeout,NT8U*err)time為0,則表示示無(wú)限等等待。不等待調(diào)調(diào)用的函函數(shù)為OSSemAccept(OS_EVENT* pevent)。發(fā)送信號(hào)號(hào)量INT8UOSSemPost(OS_EVENT*pevent)當(dāng)獲得信信號(hào)量,訪問(wèn)共共享資源源結(jié)束以以后,釋釋放信號(hào)號(hào)量,調(diào)調(diào)用該函函數(shù)。先先檢查是是否有等等待該信信號(hào)量的的任務(wù)。沒(méi)有,信號(hào)量量計(jì)數(shù)器器加1,有,則則調(diào)用調(diào)調(diào)度器OS_Sched()。刪除信號(hào)號(hào)量OS_EVENT*OSSemDel( OS_EVENT *pevent,INT8Uopt, INT8U *err)optOS_DEL_NO_P

35、END沒(méi)沒(méi)有等等待任務(wù)務(wù)刪除OS_DEL_ALLWAYS立立即刪刪除只能任務(wù)務(wù)執(zhí)行,不能在在中斷服服務(wù)程序序中刪除除查詢信號(hào)號(hào)量的狀狀態(tài)INT8UOSSemQuery(OS_EVENT* pevent,OS_SEM_DATA *pdata)pdata是一一個(gè)結(jié)構(gòu)構(gòu)指針,存儲(chǔ)信信號(hào)量的的狀態(tài)。(3)消消息郵箱箱管理消息郵箱箱是C/OS-II中的一一種通信信機(jī)制,通常使使用時(shí)要要先定義義一個(gè)指指針型的的變量該該指針指指向一個(gè)個(gè)包含了了消息內(nèi)內(nèi)容的特特定數(shù)據(jù)據(jù)結(jié)構(gòu)。發(fā)送消消息的任任務(wù)或中中斷服務(wù)務(wù)子程序序把這個(gè)個(gè)變量送送往郵箱箱,接收收消息的的任務(wù)從從郵箱中中取出該該指針變變量,完完成信息息交換。

36、C/OS-II提供6種對(duì)消消息郵箱箱的操作作,它們們通過(guò)以以下函數(shù)數(shù)實(shí)現(xiàn):創(chuàng)建OS_EVENT* OSMoxCreate(void *msg)Msg為為消息指指針,一一般初始始為NuLL。向消息郵郵箱發(fā)送送消息INT8UOSMboxPost(OS_EVENT *pevent,void *msg)發(fā)送廣播播消息INT8UOSMboxPostOpt(OS_EVENT *pevent,void*msg, INT8U opt)opt: OS_POST_OPT_BROADCAST廣廣播消息息OS_POST_OPT_NONE最最高優(yōu)先先級(jí)請(qǐng)求消息息郵箱void *OSMboxPend(OS_EVENT*

37、pevent,INT16Utimeout,INT8U*err)查詢郵箱箱狀態(tài)INT8UOSMboxQuery(OS_EVENT*pevent, OS_MBOX_DATA*pdata)刪除郵箱箱OS_EVENT*OSMboxDel(OS_EVENT* pevent,INT8Uopt, INT8U *err)(4)消消息隊(duì)列列管理消息隊(duì)列列是C/OS-II的另一一種通信信機(jī)制,它可以以使一個(gè)個(gè)任務(wù)或或中斷服服務(wù)子程程序向另另一個(gè)任任務(wù)發(fā)送送以指針針定義的的變量。 C/OS-II提供了了9個(gè)對(duì)對(duì)消息隊(duì)隊(duì)列進(jìn)行行操作的的函數(shù)。創(chuàng)建先創(chuàng)建一一個(gè)指針針數(shù)組,然后用用該數(shù)組組來(lái)創(chuàng)建建消息隊(duì)隊(duì)列OS_EVEN

38、TOSQCreate( void*start,INT16U size)請(qǐng)求消息息隊(duì)列void*OSQPend(OS_EVENT *pevent,INT16Utimeout,INT8U*err)向消息隊(duì)隊(duì)列發(fā)送送消息INT8UOSQPost(OS_EVENT *pevent,void*msg)工作方式式FIFOINT8UOSQPostFront(OS_EVENT*pevent,void* msg)工作方式式LIFO發(fā)送廣播播消息INT8UOSQPostOpt(OS_EVENT *pevent,void*msg,INT8Uopt)清空消息息隊(duì)列INT8UOSQFlsh( OS_EVENT *pev

39、ent )刪除消息息隊(duì)列OS_EVENT* OSQDel(OS_EVENT*pevent)查詢消息息隊(duì)列INT8UOSQQuery(OS_EVENT*pevent,OS_Q_DATA*pdata)COS-II操作作系統(tǒng)的的文件體體系結(jié)構(gòu)構(gòu)如圖2所示,其核心心主要可可分為以以下3部部分:(1)應(yīng)應(yīng)用軟件件層,指指的是基基于COS-II的應(yīng)用用程序代代碼。(2)內(nèi)內(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í)實(shí)

40、現(xiàn)的功功能分別別是核心心管理、事件管管理、存存儲(chǔ)管理理、消息息隊(duì)列管管理、定定時(shí)管理理、信號(hào)號(hào)量處理理、消息息管理和和任務(wù)調(diào)調(diào)度等,這部分分代碼與與處理器器無(wú)關(guān)。(3)系系統(tǒng)設(shè)置置與移植植層。系系統(tǒng)設(shè)置置部分的的代碼由由兩個(gè)頭頭文件OS_CFG.H和INCLDES.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è)設(shè)置與移移植層與與具體應(yīng)應(yīng)用和處處理器相相關(guān),在在隨后的的COS-II的的

41、移植和和開(kāi)發(fā)過(guò)過(guò)程中,用戶所所需要關(guān)關(guān)注的就就是這部部分文件件。4、COS-II操作系系統(tǒng)的文文件系統(tǒng)統(tǒng)圖2COS-II文文件體系系結(jié)構(gòu)6.1.4COS-II操操作系統(tǒng)統(tǒng)的初始始化在調(diào)用COS-II操作作系統(tǒng)的的其他服服務(wù)之前前,COS-II操作系系統(tǒng)要求求用戶首首先調(diào)用用系統(tǒng)初初始化函函數(shù)OSInit()。執(zhí)行行OSInit()函函數(shù)后將將初始化化COS-II所所有的變變量和數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu),另外外OSInit()會(huì)會(huì)建立空空閑任務(wù)務(wù),并且且這個(gè)任任務(wù)總是是處于就就緒狀態(tài)態(tài)的??湛臻e任務(wù)務(wù)OSTaskldle()函數(shù)的的優(yōu)先級(jí)級(jí)總是設(shè)設(shè)置成為為最低級(jí)級(jí)別,即即OS_LOWEST_PRIO。多任務(wù)

42、的的啟動(dòng)是是用戶通通過(guò)調(diào)用用OSStart()函數(shù)來(lái)來(lái)實(shí)現(xiàn)的的。然而而,在啟啟動(dòng)COS-II之前,用戶至至少要建建立一個(gè)個(gè)應(yīng)用任任務(wù),例例如:void main()OSInit();.通過(guò)OSTaskCreate()或OSTaskCreateExt()創(chuàng)建至至少一個(gè)個(gè)任務(wù).OSStart();/*開(kāi)始始多任務(wù)務(wù)調(diào)度,OSStart()永遠(yuǎn)都都不會(huì)返返回*/1.C/OS II基礎(chǔ)2.C/OS II移植3.嵌入入式系統(tǒng)統(tǒng)的初始始化操作作第六章C/OSII程程序設(shè)計(jì)計(jì)基礎(chǔ)6.2COS-II系系統(tǒng)在ARM系系統(tǒng)中的的移植所謂移植植,就是是指使一一個(gè)實(shí)時(shí)時(shí)操作系系統(tǒng)能夠夠在其他他的微處處理器平平臺(tái)上進(jìn)進(jìn)

43、行運(yùn)行行。由于于COS-II的的主要代代碼都是是由標(biāo)準(zhǔn)準(zhǔn)的C語(yǔ)語(yǔ)言寫(xiě)成成的,所所以,一一般來(lái)說(shuō)說(shuō)移植過(guò)過(guò)程并不不復(fù)雜。6.2.1COS-II移植植條件雖然COS-II的大部部分源代代碼是用用C語(yǔ)言言寫(xiě)成的的,但是是,仍需需要用匯匯編語(yǔ)言言完成一一些與微微處理器器相關(guān)的的代碼。例如,COS-II在在讀寫(xiě)微微處理器器、寄存存器時(shí)只只能通過(guò)過(guò)匯編語(yǔ)語(yǔ)言來(lái)實(shí)實(shí)現(xiàn)。這這是因?yàn)闉镃OS-II在在設(shè)計(jì)的的時(shí)候就就已經(jīng)充充分考慮慮了可移移植性。為了要要使COS-II可以正正常工作作,處理理器必須須要滿足足如下要要求:1)微微處理器器的C編編譯器能能產(chǎn)生可可重入代代碼可重入的的代碼指指的是一一段代碼碼(如一一個(gè)

44、函數(shù)數(shù))可以以被多個(gè)個(gè)任務(wù)同同時(shí)調(diào)用用,而不不必?fù)?dān)心心會(huì)破壞壞其內(nèi)部部的數(shù)據(jù)據(jù)。也就就是說(shuō),可重入入型函數(shù)數(shù)在任何何時(shí)候都都可以被被中斷執(zhí)執(zhí)行,也也不會(huì)因因?yàn)樵诤瘮?shù)中斷斷的時(shí)候候被其他他的任務(wù)務(wù)重新調(diào)調(diào)用,影影響函數(shù)數(shù)中的數(shù)數(shù)據(jù)??煽芍厝氪a或者者只使用用局部變變量,即即變量保保存在CPU寄寄存器中中或堆棧棧中;或或者使用用全局變變量,則則要對(duì)全全局變量量予以保保護(hù)。通常的C編譯器器,把局部變量量分配在棧棧中。所所以,多多次調(diào)用用同一個(gè)個(gè)函數(shù),可以保保證每次次的局部部變量互互不受影影響。而而全局變量量,在多次次調(diào)用函函數(shù)的時(shí)時(shí)候,必必然受到到影響。代碼的可可重入性性是保證證完成多多任務(wù)的的

45、基礎(chǔ),除了在在C程序序中使用用局部變變量以外外,還需需要C編編譯器的的支持?;贏RM的的SDT、ADS等集集成開(kāi)發(fā)發(fā)環(huán)境,都可以以生成可可重入的的代碼。2)在在程序中中可以使使用c語(yǔ)語(yǔ)言打開(kāi)開(kāi)或者關(guān)關(guān)閉中斷斷在COS-II中中,可以以通過(guò)進(jìn)進(jìn)入中斷斷屏蔽的的宏定義義OS_ENTER_CRITICAL()或者者退出中中斷屏蔽蔽的宏定定義OS EXIT_CRITICAL()來(lái)控控制系統(tǒng)統(tǒng)關(guān)閉中中斷或者者打開(kāi)中中斷,這這需要微微處理器器的支持持。在目目前的ARM系系列的微微處理器器上,都都可以設(shè)設(shè)置相應(yīng)應(yīng)的寄存存器來(lái)關(guān)關(guān)閉或者者打開(kāi)系系統(tǒng)的所所有中斷斷。3)微微處理器器支持中中斷,并并且能產(chǎn)產(chǎn)生定

46、時(shí)時(shí)中斷(通常在在10Hz-1000Hz之之間)。COS-II是是通過(guò)微微處理器器產(chǎn)生定定時(shí)的中中斷來(lái)實(shí)實(shí)現(xiàn)多任任務(wù)之間間的調(diào)度度的。4)微微處理器器支持能能夠容納納一定量量數(shù)據(jù)的的硬件堆堆棧,并并具有將將堆棧指指針和其其他CPU寄存存器讀寫(xiě)寫(xiě)到堆棧棧(或者者內(nèi)存)的指令令。5)COS-II進(jìn)行行任務(wù)調(diào)調(diào)度的時(shí)時(shí)候,會(huì)會(huì)把當(dāng)前前任務(wù)的的CPU內(nèi)部寄寄存器的的內(nèi)容存存放到此此任務(wù)的的堆棧中中。然后后,再?gòu)膹牧硪粋€(gè)個(gè)任務(wù)的的堆棧中中恢復(fù)原原來(lái)的工工作寄存存器,繼繼續(xù)運(yùn)行行另一個(gè)個(gè)任務(wù)。所以,寄存器器中內(nèi)容容的入棧棧和出棧棧是COS-II多任務(wù)務(wù)調(diào)度的的基礎(chǔ)。6.2.2COS-II的移移植步驟驟在的

47、移植植過(guò)程中中,使用用的是基基于ARM公司司架構(gòu)的的軟件開(kāi)開(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ù)類類型#define INT8Uunsignedchar#define INTl6Uunsignedshort#define INT32Uunsignedlong#define OS_STKunsignedlong#define BO

48、OLEANint#define OS_CPU_SRunsignedlong#define INT8Schar因?yàn)椴煌奈⑻幪幚砥饔杏胁煌牡淖珠L(zhǎng),所以COS-的移植植包括了了一系列列的類型型定義以以確保其其可移植植性。用戶必須須將任務(wù)務(wù)堆棧的的數(shù)據(jù)類類型定義義到COS-II操作系系統(tǒng)中,這個(gè)過(guò)過(guò)程是通通過(guò)為OS_STK聲聲明正確確的C語(yǔ)語(yǔ)言數(shù)據(jù)據(jù)類型來(lái)來(lái)完成的的。由于于使用的的微處理理器上的的堆棧成成員是16位的的,所以以將OS_TSK聲明明為無(wú)符符號(hào)整形形數(shù)據(jù)類類型。值值得注意意的是,所有的的任務(wù)堆堆棧都必必須使用用OS_STK聲明數(shù)數(shù)據(jù)類型型。(2)進(jìn)進(jìn)入中斷斷屏蔽的的宏定義義OS_EN

49、TER_CRITICAL()和退退出中斷斷屏蔽的的宏定義義OS_EXIT_CRITICAL()externintINTS_OFF(void);externvoidINTS_ON(void);#define OS_ENTER_CRITICAL()CPU_sr= INTS_OFF();#define OS_EXIT_CRITICAL()if(CPU_sr=0)INTS_ON();與所有的的實(shí)時(shí)內(nèi)內(nèi)核一樣樣,COS-II操作系系統(tǒng)在進(jìn)進(jìn)行任務(wù)務(wù)切換時(shí)時(shí)需要先先禁止中中斷在訪訪問(wèn)代碼碼的臨界界區(qū),并并且在訪訪問(wèn)完畢畢后重新新允許中中斷。這這就使得得COS-II能能夠保護(hù)護(hù)臨界區(qū)區(qū)代碼免免受多任任務(wù)或中

50、中斷服務(wù)務(wù)例程(ISR)的破破壞。在在S3C44B0微處處理器上上是通過(guò)過(guò)OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()兩兩個(gè)函數(shù)數(shù)來(lái)實(shí)現(xiàn)現(xiàn)開(kāi)、關(guān)關(guān)中斷的的。(3)棧棧增長(zhǎng)方方向標(biāo)OS_STK_GROWTH#define OS_STK_GROWTH1#define STACKSIZE256絕大多數(shù)數(shù)的微處處理器的的堆棧是是從高地地址向低低地址增增長(zhǎng)的,但是有有些微處處理器是是采用相相反方式式工作的的。鑒于于這種情情況COS-II操作系系統(tǒng)被設(shè)設(shè)計(jì)成為為這兩種種情況都都可以處處理,只只要在結(jié)結(jié)構(gòu)常量量OS_STK_GROWTH中指指定堆棧棧的生長(zhǎng)長(zhǎng)方式就就可以了了。

51、例如如:設(shè)OS_STK_GROWTH為0表示堆堆棧從下下往上增增長(zhǎng)。設(shè)OS_STK_GROWTH為1表示堆堆棧從上上往下增增長(zhǎng)。2.用用匯編語(yǔ)語(yǔ)言在OS_CPU_A.ASM文文件中編編寫(xiě)4個(gè)個(gè)與微處處理器相相關(guān)的函函數(shù)(1)調(diào)調(diào)用用優(yōu)先級(jí)級(jí)最高的的就緒任任務(wù)函數(shù)數(shù) OSStartHighRdy()(2)任任務(wù)級(jí)的的任務(wù)切切換函數(shù)數(shù) OSCtxSw()(3)中中斷級(jí)的的任務(wù)切切換函數(shù)數(shù) OSIntCtxSw()(4)時(shí)時(shí)鐘節(jié)拍拍中斷服服務(wù)函數(shù)數(shù) OSTickISR()3用C語(yǔ)言編編寫(xiě)6個(gè)個(gè)操作系系統(tǒng)相關(guān)關(guān)的函數(shù)數(shù)(OS_CPU_C.C)這里主要要涉及6個(gè)函數(shù)數(shù):OSTaskStkInit()、O

52、STaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()及及OSTimeTickHook()。這些函數(shù)數(shù)中,惟惟一必須須移植的的是任務(wù)務(wù)堆棧初初始化函函數(shù)OSTaskStkInit()。這這個(gè)函數(shù)數(shù)在任務(wù)務(wù)創(chuàng)建時(shí)時(shí)被調(diào)用用,負(fù)責(zé)責(zé)初始化化任務(wù)的的堆棧結(jié)結(jié)構(gòu)并返返回新堆堆棧的指指針stk。在在ARM體系結(jié)結(jié)構(gòu)下,任務(wù)堆堆??臻g間由高至至低依次次保存著著PC、LR、R12、R11、R10、R1、R0、CPSR及SPSR。堆棧棧初始化化工作結(jié)結(jié)束后,返回新新的堆棧棧棧頂指指針。以下5個(gè)個(gè)Hook函數(shù)數(shù),又稱稱為鉤子子函數(shù),主要

53、用用來(lái)擴(kuò)展展COS-功能能,使用用前必須須被聲明明,但并并不一定定要包含含任何代代碼。(1)0STaskCreateHook()函數(shù)數(shù)當(dāng)用OSTaskCreate()函數(shù)或或OSTaskCreateExt()函函數(shù)建立立任務(wù)時(shí)時(shí),就會(huì)會(huì)調(diào)用OSTaskCreateHook()函函數(shù)。COS-設(shè)置完完自己的的內(nèi)部結(jié)結(jié)構(gòu)后,會(huì)在調(diào)調(diào)用任務(wù)務(wù)調(diào)度程程序之前前調(diào)用OSTaskCreateHook()函函數(shù)。該該函數(shù)被被調(diào)用時(shí)時(shí)中斷是是禁止的的,因此此應(yīng)盡量量減少該該函數(shù)中中的代碼碼,以縮縮短中斷斷的響應(yīng)應(yīng)時(shí)問(wèn)。(2)OSTaskDelHook()函數(shù)數(shù)當(dāng)任務(wù)被被刪除時(shí)時(shí),就會(huì)會(huì)調(diào)用OSTaskDelH

54、ook()函函數(shù)。該該函數(shù)在在把任務(wù)務(wù)從COS-的的內(nèi)部任任務(wù)鏈表表中解開(kāi)開(kāi)之前被被調(diào)用。當(dāng)OSTaskDelHook()函數(shù)數(shù)被調(diào)用用時(shí),會(huì)會(huì)收到指指向正被被刪除任任務(wù)的OS_TCB的的指針,這樣它它就可訪訪問(wèn)所有有的結(jié)構(gòu)構(gòu)成員了了。OSTaskDelHook()函數(shù)數(shù)可用來(lái)來(lái)檢驗(yàn)TCB擴(kuò)擴(kuò)展是否否被建立立了(一一個(gè)非空空指針),并進(jìn)進(jìn)行一些些清除操操作。注注意,此此函數(shù)不不返回任任何值。(3)OSTaskSwHook()函數(shù)當(dāng)發(fā)生任任務(wù)切換換時(shí),調(diào)調(diào)用OSTaskSwHook()函數(shù)。不管任任務(wù)切換換是通過(guò)過(guò)OSCtxSw()函數(shù),還是通通過(guò)OSIntCtxSw()函數(shù)數(shù)來(lái)執(zhí)行行的,都都會(huì)

55、調(diào)用用該函數(shù)數(shù)。OSTaskSwHook()函數(shù)可可直接訪訪問(wèn)OSTCBCr和OSTCBHighRdy,這這是因?yàn)闉樗鼈兌级际侨志肿兞?。OSTCBCr指指向被切切換出去去的任務(wù)務(wù)的OS_TCB,而而OSTCBHighRdy指向新新任務(wù)的的OS_TCB。在調(diào)用OSTaskSwHook()函數(shù)數(shù)期間,中斷一一直是被被禁止的的。這時(shí)時(shí)因?yàn)榇a的多多少會(huì)影影響到中中斷的響響應(yīng)時(shí)間間,所以以應(yīng)盡量量使代碼碼簡(jiǎn)化。此函數(shù)數(shù)沒(méi)有任任何參數(shù)數(shù),也不不返回任任何值。(4)OSTaskStatHook()函函數(shù)OSTaskStatHook()函數(shù)每每秒都會(huì)會(huì)被OSTaskStat()函數(shù)數(shù)調(diào)用一一次,可可用O

56、STaskStatHook()函函數(shù)來(lái)擴(kuò)擴(kuò)展統(tǒng)計(jì)計(jì)功能。該函數(shù)數(shù)沒(méi)有任任何參數(shù)數(shù),也不不返回任任何值。(5)OSTimeTickHook()函函數(shù)OSTimeTickHook()函數(shù)在在每個(gè)時(shí)時(shí)鐘節(jié)拍拍都會(huì)被被0STimeTick()函數(shù)調(diào)調(diào)用。實(shí)實(shí)際上,OSTimeTickHook()函數(shù)數(shù)是在節(jié)節(jié)拍被COS-處理,并在通通知用戶戶的移植植實(shí)例或或應(yīng)用程程序之前前被調(diào)用用的。OSTimeTickHook()函數(shù)沒(méi)沒(méi)有任何何參數(shù),也不返返回任何何值。1.C/OS II基礎(chǔ)2.C/OS II移植3.嵌入入式系統(tǒng)統(tǒng)的初始始化操作作第六章C/OSII程程序設(shè)計(jì)計(jì)基礎(chǔ)6.2.3C/OS-IIBSP編寫(xiě)

57、BSP(板級(jí)支支持包)是介于于底層硬硬件和操操作系統(tǒng)統(tǒng)之間的的軟件層層次,它它完成系系統(tǒng)上電電后最初初的硬件件和軟件件初始化化,并對(duì)對(duì)底層硬硬件進(jìn)行行封裝,使得操操作系統(tǒng)統(tǒng)不再面面對(duì)具體體的操作作。BSP的的特點(diǎn):硬件相關(guān)關(guān)性:因因?yàn)榍度肴胧綄?shí)時(shí)時(shí)系統(tǒng)的的硬件環(huán)環(huán)境具有有應(yīng)用相相關(guān)性,所以,作為高高層軟件件與硬件件之間的的接口,BSP必須為為操作系系統(tǒng)提供供操作和和控制具具體硬件件的方法法。操作系統(tǒng)統(tǒng)相關(guān)性性:不同同的操作作系統(tǒng)具具有各自自的軟件件層次結(jié)結(jié)構(gòu),因因此,不不同的操操作系統(tǒng)統(tǒng)具有特特定的硬硬件接口口形式。嵌入式系系統(tǒng)初始始化過(guò)程程及BSP功能能初始化程程序的下下載執(zhí)行行目標(biāo)機(jī)宿主機(jī)

58、1)通過(guò)過(guò)編程器器將可執(zhí)執(zhí)行目標(biāo)標(biāo)文件燒燒寫(xiě)到BootROM(ROM、EPROM、FLASH)等等;2)通過(guò)過(guò)串行口口和網(wǎng)口口下載執(zhí)執(zhí)行目標(biāo)標(biāo)文件,要求宿宿主機(jī)系系統(tǒng)上有有數(shù)據(jù)傳傳輸工具具程序、目標(biāo)機(jī)機(jī)裝載器器、嵌入入式監(jiān)視視器或目目標(biāo)機(jī)系系統(tǒng)上的的調(diào)試代代理。3)通過(guò)過(guò)JTAG或BDM接接口下載載;嵌入式系系統(tǒng)的初初始化過(guò)過(guò)程嵌入式系系統(tǒng)的初初始化過(guò)過(guò)程硬件初始始化階段段1、復(fù)位位向量 ENTRYb ResetHandler;fordebugb Handlerundef;handlerundefb HandlerSWI;SWIinterrupthandlerb HandlerPabort;h

59、andlerPAbortb HandlerDabort;handlerDAbortb;handlerReservedb HandlerIRQb HandlerFIQ嵌入式系系統(tǒng)的初初始化過(guò)過(guò)程(2)硬件初始始化階段段2、最小小硬件初初始化1)設(shè)置置適當(dāng)?shù)牡募拇嫫髌?,使嵌嵌入式處處理器處處于一個(gè)個(gè)已知的的狀態(tài):獲得CPU的類類型;獲得或設(shè)設(shè)置CPU的時(shí)時(shí)鐘頻率率。2)禁止止中斷和和高速緩緩存3)初始始化內(nèi)存存控制器器、內(nèi)存存芯片和和高速緩緩存單元元,包括括:得到內(nèi)存存的開(kāi)始始地址;得到內(nèi)存存的大小小;如果有要要求,則則還需要要進(jìn)行主主存測(cè)試試;嵌入式系系統(tǒng)的初初始化過(guò)過(guò)程(3)硬件初始始化階段段

60、3、其余余硬件初初始化1)引導(dǎo)導(dǎo)代碼調(diào)調(diào)用合適適的函數(shù)數(shù)對(duì)目標(biāo)標(biāo)機(jī)系統(tǒng)統(tǒng)上的全全部硬件件部件進(jìn)進(jìn)行初始始化,包包括:建立執(zhí)行行處理程程序初始化中中斷處理理程序初始化總總線接口口初始化板板級(jí)外設(shè)設(shè)得到內(nèi)內(nèi)存的開(kāi)開(kāi)始地址址;嵌入式系系統(tǒng)的初初始化過(guò)過(guò)程(4)RTOS初始化化階段4、RTOS初初始化1)RTOS初初始化2)RTOS對(duì)對(duì)象和服服務(wù)初始始化任務(wù)信號(hào)量定時(shí)器中斷內(nèi)存管理理3)RTOS任任務(wù)堆棧棧初始化化4)RTOS擴(kuò)擴(kuò)展部件件初始化化5)啟動(dòng)動(dòng)RTOSARM7TDMI系統(tǒng)統(tǒng)初始化化的一般般過(guò)程啟動(dòng)(系系統(tǒng)上電電/復(fù)位位)從程序入入口點(diǎn)關(guān)閉中斷斷初始化時(shí)時(shí)鐘等硬硬件相關(guān)關(guān)寄存器器初始化存存儲(chǔ)

溫馨提示

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