ARM體系結(jié)構(gòu)與編程-第六章課件_第1頁
ARM體系結(jié)構(gòu)與編程-第六章課件_第2頁
ARM體系結(jié)構(gòu)與編程-第六章課件_第3頁
ARM體系結(jié)構(gòu)與編程-第六章課件_第4頁
ARM體系結(jié)構(gòu)與編程-第六章課件_第5頁
已閱讀5頁,還剩171頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1.μC/OSII基礎(chǔ)2.μC/OSII移植3.嵌入式系統(tǒng)的初始化操作第六章μC/OSII程序設(shè)計基礎(chǔ)1.μC/OSII基礎(chǔ)第六章μC/OSII程序設(shè)計基礎(chǔ)1RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺BSPKERNELFSTCP/IP設(shè)備驅(qū)動設(shè)備I/O調(diào)試工具其它組件應(yīng)用RTOSC/C++RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺BSPKERNEL2C/OS簡介

C/OS簡介

3μC/OS-II意為“微控制器操作系統(tǒng)版本2”。世界上已有數(shù)千人在各個領(lǐng)域使用μC/OS,例如,照相機(jī)行業(yè)、醫(yī)療器械、音響設(shè)施、發(fā)動機(jī)控制、網(wǎng)絡(luò)設(shè)備、高速公路電話系統(tǒng)、自動提款機(jī)、工業(yè)機(jī)器人等等。很多高等院校將μC/OS用于實時系統(tǒng)教學(xué)。μC/OS-II意為“微控制器操作系統(tǒng)版本2”。世界上已有數(shù)4μC/OS-II圖籍描述了μC/OS-II內(nèi)部的工作原理隨書的CD中包含了源代碼工業(yè)界最清晰的源代碼除英文版外,有中文和韓文版ChineseKoreanEnglishISBN1-57820-103-9美國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-Ⅱ是一個免費(fèi)的、源代碼公開的實時嵌入式內(nèi)核,其內(nèi)核提供了實時系統(tǒng)所需要的一些基本功能。其中包含全部功能的核心部分代碼占用8.3KB,全部的源代碼約5500行,結(jié)構(gòu)合理、清晰易懂,且注解詳盡,非常適合初學(xué)者進(jìn)行學(xué)習(xí)分析。μC/OS-Ⅱ不僅使用戶得到廉價的解決方案,而且由于μC/OS-Ⅱ的開放源代碼特性,還使用戶可針對自己的硬件優(yōu)化代碼,獲得更好的性能。μC/OS-Ⅱ是在PC機(jī)上開發(fā)的,C編輯器使用的是BorlandC/C++3.1版。從早期使用的μCOS到現(xiàn)在的μC/OS-ⅡV2.52版,應(yīng)用的實例也進(jìn)一步說明了該內(nèi)核的實用性和可靠性。6.1C/OS-II系統(tǒng)的特點(diǎn)及結(jié)構(gòu)

μC/OS-Ⅱ是一個免費(fèi)的、源代碼公開的實時嵌入式內(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è)計的操作系統(tǒng),只要具備有合適的軟硬件工具,就可將μC/OS-Ⅱ嵌入到產(chǎn)品中去,從而成為產(chǎn)品的一部分。4.可裁剪(Scalable),μC/OS-Ⅱ可根據(jù)實際用戶的應(yīng)用需要使用條件編譯來完成對操作系統(tǒng)的裁剪,這樣就可以減少μC/OS-Ⅱ?qū)Υa空間和數(shù)據(jù)空間的占用。5.可剝奪型(Preemptive),μC/OS-Ⅱ是完全可剝奪型的實時內(nèi)核,運(yùn)行就緒條件下優(yōu)先級最高的任務(wù)。6.多任務(wù),μC/OS-Ⅱ可管理64個任務(wù)。一般情況下,建議用戶保留8個任務(wù)給μC/OS-Ⅱ。這樣,留給用戶應(yīng)用程序的任務(wù)最多可有56個。系統(tǒng)賦給每個任務(wù)的優(yōu)先級必須不同,這意味著μC/OS-Ⅱ不支持時間片輪轉(zhuǎn)調(diào)度法(Round-robinScheduling)。7.可確定性,絕大多數(shù)μC/OS-Ⅱ的函數(shù)調(diào)用和服務(wù)的執(zhí)行時間具有確定性。在任何時候用戶都能知道μC/OS-Ⅱ的函數(shù)調(diào)用與服務(wù)的執(zhí)行時間。 3.可固化(ROMable),μC/OS-Ⅱ是為嵌入式應(yīng)用9

8.任務(wù)棧,μC/OS-Ⅱ的每個任務(wù)都有自己單獨(dú)的棧和??臻g。使用μC/OS-Ⅱ的??臻g校驗函數(shù)可確定每個任務(wù)到底需要多少??臻g。9.系統(tǒng)服務(wù),提供了例如信號量、互斥信號量、消息郵箱、事件標(biāo)志、數(shù)據(jù)隊列、塊大小固定的內(nèi)存的申請與釋放及時間管理函數(shù)等。10.中斷管理,中斷可使正在執(zhí)行的任務(wù)暫時掛起,如果優(yōu)先級更高的任務(wù)被中斷喚醒,則高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行。中斷嵌套層數(shù)可達(dá)255層。11.穩(wěn)定性與可靠性,2000年7月,μC/OS-Ⅱ在一個航空項目中得到了美國聯(lián)邦航空管理局對商用飛機(jī)的符合RTCADO--178B標(biāo)準(zhǔn)的認(rèn)證??梢哉f,μC/OS-Ⅱ的每一種功能、每一個函數(shù)及每一行代碼都經(jīng)過了考驗與測試。 8.任務(wù)棧,μC/OS-Ⅱ的每個任務(wù)都有自己單獨(dú)的棧和棧空10

6.1.2μC/OS-Ⅱ系統(tǒng)的內(nèi)核結(jié)構(gòu)

與其他操作系統(tǒng)不同,μC/OS-Ⅱ其實只有一個內(nèi)核,提供任務(wù)調(diào)度、任務(wù)間的通信與同步、任務(wù)管理、時間管理和內(nèi)存管理等基本功能。1)任務(wù)在μC/OS-Ⅱ中,一個任務(wù)通常是一個無限的循環(huán)。一個任務(wù)看起來像其他c語言的函數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變量,但任務(wù)是決不會返回的。故返回參數(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個任務(wù),其優(yōu)先級可以從0開始,優(yōu)先級號越低,其任務(wù)的優(yōu)先級就越高。但目前版本的μC/OS-II有兩個任務(wù)已經(jīng)被系統(tǒng)占用了,而且保留了優(yōu)先級0、1、2、3、和OS_LOWEST_PRIO-3、OS_LOWEST__PRIO-2、0S_LOWEST_PRIO-1以及OS_LOWEST_PRIO這8個任務(wù)已備將來使用。OS_LOWEST_PRIO是作為常數(shù)在OS_CFG.H文件中用定義常數(shù)語句#defineconstant來定義的。因此用戶可以使用多達(dá)56個應(yīng)用任務(wù),但首先要給每個任務(wù)賦以不同的優(yōu)先級。μC/OS-II總是運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)。目前版本的μC/OS-II中,任務(wù)的優(yōu)先級號就是任務(wù)編號(ID)。優(yōu)先級號(或任務(wù)的ID號)也可以被一些內(nèi)核服務(wù)函數(shù)調(diào)用,比如改變優(yōu)先級函數(shù)OSTaskChangePrio()或者OSTaskDel()。為了使μC/OS-II能管理用戶任務(wù),用戶必須在建立一個任務(wù)的時候,將任務(wù)的起始地址與其他參數(shù)一起傳給OSTaskCreate()或者OSTaskCreateExt()這兩個函數(shù)中的任何一個函數(shù)。 2)任務(wù)調(diào)度12在任一給定的時刻,任務(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)在任一給定的時刻,任務(wù)的狀態(tài)一定是以下五種狀態(tài)之一:μC/O13睡眠態(tài)(taskdormant)指任務(wù)駐留在程序空間(ROM或RAM),還沒有交給系統(tǒng)來管理的狀態(tài)任務(wù)交給系統(tǒng)通過調(diào)用以下函數(shù)之一來實現(xiàn):OSTaskCreate()OSTaskCreateExt()告知系統(tǒng):任務(wù)的起始地址任務(wù)建立時,用戶給任務(wù)賦予的優(yōu)先級任務(wù)要使用的??臻g大小等睡眠態(tài)(taskdormant)指任務(wù)駐留在程序空間(RO14就緒態(tài)(taskready)任務(wù)一旦創(chuàng)建就進(jìn)入就緒態(tài),準(zhǔn)備運(yùn)行任務(wù)的創(chuàng)建可以是在多任務(wù)開始之前,也可以動態(tài)地由一個運(yùn)行著的任務(wù)創(chuàng)建若剛創(chuàng)建任務(wù)的優(yōu)先級高于創(chuàng)建它的任務(wù)的優(yōu)先級,它將立即獲得cpu的使用權(quán)任務(wù)可通過OSTaskDel()返回睡眠態(tài);或調(diào)用該函數(shù)讓另一個任務(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)先級高于它的任務(wù)都轉(zhuǎn)為等待狀態(tài),或被刪除后,才能進(jìn)入運(yùn)行態(tài)任何時刻只有一個任務(wù)處于運(yùn)行態(tài)調(diào)用OSStart()可以啟動多任務(wù)。該函數(shù)只能在啟動時調(diào)用一次OSStart()運(yùn)行用戶初始化代碼中已經(jīng)建立的、進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)運(yùn)行態(tài)(taskrμnning)就緒的任務(wù)只有當(dāng)所有優(yōu)先級16等待狀態(tài)(taskwaiting)正在運(yùn)行的任務(wù)可以通過下面的調(diào)用進(jìn)入等待狀態(tài)。延遲時間到,立即強(qiáng)制執(zhí)行任務(wù)切換,讓下一個優(yōu)先級最高、并進(jìn)入就緒態(tài)的任務(wù)執(zhí)行。OSTimeDly()OSTimeDlyHMSM()等待時間過去后,系統(tǒng)服務(wù)(內(nèi)部)函數(shù)OSTimeTick()使延遲了的任務(wù)進(jìn)入就緒態(tài)用戶無需在應(yīng)用程序代碼中調(diào)用這個函數(shù)等待狀態(tài)(taskwaiting)正在運(yùn)行的任務(wù)可以通過下17等待狀態(tài)(續(xù))正在運(yùn)行的任務(wù)可能需要通過調(diào)用函數(shù)等待某一事件發(fā)生。如果該事件并未發(fā)生,任務(wù)就進(jìn)入等待狀態(tài)OSFlagPend();OSMμtexPend()OSSemPend();OSMboxPend()當(dāng)事件發(fā)生或等待超時,被掛起的任務(wù)就進(jìn)入就緒態(tài)等待狀態(tài)(續(xù))正在運(yùn)行的任務(wù)可能需要通過調(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ù)子程序可能會報告一個或多個事件的發(fā)生,而使一個或多個任務(wù)進(jìn)入就緒態(tài)上述情況下,從中斷服務(wù)子程序返回之前,C/OS–II

要判定:被中斷的任務(wù)是否還是就緒態(tài)任務(wù)中優(yōu)先級最高的如果中斷服務(wù)子程序使另一個優(yōu)先級更高的任務(wù)進(jìn)入了就緒態(tài),則新進(jìn)入就緒態(tài)的這個優(yōu)先級更高的任務(wù)將得以運(yùn)行;否則,原來被中斷了的任務(wù)將繼續(xù)運(yùn)行。中斷服務(wù)態(tài)(ISRrunning)中斷服務(wù)子程序可能會報告20任務(wù)狀態(tài)當(dāng)所有的任務(wù)都在等待時間發(fā)生或等待延遲時間結(jié)束時,C/OS–II執(zhí)行被稱為空閑任務(wù)(IdleTask)的內(nèi)部函數(shù),即:OSTaskIdle()任務(wù)狀態(tài)當(dāng)所有的任務(wù)都在等待時間發(fā)生或等待延遲時間結(jié)束時,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()兩個函數(shù)動態(tài)地分配和釋放內(nèi)存。為了消除多次動態(tài)分配與釋放內(nèi)存所引起的內(nèi)存碎片和分配、釋放函數(shù)執(zhí)行時間的不確定性的現(xiàn)象,μC/OS-Ⅱ把連續(xù)的大塊內(nèi)存按分區(qū)來進(jìn)行管理。每個分區(qū)中都包含若干個存儲容量大小相同的內(nèi)存塊,但不同分區(qū)之間的內(nèi)存塊容量大小是可以不同的。在需要動態(tài)分配內(nèi)存時,可選擇一個適當(dāng)?shù)姆謪^(qū),按塊來分配內(nèi)存。在釋放內(nèi)存時,將該塊放回它以前所屬的分區(qū)。這樣,就能有效解決內(nèi)存碎片問題。而且每次調(diào)用malloc()和free()分配和釋放的都是整數(shù)倍的固定內(nèi)存塊長,這樣執(zhí)行時間就是確定的了。 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)跟蹤每一個內(nèi)存分區(qū)系統(tǒng),每個分區(qū)都有屬于自己的內(nèi)存控制塊,系統(tǒng)是通過內(nèi)存控制塊數(shù)據(jù)結(jié)構(gòu)OS_MEM來管理內(nèi)存的。(2)內(nèi)存管理

內(nèi)存管理主要通過以下4個函數(shù)來實現(xiàn):①OSMemCreate()函數(shù),用于建立一個內(nèi)存分區(qū)。該函數(shù)共有4個參數(shù):內(nèi)存分區(qū)的起始地址、分區(qū)內(nèi)的內(nèi)存塊數(shù)、每個內(nèi)存塊的字節(jié)數(shù)和一個指向錯誤信息代碼的指針。②OSMemGet()函數(shù),用于分配一個內(nèi)存塊。當(dāng)調(diào)度某任務(wù)執(zhí)行時,必須先從已建立的內(nèi)存分區(qū)中為該任務(wù)申請一個內(nèi)存塊。③OSMemPut()函數(shù),釋放一個內(nèi)存塊。當(dāng)某一任務(wù)不再使用一個內(nèi)存塊時,必須及時地把它放回到相應(yīng)的內(nèi)存分區(qū)中,以便下一次的分配操作。④OSMemQuery()函數(shù),用于查詢一個特定內(nèi)存分區(qū)的狀態(tài)。如查詢某內(nèi)存分區(qū)中內(nèi)存塊的大小、可用內(nèi)存塊數(shù)和正在使用的內(nèi)存塊數(shù)等信息。 (1)內(nèi)存管理控制塊OS_MEM24

(3)時間管理與大部分內(nèi)核一樣,μC/OS-Ⅱ要求提供定時中斷,以實現(xiàn)延時與超時控制等功能。這個定時中斷也可以被叫作為時鐘節(jié)拍。時鐘節(jié)拍函數(shù)的作用是用于通知μC/OS-Ⅱ發(fā)生了時鐘節(jié)拍中斷,下面再介紹幾個可以處理時間問題的函數(shù)。①任務(wù)延時函數(shù)OSTimeDIy()調(diào)用該函數(shù)會使μC/OS-Ⅱ進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個優(yōu)先級最高的就緒態(tài)任務(wù)。任務(wù)調(diào)用OSTimeDly()后,一旦規(guī)定的時間期滿或者有其他任務(wù)通過調(diào)用OSTimeDlyResume()取消了延時,它就會立即進(jìn)入就緒狀態(tài)。只有當(dāng)該任務(wù)在所有就緒任務(wù)中具有最高的優(yōu)先級時,它才會立即運(yùn)行。②恢復(fù)延時的任務(wù)函數(shù)OSTimeDlyResume()μC/OS-II具有允許結(jié)束正處于延時期的任務(wù)的功能。具體方法是通過調(diào)用OSTimeDlyResume()和指定要恢復(fù)的任務(wù)的優(yōu)先級的方式,這樣延時的任務(wù)就可以不用等待延時期滿,而是通過其他任務(wù)取消延時來使自己處于就緒態(tài)。實際上,OSTimeDlyResume()也可喚醒正在等待事件的任務(wù)。 (3)時間管理25

③按時、分、秒、毫秒延時函數(shù)OSTimeDlyHMSM()OSTimeDly()是一個非常有用的函數(shù),但用戶的應(yīng)用程序須要知道延時時間所對應(yīng)的時鐘節(jié)拍的數(shù)目。增加了OSTimeDlyHMSM()函數(shù)后,就可按時、分、秒和毫秒來定義時間了,這樣會顯得更加方便。與OSTimeDly()一樣,調(diào)用OSTimeDIyHMSM()函數(shù)也會使μC/OS-II進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個優(yōu)先級最高的就緒態(tài)任務(wù)。任務(wù)調(diào)用OSTimeDlyHMSM()后,一旦規(guī)定的時間期滿或有其他任務(wù)通過調(diào)用OSTimeDlyResμme()取消了延時,它就會立即處于就緒態(tài)。同樣,只有當(dāng)該任務(wù)在所有就緒態(tài)任務(wù)中具有最高的優(yōu)先級時,它才會立即運(yùn)行。④系統(tǒng)時間函數(shù)OSTimeGet()和OSTimeSet()無論時鐘節(jié)拍何時發(fā)生,μC/OS-II都會將一個32位的計數(shù)器加1。這個計數(shù)器在調(diào)用OSStart()初始化多任務(wù)和4294967295個節(jié)拍執(zhí)行完一遍后,從0開始計數(shù)。在時鐘節(jié)拍頻率等于100Hz時,這個32位的計數(shù)器每隔497天就重新開始計數(shù)。在執(zhí)行的過程中可以通過調(diào)用OSTimeGet()函數(shù)來獲得該計數(shù)器的當(dāng)前值,也可以通過調(diào)用OSTimeSet()函數(shù)來改變該計數(shù)器的值。 ③按時、分、秒、毫秒延時函數(shù)OSTimeDlyHMSM()262、任務(wù)的管理μC/OS-II提過大量的API函數(shù)實現(xiàn)對任務(wù)的管理,主要的任務(wù)有:(1)建立任務(wù)μC/OS-II要管理用戶的任務(wù),就必須先建立任務(wù)。通過將任務(wù)的地址和其他參數(shù)傳遞給以下兩個函數(shù)來建立任務(wù)。OSTaskCreate()和帶有擴(kuò)展附加功能的OSTaskCreateExt()函數(shù)。在main()函數(shù)內(nèi)開始多任務(wù)調(diào)度(OSStart()前,必須至少建立一個任務(wù),而且任務(wù)不能由中斷服務(wù)程序(ISR)建立。創(chuàng)建一個任務(wù)控制塊,并通過任務(wù)控制塊把任務(wù)代碼和任務(wù)堆棧關(guān)聯(lián)起來形成一個完整的任務(wù)。還有使剛創(chuàng)建的任務(wù)進(jìn)入就緒狀態(tài),并引發(fā)一次任務(wù)調(diào)度(取決于任務(wù)是否處于多多任務(wù)工作狀態(tài))。2、任務(wù)的管理μC/OS-II提過大量的API函數(shù)實現(xiàn)對任務(wù)27兩個函數(shù)OSTaskCreate()和OSTaskCreateExt()原型如下:INT8UOSTaskCreate(void(*task)(void*pd);//指向任務(wù)的指針void*pdata;//傳遞給任務(wù)的參數(shù)OS_STK*ptos;//指向任務(wù)堆棧棧頂?shù)闹羔業(yè)NT8Uprio//任務(wù)的優(yōu)先級)兩個函數(shù)OSTaskCreate()和OSTaskCreat28INT8UOSTaskCreateExt(void(*task)(void*pd);//指向任務(wù)的指針void*pdata;//傳遞給任務(wù)的參數(shù)OS_STK*ptos;//指向任務(wù)堆棧棧頂?shù)闹羔業(yè)NT8Uprio//任務(wù)的優(yōu)先級INT16Uid//任務(wù)的標(biāo)識OS_STK*pbos;//指向任務(wù)堆棧棧低的指針I(yè)NT32Ustk_siaze;//任務(wù)堆棧容量void*pext;//指向附加數(shù)據(jù)域的指針I(yè)NT16Uopt//用于設(shè)定操作選項)

在調(diào)用任務(wù)建立函數(shù)后,μC/OS-II內(nèi)核會首先從TCB空閑列表內(nèi)申請一個空的TCB指針;然后根據(jù)用戶給出的參數(shù)初始化任務(wù)堆棧,并在內(nèi)部的任務(wù)就緒表中標(biāo)記該任務(wù)為就緒狀態(tài);最后返回。這樣就建立了一個任務(wù)。INT8UOSTaskCreateExt(29(2)任務(wù)堆棧在μC/OS-II中,每個任務(wù)都有自己的堆??臻g。堆棧必須聲明為OS_STK類型,并且由連續(xù)的內(nèi)存空間組成??梢造o態(tài)分配堆??臻g(在編譯時分配),也可以動態(tài)分配堆??臻g(在運(yùn)行時分配),這兩種聲明方式都應(yīng)放置在函數(shù)外面。任務(wù)所需堆棧的容量由應(yīng)用程序確定。但必須考慮到任務(wù)調(diào)用的所有函數(shù)的嵌套情況、任務(wù)調(diào)用的所有函數(shù)為局部變量分配的所有內(nèi)存的數(shù)目,以及所有可能的中斷服務(wù)子程序嵌套對堆棧的需求。此外,堆棧必須能夠保存CPU所有的寄存器。μC/OS-II提供了堆棧檢驗函數(shù)OSTaskStkChk(),用來確定任務(wù)實際需要的堆??臻g的大小。這樣能夠避免為任務(wù)分配過多的堆棧空間,從而減少應(yīng)用程序代碼所需的RAM數(shù)量。調(diào)用堆棧檢驗函數(shù)后,所得到的只是一個大致的堆棧使用情況,并不能說明堆棧使用的全部實際情況。為了適應(yīng)系統(tǒng)以后的升級和擴(kuò)展,應(yīng)該多分配10%~100%的堆棧空間。(2)任務(wù)堆棧30(3)任務(wù)的掛起和恢復(fù)掛起一個任務(wù),就是停止這個任務(wù)的運(yùn)行。在μC/OS-II中,用戶任務(wù)可以通過調(diào)用系統(tǒng)提供的函數(shù)OSTaskSuspend()來掛起自身或者除空閑任務(wù)之外的其他任務(wù)。掛起的任務(wù),只能在其他任務(wù)中通過調(diào)用恢復(fù)函數(shù)OSTaskResume()使其恢復(fù)為就緒狀態(tài)。但是,如果任務(wù)在被掛起的同時還在等待延遲時間到,則需要對任務(wù)取消掛起操作,并且要繼續(xù)等待延遲時間到,任務(wù)才能轉(zhuǎn)入就緒狀態(tài)。(3)任務(wù)的掛起和恢復(fù)掛起一個任務(wù),就是停止這個31(4)任務(wù)的刪除刪除一個任務(wù),就是把該任務(wù)置于睡眠狀態(tài),任務(wù)的代碼不再被μC/OS-II使用,而并不是說任務(wù)的代碼被刪除了。調(diào)用OSTaskDel()后,先進(jìn)行條件判斷,當(dāng)所有的條件都滿足后,就會從所有可能的μC/OS-II的數(shù)據(jù)結(jié)構(gòu)中去除任務(wù)的任務(wù)控制塊OS_TCB,這樣就不會被其他的任務(wù)或中斷服務(wù)子程序置于就緒態(tài),即任務(wù)置于休眠狀態(tài)。函數(shù)原型如下:INT8UOSTaskDel(INT8Uprio)可刪除任務(wù)自身或者除了空閑任務(wù)之外的其他任務(wù)。刪除自己參數(shù)為:OS_PRIO_SELF直接調(diào)用這樣的刪除任務(wù),可能出現(xiàn)某些問題,如果任務(wù)擁有一些動態(tài)的內(nèi)存或者信號量之類的資源,那么如果它被刪除了,它的資源就不會被釋放而丟失,會造成同樣使用資源的其他任務(wù)進(jìn)入死等待,出現(xiàn)錯誤情況。要慎重使用。提供了一個可以在請求刪除方和被刪除方通信完成刪除的函數(shù)。原型如下:INT8UOSTaskDelReq(INT8Uprio)返回是否被刪除和是否有要刪除自己的要求。被刪除方調(diào)用得知要刪除自己,釋放資源后,在刪除自己。(4)任務(wù)的刪除32(5)其他任務(wù)管理函數(shù)任務(wù)優(yōu)先級別修改任務(wù)運(yùn)行過程中,用戶可以根據(jù)需要來改變?nèi)蝿?wù)的優(yōu)先級別。調(diào)用的函數(shù)原型如下:INT8UOSTaskChangePrio(INT8Uoldprio;//任務(wù)現(xiàn)在的優(yōu)先級別INT8Unewprio//要修改的優(yōu)先級別)查詢?nèi)蝿?wù)的信息查詢一些任務(wù)中的信息,函數(shù)原型如下:INT8UOSTaskQuery(INT8Uprio;OS_TCB*pdata)(5)其他任務(wù)管理函數(shù)任務(wù)優(yōu)先級別修改333、任務(wù)間同步與通信的管理μC/OS-II中,使用信號量、郵箱(消息郵箱)和消息隊列來實現(xiàn)任務(wù)相互同步或相互之間的通信。μC/OS-II把關(guān)于它們的操作都定義為全局函數(shù),以供應(yīng)用程序的所有任務(wù)來調(diào)用.等待任務(wù)列表采用INT8U類型的數(shù)組OSEventTbl[]作為記錄等待事件任務(wù)的記錄表,叫做等待任務(wù)表,每個任務(wù)占1位,為1表示是等待任務(wù)。任務(wù)的等待時限,記錄在等待任務(wù)的任務(wù)控制塊TCB的成員OSTCBDly中3、任務(wù)間同步與通信的管理μC/OS-II中,使用信號量、郵34(1)事件控制塊μC/OS-II使用叫做事件控制塊ECB的數(shù)據(jù)結(jié)構(gòu)來描述諸如信號量、郵箱和消息隊列這些事件。事件控制塊包含包括等待任務(wù)表在內(nèi)的所有有關(guān)事件的數(shù)據(jù)。(1)事件控制塊35操作事件控制塊的函數(shù)

μC/OS-II有4個對事件控制塊進(jìn)行基本操作的函數(shù)(定義在OS_CORE.C中)。事件控制塊的初始化函數(shù)voidOS_EventWaitListInit(OS_ENENT*pevent)把變量OSEventGrp及任務(wù)等待表中的每一位都清0,即令事件的任務(wù)等待表中不含有任何等待任務(wù)。該函數(shù)被OSXXXCreate()創(chuàng)建時所調(diào)用。XXXSem信號量Mutex互斥信號量Mbox消息郵箱Q消息隊列操作事件控制塊的函數(shù)36使一個任務(wù)進(jìn)入等待狀態(tài)的函數(shù)voidOS_EventTaskWait(OS_ENENT*pevent)將在任務(wù)調(diào)用函數(shù)OSXXXPend()請求一個事件時調(diào)用。使一個正在等待任務(wù)進(jìn)入就緒狀態(tài)的函數(shù)INT8UOS_EventTaskRdy(OS_EVENT*pevent,void*msg,INT8Umsk)作用:把調(diào)用這個函數(shù)的任務(wù)在任務(wù)等待表中的位置清0后,再把任務(wù)在任務(wù)就緒表中的對應(yīng)的位置1,然后引發(fā)一次任務(wù)調(diào)度將在任務(wù)調(diào)用函數(shù)OSXXXPost()發(fā)送一個事件時,被調(diào)用。使一個等待超時的任務(wù)僅需就緒狀態(tài)的函數(shù)voidOS_EventTo(OS_EVENT*pevent)作用:當(dāng)任務(wù)已經(jīng)超過了等待的時間,卻要使它進(jìn)入就緒狀態(tài)。將在任務(wù)調(diào)用函數(shù)OSXXXPend()請求一個事件時,被調(diào)用。使一個任務(wù)進(jìn)入等待狀態(tài)的函數(shù)37(2)信號量管理使用信號量可以在任務(wù)間傳遞信息,實現(xiàn)任務(wù)與任務(wù)或中斷服務(wù)子程序的同步。μC/OS-II中的信號量由兩部分組成:16位的無符號整數(shù)信號量的計數(shù)值(0~65535);另一部分是由等待該信號量的任務(wù)組成的等待任務(wù)列表。μC/OS-II提供了以下6個函數(shù)對信號量進(jìn)行操作。操作創(chuàng)建信號量OSSemCreat(INT16Ucnt)創(chuàng)建,返回已創(chuàng)建信號量的指針。請求信號量OSSemPend(OS_EVENT*pevent,INT16Utimeout,NT8U*err)(2)信號量管理使用信號量可以在任務(wù)間傳遞信息,實現(xiàn)任務(wù)與任38time為0,則表示無限等待。不等待調(diào)用的函數(shù)為OSSemAccept(OS_EVENT*pevent)。發(fā)送信號量INT8UOSSemPost(OS_EVENT*pevent)當(dāng)獲得信號量,訪問共享資源結(jié)束以后,釋放信號量,調(diào)用該函數(shù)。先檢查是否有等待該信號量的任務(wù)。沒有,信號量計數(shù)器加1,有,則調(diào)用調(diào)度器OS_Sched()。time為0,則表示無限等待。39刪除信號量OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8Uopt,INT8U*err)optOS_DEL_NO_PEND沒有等待任務(wù)刪除OS_DEL_ALLWAYS立即刪除只能任務(wù)執(zhí)行,不能在中斷服務(wù)程序中刪除查詢信號量的狀態(tài)INT8UOSSemQuery(OS_EVENT*pevent,OS_SEM_DATA*pdata)pdata是一個結(jié)構(gòu)指針,存儲信號量的狀態(tài)。刪除信號量40(3)消息郵箱管理消息郵箱是μC/OS-II中的一種通信機(jī)制,通常使用時要先定義一個指針型的變量該指針指向一個包含了消息內(nèi)容的特定數(shù)據(jù)結(jié)構(gòu)。發(fā)送消息的任務(wù)或中斷服務(wù)子程序把這個變量送往郵箱,接收消息的任務(wù)從郵箱中取出該指針變量,完成信息交換。μC/OS-II提供6種對消息郵箱的操作,它們通過以下函數(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)先級向消息郵箱發(fā)送消息42請求消息郵箱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)請求消息郵箱43(4)消息隊列管理消息隊列是μC/OS-II的另一種通信機(jī)制,它可以使一個任務(wù)或中斷服務(wù)子程序向另一個任務(wù)發(fā)送以指針定義的變量。μC/OS-II提供了9個對消息隊列進(jìn)行操作的函數(shù)。創(chuàng)建先創(chuàng)建一個指針數(shù)組,然后用該數(shù)組來創(chuàng)建消息隊列OS_EVENTOSQCreate(void**start,INT16Usize)請求消息隊列void*OSQPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)(4)消息隊列管理消息隊列是μC/OS-II的另一種通信機(jī)制44向消息隊列發(fā)送消息INT8UOSQPost(OS_EVENT*pevent,void*msg)工作方式FIFOINT8UOSQPostFront(OS_EVENT*pevent,void*msg)工作方式LIFO發(fā)送廣播消息INT8UOSQPostOpt(OS_EVENT*pevent,void*msg,INT8Uopt)向消息隊列發(fā)送消息45清空消息隊列INT8UOSQFlμsh(OS_EVENT*pevent)刪除消息隊列OS_EVENT*OSQDel(OS_EVENT*pevent)查詢消息隊列INT8UOSQQuery(OS_EVENT*pevent,OS_Q_DATA*pdata)清空消息隊列46

μC/OS-II操作系統(tǒng)的文件體系結(jié)構(gòu)如圖2所示,其核心主要可分為以下3部分:(1)應(yīng)用軟件層,指的是基于μC/OS-II的應(yīng)用程序代碼。(2)內(nèi)核的核心代碼層,主要包括8個源代碼文件。這8個源代碼文件為OS_CORE.C、OS_MBOX.C、OS_MEM.C、OS_SEM.C、OS_TIME.C、μCOS_II.C、OS_Q.C和OS_TASK.C,其主要實現(xiàn)的功能分別是核心管理、事件管理、存儲管理、消息隊列管理、定時管理、信號量處理、消息管理和任務(wù)調(diào)度等,這部分代碼與處理器無關(guān)。(3)系統(tǒng)設(shè)置與移植層。系統(tǒng)設(shè)置部分的代碼由兩個頭文件OS_CFG.H和INCLμDES.H組成。其主要功能是用來配置事件控制塊的數(shù)目以及是否包含消息管理的相關(guān)代碼等。與處理器相關(guān)的移植代碼部分包括:一個頭文件OS_CPU.H、一個匯編文件OS_CPU_A.ASM和一個C代碼文件OS_CPU_C.C。系統(tǒng)設(shè)置與移植層與具體應(yīng)用和處理器相關(guān),在隨后的μC/OS-II的移植和開發(fā)過程中,用戶所需要關(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()會建立空閑任務(wù),并且這個任務(wù)總是處于就緒狀態(tài)的??臻e任務(wù)OSTaskldle()函數(shù)的優(yōu)先級總是設(shè)置成為最低級別,即OS_LOWEST_PRIO。多任務(wù)的啟動是用戶通過調(diào)用OSStart()函數(shù)來實現(xiàn)的。然而,在啟動μC/OS-II之前,用戶至少要建立一個應(yīng)用任務(wù),例如:voidmain(){OSInit(); ..通過OSTaskCreate()或OSTaskCreateExt()創(chuàng)建至少一個任務(wù) ..OSStart();/*開始多任務(wù)調(diào)度,OSStart()永遠(yuǎn)都不會返回*/}6.1.4μC/OS-II操作系統(tǒng)的初始化在調(diào)用μC/O491.μC/OSII基礎(chǔ)2.μC/OSII移植3.嵌入式系統(tǒng)的初始化操作第六章μC/OSII程序設(shè)計基礎(chǔ)1.μC/OSII基礎(chǔ)第六章μC/OSII程序設(shè)計基礎(chǔ)506.2μC/OS-II系統(tǒng)在ARM系統(tǒng)中的移植所謂移植,就是指使一個實時操作系統(tǒng)能夠在其他的微處理器平臺上進(jìn)行運(yùn)行。由于μC/OS-II的主要代碼都是由標(biāo)準(zhǔn)的C語言寫成的,所以,一般來說移植過程并不復(fù)雜。6.2.1μC/OS-II移植條件雖然μC/OS-II的大部分源代碼是用C語言寫成的,但是,仍需要用匯編語言完成一些與微處理器相關(guān)的代碼。例如,μC/OS-II在讀寫微處理器、寄存器時只能通過匯編語言來實現(xiàn)。這是因為μC/OS-II在設(shè)計的時候就已經(jīng)充分考慮了可移植性。為了要使μC/OS-II可以正常工作,處理器必須要滿足如下要求:6.2μC/OS-II系統(tǒng)在ARM系統(tǒng)中的移植51

1).微處理器的C編譯器能產(chǎn)生可重入代碼可重入的代碼指的是一段代碼(如一個函數(shù))可以被多個任務(wù)同時調(diào)用,而不必?fù)?dān)心會破壞其內(nèi)部的數(shù)據(jù)。也就是說,可重入型函數(shù)在任何時候都可以被中斷執(zhí)行,也不會因為在函數(shù)中斷的時候被其他的任務(wù)重新調(diào)用,影響函數(shù)中的數(shù)據(jù)。可重入代碼或者只使用局部變量,即變量保存在CPU寄存器中或堆棧中;或者使用全局變量,則要對全局變量予以保護(hù)。通常的C編譯器,把局部變量分配在棧中。所以,多次調(diào)用同一個函數(shù),可以保證每次的局部變量互不受影響。而全局變量,在多次調(diào)用函數(shù)的時候,必然受到影響。代碼的可重入性是保證完成多任務(wù)的基礎(chǔ),除了在C程序中使用局部變量以外,還需要C編譯器的支持?;贏RM的SDT、ADS等集成開發(fā)環(huán)境,都可以生成可重入的代碼。 1).微處理器的C編譯器能產(chǎn)生可重入代碼52

2).在程序中可以使用c語言打開或者關(guān)閉中斷在μC/OS-II中,可以通過進(jìn)入中斷屏蔽的宏定義OS_ENTER_CRITICAL()或者退出中斷屏蔽的宏定義OSEXIT_CRITICAL()來控制系統(tǒng)關(guān)閉中斷或者打開中斷,這需要微處理器的支持。在目前的ARM系列的微處理器上,都可以設(shè)置相應(yīng)的寄存器來關(guān)閉或者打開系統(tǒng)的所有中斷。3).微處理器支持中斷,并且能產(chǎn)生定時中斷(通常在10Hz-1000Hz之間)。μC/OS-II是通過微處理器產(chǎn)生定時的中斷來實現(xiàn)多任務(wù)之間的調(diào)度的。4).微處理器支持能夠容納一定量數(shù)據(jù)的硬件堆棧,并具有將堆棧指針和其他CPU寄存器讀寫到堆棧(或者內(nèi)存)的指令。5).μC/OS-II進(jìn)行任務(wù)調(diào)度的時候,會把當(dāng)前任務(wù)的CPU內(nèi)部寄存器的內(nèi)容存放到此任務(wù)的堆棧中。然后,再從另一個任務(wù)的堆棧中恢復(fù)原來的工作寄存器,繼續(xù)運(yùn)行另一個任務(wù)。所以,寄存器中內(nèi)容的入棧和出棧是μC/OS-II多任務(wù)調(diào)度的基礎(chǔ)。 2).在程序中可以使用c語言打開或者關(guān)閉中斷53

6.2.2μC/OS-II的移植步驟在的移植過程中,使用的是基于ARM公司架構(gòu)的軟件開發(fā)工具作為編譯器,所值得關(guān)注的問題是與微處理器相關(guān)的代碼,這部分主要包括一個頭文件OS_CPU.H、一個匯編文件OS_CPU_A.ASM和一個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因為不同的微處理器有不同的字長,所以μC/OS-Ⅱ的移植包括了一系列的類型定義以確保其可移植性。

6.2.2μC/OS-II的移植步驟54

用戶必須將任務(wù)堆棧的數(shù)據(jù)類型定義到μC/OS-II操作系統(tǒng)中,這個過程是通過為OS_STK聲明正確的C語言數(shù)據(jù)類型來完成的。由于使用的微處理器上的堆棧成員是16位的,所以將OS_TSK聲明為無符號整形數(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();}與所有的實時內(nèi)核一樣,μC/OS-II操作系統(tǒng)在進(jìn)行任務(wù)切換時需要先禁止中斷在訪問代碼的臨界區(qū),并且在訪問完畢后重新允許中斷。這就使得μC/OS-II能夠保護(hù)臨界區(qū)代碼免受多任務(wù)或中斷服務(wù)例程(ISR)的破壞。在S3C44B0微處理器上是通過OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()兩個函數(shù)來實現(xiàn)開、關(guān)中斷的。 用戶必須將任務(wù)堆棧的數(shù)據(jù)類型定義到μC/OS-II操作系統(tǒng)55

(3)棧增長方向標(biāo)OS_STK_GROWTH #defineOS_STK_GROWTH1#defineSTACKSIZE256絕大多數(shù)的微處理器的堆棧是從高地址向低地址增長的,但是有些微處理器是采用相反方式工作的。鑒于這種情況μC/OS-II操作系統(tǒng)被設(shè)計成為這兩種情況都可以處理,只要在結(jié)構(gòu)常量OS_STK_GROWTH中指定堆棧的生長方式就可以了。例如:設(shè)OS_STK_GROWTH為0表示堆棧從下往上增長。設(shè)OS_STK_GROWTH為1表示堆棧從上往下增長。 (3)棧增長方向標(biāo)OS_STK_GROWTH56

2.用匯編語言在OS_CPU_A.ASM文件中編寫4個與微處理器相關(guān)的函數(shù)(1)

調(diào)用優(yōu)先級最高的就緒任務(wù)函數(shù)OSStartHighRdy()(2)任務(wù)級的任務(wù)切換函數(shù)OSCtxSw()(3)中斷級的任務(wù)切換函數(shù)OSIntCtxSw()(4)時鐘節(jié)拍中斷服務(wù)函數(shù)OSTickISR()3.用C語言編寫6個操作系統(tǒng)相關(guān)的函數(shù)(OS_CPU_C.C)這里主要涉及6個函數(shù):OSTaskStkInit()、OSTaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()及OSTimeTickHook()。這些函數(shù)中,惟一必須移植的是任務(wù)堆棧初始化函數(shù)OSTaskStkInit()。這個函數(shù)在任務(wù)創(chuàng)建時被調(diào)用,負(fù)責(zé)初始化任務(wù)的堆棧結(jié)構(gòu)并返回新堆棧的指針stk。在ARM體系結(jié)構(gòu)下,任務(wù)堆棧空間由高至低依次保存著PC、LR、R12、R11、R10、…、R1、R0、CPSR及SPSR。堆棧初始化工作結(jié)束后,返回新的堆棧棧頂指針。

2.用匯編語言在OS_CPU_A.ASM文件中編寫4個與57

以下5個Hook函數(shù),又稱為鉤子函數(shù),主要用來擴(kuò)展μC/OS-Ⅱ功能,使用前必須被聲明,但并不一定要包含任何代碼。(1)

0STaskCreateHook()函數(shù)當(dāng)用OSTaskCreate()函數(shù)或OSTaskCreateExt()函數(shù)建立任務(wù)時,就會調(diào)用OSTaskCreateHook()函數(shù)。μC/OS-Ⅱ設(shè)置完自己的內(nèi)部結(jié)構(gòu)后,會在調(diào)用任務(wù)調(diào)度程序之前調(diào)用OSTaskCreateHook()函數(shù)。該函數(shù)被調(diào)用時中斷是禁止的,因此應(yīng)盡量減少該函數(shù)中的代碼,以縮短中斷的響應(yīng)時問。

(2)

OSTaskDelHook()函數(shù)當(dāng)任務(wù)被刪除時,就會調(diào)用OSTaskDelHook()函數(shù)。該函數(shù)在把任務(wù)從μC/OS-Ⅱ的內(nèi)部任務(wù)鏈表中解開之前被調(diào)用。當(dāng)OSTaskDelHook()函數(shù)被調(diào)用時,會收到指向正被刪除任務(wù)的OS_TCB的指針,這樣它就可訪問所有的結(jié)構(gòu)成員了。OSTaskDelHook()函數(shù)可用來檢驗TCB擴(kuò)展是否被建立了(一個非空指針),并進(jìn)行一些清除操作。注意,此函數(shù)不返回任何值。

以下5個Hook函數(shù),又稱為鉤子函數(shù),主要用來擴(kuò)展μC/O58

(3)

OSTaskSwHook()函數(shù)當(dāng)發(fā)生任務(wù)切換時,調(diào)用OSTaskSwHook()函數(shù)。不管任務(wù)切換是通過OSCtxSw()函數(shù),還是通過OSIntCtxSw()函數(shù)來執(zhí)行的,都會調(diào)用該函數(shù)。OSTaskSwHook()函數(shù)可直接訪問OSTCBCμr和OSTCBHighRdy,這是因為它們都是全局變量。OSTCBCμr指向被切換出去的任務(wù)的OS_TCB,而OSTCBHighRdy指向新任務(wù)的OS_TCB。在調(diào)用OSTaskSwHook()函數(shù)期間,中斷一直是被禁止的。這時因為代碼的多少會影響到中斷的響應(yīng)時間,所以應(yīng)盡量使代碼簡化。此函數(shù)沒有任何參數(shù),也不返回任何值。(4)

OSTaskStatHook()函數(shù)OSTaskStatHook()函數(shù)每秒都會被OSTaskStat()函數(shù)調(diào)用一次,可用OSTaskStatHook()函數(shù)來擴(kuò)展統(tǒng)計功能。該函數(shù)沒有任何參數(shù),也不返回任何值。(5)

OSTimeTickHook()函數(shù)OSTimeTickHook()函數(shù)在每個時鐘節(jié)拍都會被0STimeTick()函數(shù)調(diào)用。實際上,OSTimeTickHook()函數(shù)是在節(jié)拍被μC/OS-Ⅱ處理,并在通知用戶的移植實例或應(yīng)用程序之前被調(diào)用的。OSTimeTickHook()函數(shù)沒有任何參數(shù),也不返回任何值。 (3)

OSTaskSwHook()函數(shù)591.μC/OSII基礎(chǔ)2.μC/OSII移植3.嵌入式系統(tǒng)的初始化操作第六章μC/OSII程序設(shè)計基礎(chǔ)1.μC/OSII基礎(chǔ)第六章μC/OSII程序設(shè)計基礎(chǔ)60

6.2.3μC/OS-IIBSP編寫B(tài)SP(板級支持包)是介于底層硬件和操作系統(tǒng)之間的軟件層次,它完成系統(tǒng)上電后最初的硬件和軟件初始化,并對底層硬件進(jìn)行封裝,使得操作系統(tǒng)不再面對具體的操作。BSP的特點(diǎn):硬件相關(guān)性:因為嵌入式實時系統(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(板級支持包61嵌入式系統(tǒng)初始化過程及BSP功能嵌入式系統(tǒng)初始化過程及BSP功能62初始化程序的下載執(zhí)行目標(biāo)機(jī)宿主機(jī)1)通過編程器將可執(zhí)行目標(biāo)文件燒寫到BootROM(ROM、EPROM、FLASH)等;2)通過串行口和網(wǎng)口下載執(zhí)行目標(biāo)文件,要求宿主機(jī)系統(tǒng)上有數(shù)據(jù)傳輸工具程序、目標(biāo)機(jī)裝載器、嵌入式監(jiān)視器或目標(biāo)機(jī)系統(tǒng)上的調(diào)試代理。3)通過JTAG或BDM接口下載;初始化程序的下載執(zhí)行目標(biāo)機(jī)宿主機(jī)1)通過編程器將可執(zhí)行目標(biāo)文63嵌入式系統(tǒng)的初始化過程嵌入式系統(tǒng)的初始化過程64嵌入式系統(tǒng)的初始化過程硬件初始化階段1、復(fù)位向量

ENTRYbResetHandler;fordebugbHandlerundef;handlerundefbHandlerSWI;SWIinterrupthandlerbHandlerPabort;handlerPAbortbHandlerDabort;handlerDAbortb ;handlerReservedbHandlerIRQbHandlerFIQ嵌入式系統(tǒng)的初始化過程硬件初始化階段1、復(fù)位向量65嵌入式系統(tǒng)的初始化過程(2)硬件初始化階段2、最小硬件初始化1)設(shè)置適當(dāng)?shù)募拇嫫鳎骨度胧教幚砥魈幱谝粋€已知的狀態(tài):獲得CPU的類型;獲得或設(shè)置CPU的時鐘頻率。2)禁止中斷和高速緩存3)初始化內(nèi)存控制器、內(nèi)存芯片和高速緩存單元,包括:得到內(nèi)存的開始地址;得到內(nèi)存的大??;如果有要求,則還需要進(jìn)行主存測試;嵌入式系統(tǒng)的初始化過程(2)硬件初始化階段2、最小硬件初始化66嵌入式系統(tǒng)的初始化過程(3)硬件初始化階段3、其余硬件初始化1)引導(dǎo)代碼調(diào)用合適的函數(shù)對目標(biāo)機(jī)系統(tǒng)上的全部硬件部件進(jìn)行初始化,包括:建立執(zhí)行處理程序初始化中斷處理程序初始化總線接口初始化板級外設(shè)得到內(nèi)存的開始地址;嵌入式系統(tǒng)的初始化過程(3)硬件初始化階段3、其余硬件初始化67嵌入式系統(tǒng)的初始化過程(4)RTOS初始化階段4、RTOS初始化1)RTOS初始化2)RTOS對象和服務(wù)初始化任務(wù)信號量定時器中斷內(nèi)存管理3)RTOS任務(wù)堆棧初始化4)RTOS擴(kuò)展部件初始化5)啟動RTOS嵌入式系統(tǒng)的初始化過程(4)RTOS初始化階段4、RTOS初68ARM7TDMI系統(tǒng)初始化的一般過程啟動(系統(tǒng)上電/復(fù)位)從程序入口點(diǎn)關(guān)閉中斷初始化時鐘等硬件相關(guān)寄存器初始化存儲器系統(tǒng)初始化C所需要的存儲器空間調(diào)用C入口函數(shù)ARM7TDMI系統(tǒng)初始化的一般過程啟動(系統(tǒng)上電/復(fù)位)從69一、設(shè)置程序入口指針上電復(fù)位后直接到程序入口點(diǎn)執(zhí)行,入口點(diǎn)一般為一個跳轉(zhuǎn)表,跳轉(zhuǎn)到復(fù)位處理程序處開始執(zhí)行ARM系統(tǒng)的初始化;啟動程序首先必須定義入口指針,而且整個應(yīng)用程序只有一個入口指針例:AREABoot,CODE,READONLYENTRY/*設(shè)置程序入口指針*/一、設(shè)置程序入口指針上電復(fù)位后直接到程序入口點(diǎn)執(zhí)行,入口點(diǎn)一70二、設(shè)置中斷向量ARM要求中斷向量必須設(shè)置在從OX00000000地址開始,連續(xù)8*4字節(jié)的地址空間;向量表包含一系列跳轉(zhuǎn)指令,跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序;對各未用中斷,使其指向一個含返回指令的啞函數(shù),以防止錯誤中斷引起系統(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è)置相關(guān)的寄存器通過設(shè)置時鐘控制器來確定CPU的工作頻率,設(shè)置中斷控制寄存器屏蔽中斷三、初始化時鐘和設(shè)置相關(guān)的寄存器通過設(shè)置時鐘控制器來確定CP74四、初始化存儲器系統(tǒng)存儲器類型和時序配置(參考芯片手冊,設(shè)置與內(nèi)存映射相關(guān)的寄存器)一個復(fù)雜的系統(tǒng)可能存在多種存儲器類型的接口,需要根據(jù)實際的系統(tǒng)設(shè)計對此加以正確配置。對同一種存儲器類型來說,也因為訪問速度的差異,需要不同的時序設(shè)置。通常Flash和SRAM同屬于靜態(tài)存儲器類型,可以合用同一個存儲器端口;而DRAM因為動態(tài)刷新和地址線復(fù)用等特性,通常配有專用的存儲器端口。存儲器端口的接口時序優(yōu)化是非常重要的,影響到整個系統(tǒng)的性能。因為一般系統(tǒng)運(yùn)行的速度瓶頸都存在于存儲器訪問,所以存儲器訪問時序應(yīng)盡可能地快;但同時又要考慮由此帶來的穩(wěn)定性問題。只有根據(jù)具體選定的芯片,進(jìn)行多次的測試之后,才能確定最佳的時序配置。四、初始化存儲器系統(tǒng)存儲器類型和時序配置(參考芯片手冊,設(shè)置75存儲器地址分布有些系統(tǒng)具有非常靈活的存儲器地址分配特性,進(jìn)行存儲器初始化設(shè)計的時候一定要根據(jù)應(yīng)用程序的具體要求來完成地址分配。一種典型的情況是啟動ROM的地址重映射(remap)。當(dāng)一個系統(tǒng)上電后程序?qū)⒆詣訌?地址處開始執(zhí)行,因此在系統(tǒng)的初始狀態(tài),必須保證在0地址處存在正確的代碼,即要求0地址開始處的存儲器是非易性的ROM或Flash等。但是因為ROM或Flash的訪問速度相對較慢,每次中斷發(fā)生后都要從讀取ROM或Flash上面的向量表開始,影響了中斷響應(yīng)速度。因此有的系統(tǒng)便提供一種靈活的地址重映射方法,可以把0地址重新指向到RAM中去。在這種地址映射的變化過程當(dāng)中,程序員需要仔細(xì)考慮的是程序的執(zhí)行流程不能被這種變化所打斷。存儲器地址分布有些系統(tǒng)具有非常靈活的存儲器地址分配特性,進(jìn)行76ROM地址的重映射(remap)0x0200(bootcode)0x0100(Reset_handler)……BReset_Handler0x0000Flash(remap)0x0204(bootcode)0x0200(Reset_handler)BReset_Handler0x0000RAMROM地址的重映射(remap)0x0200(bootco77ROM地址重映射的實現(xiàn)movr8,#RAM_BASE_BOOT //RAM_BASE_BOOT是重映射前內(nèi)部RAM區(qū)地址addr9,pc,#-(8+.-VectorTable)//VectorTale是異常向量表入口ldmiar9!,{r0-r7}//讀8個異常向量 stmiar8!,{r0-r7}//保存8個異常向量到RAM區(qū)ldmiar9!,{r0-r4}//讀5個異常處理程序絕對地址stmiar8!,{r0-r4}//保存5個異常處理程序絕對地址到RAM區(qū)為保證重映射之后提供正確的中斷入口地址,在重映射之前就必須把中斷和異常向量表拷貝到內(nèi)部RAM中。其程序?qū)崿F(xiàn)如下:ROM地址重映射的實現(xiàn)movr8,#RAM_BAS78五、初始化堆棧ARM處理器有好幾種運(yùn)行狀態(tài)(模式),各種狀態(tài)都需要有自己的堆棧,所以需要分別為這些堆棧分配空間并設(shè)置好各自的堆棧指針每一種狀態(tài)的堆棧指針寄存器(SP)都是獨(dú)立的(System和user模式使用相同的SP寄存器)。因此對程序中需要用到的每一種模式都要給SP寄存器定義一個堆棧地址。方法是改變狀態(tài)寄存器CPSR內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),然后給SP賦值。(意不要切換到user模式進(jìn)行user模式的堆棧設(shè)置,因為進(jìn)入user模式后就不能再操作CPSR回到別的模式了??赡軙酉氯サ某绦驁?zhí)行造成影響。)一般堆棧的大小要根據(jù)需要而定,但是要盡可能給堆棧分配快速和高帶寬的存儲器。堆棧性能的提高對系統(tǒng)整體性能的影響是非常明顯的。五、初始化堆棧ARM處理器有好幾種運(yùn)行狀態(tài)(模式),各種狀態(tài)79六、初始化應(yīng)用程序執(zhí)行環(huán)境映像一開始總是存儲在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)境映像一開始總是存儲在ROM/Fla80六、初始化C環(huán)境在目標(biāo)文件中,代碼、數(shù)據(jù)放在不同的段中。源文件編譯鏈接生成含.data、.text段的目標(biāo)文件,且鏈接器生成的.data段是以系統(tǒng)RAM為參考地址故在系統(tǒng)啟動時需要拷貝ROM或FLASH中的.data段到RAM,以完成對RAM的初始化。在初始化期間應(yīng)將系統(tǒng)需要讀寫的數(shù)據(jù)和變量從ROM拷貝到RAM里運(yùn)行六、初始化C環(huán)境在目標(biāo)文件中,代碼、數(shù)據(jù)放在不同的段中。源文81鏈接器產(chǎn)生的符號表符號由鏈接器自動產(chǎn)生,只讀段(read-onlyRO)就是代碼段,讀寫段(read-writeRW)是已經(jīng)初始化的全局變量,而零初始化段(zero-initializedsectionZI)中存放未初始化的全局變量;鏈接器產(chǎn)生的符號表符號由鏈接器自動產(chǎn)生,只讀段(read-o82初始化C環(huán)境(1)C環(huán)境初始化,就是利用上述符號初始化RW和ZI段以使后面使用的全局變量的C程序正常運(yùn)行;這里有兩個循環(huán),第一個循環(huán)把預(yù)初始化的數(shù)據(jù)段RW(位于代碼段的后面)復(fù)制到RAM中,另一個循環(huán)把未初始化的數(shù)據(jù)段ZI初始化為0,也就是實現(xiàn)把從ROM中的.data段拷貝到RAM,對ZI段內(nèi)的數(shù)據(jù)初始化為0,以完成對C環(huán)境的實始化;初始化C環(huán)境(1)C環(huán)境初始化,就是利用上述符號初始化RW和83初始化C環(huán)境(2)初始化C環(huán)境(2)84改變處理器模式除用戶模式以外,其他6種模式都是特權(quán)模式。因為在初始化過程中許多操作需要在特權(quán)模式下才能進(jìn)行(比如CPSR的修改),所以要特別注意不能過早地進(jìn)入用戶模式。一般地,在初始化過程中會經(jīng)歷以下一些模式變化:改變處理器模式除用戶模式以外,其他6種模式都是特權(quán)模式。因85七、調(diào)用C程序?qū)ain函數(shù)的調(diào)用進(jìn)入μc/OS的入口,通過這個入口就進(jìn)入μC/OS的主函數(shù),啟動對μC/OS的初始化例IMPORTMainbMain;CEntry七、調(diào)用C程序?qū)ain函數(shù)的調(diào)用進(jìn)入μc/OS的入口,通過86μC/OS系統(tǒng)的初始化完成了前面的硬件初始化和運(yùn)行環(huán)境的相關(guān)設(shè)置后,進(jìn)入Main(),Main()是μC/OS的入口函數(shù),啟動對μ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è)計基礎(chǔ)1.μC/OSII基礎(chǔ)第六章μC/OSII程序設(shè)計基礎(chǔ)89RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺BSPKERNELFSTCP/IP設(shè)備驅(qū)動設(shè)備I/O調(diào)試工具其它組件應(yīng)用RTOSC/C++RTOS在嵌入式系統(tǒng)中的位置嵌入式硬件平臺BSPKERNEL90C/OS簡介

C/OS簡介

91μC/OS-II意為“微控制器操作系統(tǒng)版本2”。世界上已有數(shù)千人在各個領(lǐng)域使用μC/OS,例如,照相機(jī)行業(yè)、醫(yī)療器械、音響設(shè)施、發(fā)動機(jī)控制、網(wǎng)絡(luò)設(shè)備、高速公路電話系統(tǒng)、自動提款機(jī)、工業(yè)機(jī)器人等等。很多高等院校將μC/OS用于實時系統(tǒng)教學(xué)。μC/OS-II意為“微控制器操作系統(tǒng)版本2”。世界上已有數(shù)92μC/OS-II圖籍描述了μC/OS-II內(nèi)部的工作原理隨書的CD中包含了源代碼工業(yè)界最清晰的源代碼除英文版外,有中文和韓文版ChineseKoreanEnglishISBN1-57820-103-9美國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-Ⅱ是一個免費(fèi)的、源代碼公開的實時嵌入式內(nèi)核,其內(nèi)核提供了實時系統(tǒng)所需要的一些基本功能。其中包含全部功能的核心部分代碼占用8.3KB,全部的源代碼約5500行,結(jié)構(gòu)合理、清晰易懂,且注解詳盡,非常適合初學(xué)者進(jìn)行學(xué)習(xí)分析。μC/OS-Ⅱ不僅使用戶得到廉價的解決方案,而且由于μC/OS-Ⅱ的開放源代碼特性,還使用戶可針對自己的硬件優(yōu)化代碼,獲得更好的性能。μC/OS-Ⅱ是在PC機(jī)上開發(fā)的,C編輯器使用的是BorlandC/C++3.1版。從早期使用的μCOS到現(xiàn)在的μC/OS-ⅡV2.52版,應(yīng)用的實例也進(jìn)一步說明了該內(nèi)核的實用性和可靠性。6.1C/OS-II系統(tǒng)的特點(diǎn)及結(jié)構(gòu)

μC/OS-Ⅱ是一個免費(fèi)的、源代碼公開的實時嵌入式內(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è)計的操作系統(tǒng),只要具備有合適的軟硬件工具,就可將μC/OS-Ⅱ嵌入到產(chǎn)品中去,從而成為產(chǎn)品的一部分。4.可裁剪(Scalable),μC/OS-Ⅱ可根據(jù)實際用戶的應(yīng)用需要使用條件編譯來完成對操作系統(tǒng)的裁剪,這樣就可以減少μC/OS-Ⅱ?qū)Υa空間和數(shù)據(jù)空間的占用。5.可剝奪型(Preemptive),μC/OS-Ⅱ是完全可剝奪型的實時內(nèi)核,運(yùn)行就緒條件下優(yōu)先級最高的任務(wù)。6.多任務(wù),μC/OS-Ⅱ可管理64個任務(wù)。一般情況下,建議用戶保留8個任務(wù)給μC/OS-Ⅱ。這樣,留給用戶應(yīng)用程序的任務(wù)最多可有56個。系統(tǒng)賦給每個任務(wù)的優(yōu)先級必須不同,這意味著μC/OS-Ⅱ不支持時間片輪轉(zhuǎn)調(diào)度法(Round-robinScheduling)。7.可確定性,絕大多數(shù)μC/OS-Ⅱ的函數(shù)調(diào)用和服務(wù)的執(zhí)行時間具有確定性。在任何時候用戶都能知道μC/OS-Ⅱ的函數(shù)調(diào)用與服務(wù)的執(zhí)行時間。 3.可固化(ROMable),μC/OS-Ⅱ是為嵌入式應(yīng)用97

8.任務(wù)棧,μC/OS-Ⅱ的每個任務(wù)都有自己單獨(dú)的棧和棧空間。使用μC/OS-Ⅱ的棧空間校驗函數(shù)可確定每個任務(wù)到底需要多少??臻g。9.系統(tǒng)服務(wù),提供了例如信號量、互斥信號量、消息郵箱、事件標(biāo)志、數(shù)據(jù)隊列、塊大小固定的內(nèi)存的申請與釋放及時間管理函數(shù)等。10.中斷管理,中斷可使正在執(zhí)行的任務(wù)暫時掛起,如果優(yōu)先級更高的任務(wù)被中斷喚醒,則高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行。中斷嵌套層數(shù)可達(dá)255層。11.穩(wěn)定性與可靠性,2000年7月,μC/OS-Ⅱ在一個航空項目中得到了美國聯(lián)邦航空管理局對商用飛機(jī)的符合RTCADO--178B標(biāo)準(zhǔn)的認(rèn)證??梢哉f,μC/OS-Ⅱ的每一種功能、每一個函數(shù)及每一行代碼都經(jīng)過了考驗與測試。 8.任務(wù)棧,μC/OS-Ⅱ的每個任務(wù)都有自己單獨(dú)的棧和???8

6.1.2μC/OS-Ⅱ系統(tǒng)的內(nèi)核結(jié)構(gòu)

與其他操作系統(tǒng)不同,μC/OS-Ⅱ其實只有一個內(nèi)核,提供任務(wù)調(diào)度、任務(wù)間的通信與同步、任務(wù)管理、時間管理和內(nèi)存管理等基本功能。1)任務(wù)在μC/OS-Ⅱ中,一個任務(wù)通常是一個無限的循環(huán)。一個任務(wù)看起來像其他c語言的函數(shù)一樣,有函數(shù)返回類型,有形式參數(shù)變量,但任務(wù)是決不會返回的。故返回參數(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個任務(wù),其優(yōu)先級可以從0開始,優(yōu)先級號越低,其任務(wù)的優(yōu)先級就越高。但目前版本的μC/OS-II有兩個任務(wù)已經(jīng)被系統(tǒng)占用了,而且保留了優(yōu)先級0、1、2、3、和OS_LOWEST_PRIO-3、OS_LOWEST__PRIO-2、0S_LOWEST_PRIO-1以及OS_LOWEST_PRIO這8個任務(wù)已備將來使用。OS_LOWEST_PRIO是作為常數(shù)在OS_CFG.H文件中用定義常數(shù)語句#defineconstant來定義的。因此用戶可以使用多達(dá)56個應(yīng)用任務(wù),但首先要給每個任務(wù)賦以不同的優(yōu)先級。μC/OS-II總是運(yùn)行進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)。目前版本的μC/OS-II中,任務(wù)的優(yōu)先級號就是任務(wù)編號(ID)。優(yōu)先級號(或任務(wù)的ID號)也可以被一些內(nèi)核服務(wù)函數(shù)調(diào)用,比如改變優(yōu)先級函數(shù)OSTaskChangePrio()或者OSTaskDel()。為了使μC/OS-II能管理用戶任務(wù),用戶必須在建立一個任務(wù)的時候,將任務(wù)的起始地址與其他參數(shù)一起傳給OSTaskCreate()或者OSTaskCreateExt()這兩個函數(shù)中的任何一個函數(shù)。 2)任務(wù)調(diào)度100在任一給定的時刻,任務(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)在任一給定的時刻,任務(wù)的狀態(tài)一定是以下五種狀態(tài)之一:μC/O101睡眠態(tài)(taskdormant)指任務(wù)駐留在程序空間(ROM或RAM),還沒有交給系統(tǒng)來管理的狀態(tài)任務(wù)交給系統(tǒng)通過調(diào)用以下函數(shù)之一來實現(xiàn):OSTaskCreate()OSTaskCreateExt()告知系統(tǒng):任務(wù)的起始地址任務(wù)建立時,用戶給任務(wù)賦予的優(yōu)先級任務(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ù)開始之前,也可以動態(tài)地由一個運(yùn)行著的任務(wù)創(chuàng)建若剛創(chuàng)建任務(wù)的優(yōu)先級高于創(chuàng)建它的任務(wù)的優(yōu)先級,它將立即獲得cpu的使用權(quán)任務(wù)可通過OSTaskDel()返回睡眠態(tài);或調(diào)用該函數(shù)讓另一個任務(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)先級高于它的任務(wù)都轉(zhuǎn)為等待狀態(tài),或被刪除后,才能進(jìn)入運(yùn)行態(tài)任何時刻只有一個任務(wù)處于運(yùn)行態(tài)調(diào)用OSStart()可以啟動多任務(wù)。該函數(shù)只能在啟動時調(diào)用一次OSStart()運(yùn)行用戶初始化代碼中已經(jīng)建立的、進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)運(yùn)行態(tài)(taskrμnning)就緒的任務(wù)只有當(dāng)所有優(yōu)先級104等待狀態(tài)(taskwaiting)正在運(yùn)行的任務(wù)可以通過下面的調(diào)用進(jìn)入等待狀態(tài)。延遲時間到,立即強(qiáng)制執(zhí)行任務(wù)切換,讓下一個優(yōu)先級最高、并進(jìn)入就緒態(tài)的任務(wù)執(zhí)行。OSTimeDly()OSTimeDlyHMSM()等待時間過去后,系統(tǒng)服務(wù)(內(nèi)部)函數(shù)OSTimeTick()使延遲了的任務(wù)進(jìn)入就緒態(tài)用戶無需在應(yīng)用程序代碼中調(diào)用這個函數(shù)等待狀態(tài)(taskwaiting)正在運(yùn)行的任務(wù)可以通過下105等待狀態(tài)(續(xù))正在運(yùn)行的任務(wù)可能需要通過調(diào)用函數(shù)等待某一事件發(fā)生。如果該事件并未發(fā)生,任務(wù)就進(jìn)入等待狀態(tài)OSFlagPend();OSMμtexPend()OSSemPend();OSMboxPend()當(dāng)事件發(fā)生或等待超時,被掛起的任務(wù)就進(jìn)入就緒態(tài)等待狀態(tài)(續(xù))正在運(yùn)行的任務(wù)可能需要通過調(diào)用函數(shù)等待某一事件106中斷服務(wù)態(tài)(ISRrunning)正在執(zhí)

溫馨提示

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

最新文檔

評論

0/150

提交評論