版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1.C/OS II基礎2.C/OS II移植3.嵌入式系統的初始化操作第六章 C/OS II程序設計基礎RTOS在嵌入入式系統統中的位位置嵌入式硬硬件平臺臺BSPKERNELFSTCP/IP設備驅動動設備I/O調試工具具其它組件件應用RTOSC/C+C/OS簡介C/OS-II意為為“微控控制器操操作系統統版本2”。世世界上已已有數千千人在各各個領域域使用C/OS,例例如,照照相機行行業(yè)、醫(yī)醫(yī)療器械械、音響響設施、發(fā)動機機控制、網絡設設備、高高速公路路電話系系統、自自動提款款機、工工業(yè)機器器人等等等。很多多高等院院校將C/OS用于于實時系系統教學學。C/OS-II圖籍描述了C/OS-II內部部的
2、工作作原理隨書的CD中包包含了源源代碼工業(yè)界最最清晰的的源代碼碼除英文版版外,有有中文和和韓文版版ChineseKoreanEnglishISBN 1-57820-103-9美國CMPBOOKISBN 7-81077-290-2北京航空空航天大大學出版版社ISBN 89-951540-5-5C/OS-II的各各種商業(yè)業(yè)應用全世界有有數百種種產品在在應用:Avionics(航空電電子設備備)MedicalCell phonesRouters andswitchesHigh-endaudioequipmentWashing machines anddryersUPS(uninterruptible
3、 Power Supplies)Industrial controllersGPSNavigationSystemsMicrowaveRadiosInstrumentationPoint-of-sale terminals更多COS-是一個個免費的的、源代代碼公開開的實時時嵌入式式內核,其內核核提供了了實時系系統所需需要的一一些基本本功能。其中包包含全部部功能的的核心部部分代碼碼占用8.3KB,全部的的源代碼碼約5500行行,結構構合理、清晰易易懂,且且注解詳詳盡,非非常適合合初學者者進行學學習分析析。COS-不不僅使用用戶得到到廉價的的解決方方案,而而且由于于COS-的開開放源代代碼特性性,
4、還使使用戶可可針對自自己的硬硬件優(yōu)化化代碼,獲得更更好的性性能。COS-是在PC機上上開發(fā)的的,C編編輯器使使用的是是BorlandC/C+3.1版。從早期期使用的的COS到現現在的COS- V2.52版,應應用的實實例也進進一步說說明了該該內核的的實用性性和可靠靠性。6.1C/OS-II系統的的特點及及結構6.1.1COS-系統的的特點3可固固化(ROMable),COS-是為嵌嵌入式應應用而設設計的操操作系統統,只要要具備有有合適的的軟硬件件工具,就可將將COS-嵌入入到產品品中去,從而成成為產品品的一部部分。4可裁裁剪(Scalable),COS-可根根據實際際用戶的的應用需需要使用用條
5、件編編譯來完完成對操操作系統統的裁剪剪,這樣樣就可以以減少COS-對代碼碼空間和和數據空空間的占占用。5可剝剝奪型(Preemptive),COS-是完完全可剝剝奪型的的實時內內核,運運行就緒緒條件下下優(yōu)先級級最高的的任務。6多任任務,COS-可管理理64個個任務。一般情情況下,建議用用戶保留留8個任任務給COS-。這樣樣,留給給用戶應應用程序序的任務務最多可可有56個。系統統賦給每每個任務務的優(yōu)先先級必須須不同,這意味味著COS-不不支持時時間片輪輪轉調度度法(Round-robinScheduling)。7可確確定性,絕大多多數COS-的的函數調調用和服服務的執(zhí)執(zhí)行時間間具有確確定性。在任
6、何何時候用用戶都能能知道COS-的函數數調用與與服務的的執(zhí)行時時間。8任務務棧,COS-的每個個任務都都有自己己單獨的的棧和棧??臻g。使用COS-的棧空空間校驗驗函數可可確定每每個任務務到底需需要多少少??臻g間。9系統統服務,提供了了例如信信號量、互斥信信號量、消息郵郵箱、事事件標志志、數據據隊列、塊大小小固定的的內存的的申請與與釋放及及時間管管理函數數等。10中中斷管理理,中斷斷可使正正在執(zhí)行行的任務務暫時掛掛起,如如果優(yōu)先先級更高高的任務務被中斷斷喚醒,則高優(yōu)優(yōu)先級的的任務在在中斷嵌嵌套全部部退出后后立即執(zhí)執(zhí)行。中中斷嵌套套層數可可達255層。11穩(wěn)穩(wěn)定性與與可靠性性,2000年年7月,C
7、OS-在一一個航空空項目中中得到了了美國聯聯邦航空空管理局局對商用用飛機的的符合RTCA DO-178B標準的的認證??梢哉f說,COS-的的每一種種功能、每一個個函數及及每一行行代碼都都經過了了考驗與與測試。6.1.2COS-系統的的內核結結構與其他操操作系統統不同,COS-其實實只有一一個內核核,提供供任務調調度、任任務間的的通信與與同步、任務管管理、時時間管理理和內存存管理等等基本功功能。1)任任務在COS-中,一個任任務通常常是一個個無限的的循環(huán)。一個任任務看起起來像其其他c語語言的函函數一樣樣,有函函數返回回類型,有形式式參數變變量,但但任務是是決不會會返回的的。故返返回參數數必須定定
8、義成void,例如如:Void YorTask(void*pdata)for(;)*用戶戶代碼*調用用COS-II的的某種系系統服務務:*用戶戶代碼*2)任任務調度度COS-II可以管管理多達達64個個任務,其優(yōu)先先級可以以從0開開始,優(yōu)優(yōu)先級號號越低,其任務務的優(yōu)先先級就越越高。但但目前版版本的COS-II有兩兩個任務務已經被被系統占占用了,而且保保留了優(yōu)優(yōu)先級0、1、2、3、和OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、0S_LOWEST_PRIO-1以以及OS_LOWEST_PRIO這8個個任務已已備將來來使用。OS_LOWEST_PRIO是是作為常常數在OS_C
9、FG.H文件件中用定定義常數數語句#define constant來定義義的。因因此用戶戶可以使使用多達達56個應用任任務,但但首先要要給每個個任務賦賦以不同同的優(yōu)先先級。COS-II總是是運行進進入就緒緒態(tài)的優(yōu)優(yōu)先級最最高的任任務。目目前版本本的COS-II中,任任務的優(yōu)優(yōu)先級號號就是任任務編號號(ID)。優(yōu)優(yōu)先級號號(或任任務的ID號)也可以以被一些些內核服服務函數數調用,比如改改變優(yōu)先先級函數數OSTaskChangePrio()或者OSTaskDel()。為了使COS-II能管管理用戶戶任務,用戶必必須在建建立一個個任務的的時候,將任務務的起始始地址與與其他參參數一起起傳給OSTask
10、Create()或者者OSTaskCreateExt()這這兩個函函數中的的任何一一個函數數。在任一給給定的時時刻,任任務的狀狀態(tài)一定定是以下下五種狀狀態(tài)之一一:睡眠態(tài)(taskdormant)就緒態(tài)(taskready)運行態(tài)(taskrunning)等待狀態(tài)態(tài)(taskwaiting)中斷服務務態(tài)(ISRrunning)C/OSII的的五種狀狀態(tài)睡眠態(tài)(taskdormant)指任務駐駐留在程程序空間間(ROM或RAM),還沒沒有交給給系統來來管理的的狀態(tài)任務交給給系統通通過調用用以下函函數之一一來實現現:OSTaskCreate()OSTaskCreateExt()告知系統統:任務的起起
11、始地址址任務建立立時,用用戶給任任務賦予予的優(yōu)先先級任務要使使用的棧??臻g大大小等就緒態(tài)(taskready)任務一旦旦創(chuàng)建就就進入就就緒態(tài),準備運運行任務的創(chuàng)創(chuàng)建可以以是在多多任務開開始之前前,也可可以動態(tài)態(tài)地由一一個運行行著的任任務創(chuàng)建建若剛創(chuàng)建建任務的的優(yōu)先級級高于創(chuàng)創(chuàng)建它的的任務的的優(yōu)先級級,它將將立即獲獲得cpu的使使用權任務可通通過OSTaskDel()返回睡睡眠態(tài);或調用用該函數數讓另一一個任務務進入睡睡眠態(tài)運行態(tài)(taskrnning)就緒的任任務只有有當所有有優(yōu)先級級高于它它的任務務都轉為為等待狀狀態(tài),或或被刪除除后,才才能進入入運行態(tài)態(tài)任何時刻刻只有一一個任務務處于運運行態(tài)
12、調用OSStart()可以以啟動多多任務。該函數數只能在在啟動時時調用一一次OSStart()運運行用戶戶初始化化代碼中中已經建建立的、進入就就緒態(tài)的的優(yōu)先級級最高的的任務等待狀態(tài)態(tài)(taskwaiting)正在運行行的任務務可以通通過下面面的調用用進入等等待狀態(tài)態(tài)。延遲遲時間到到,立即即強制執(zhí)執(zhí)行任務務切換,讓下一一個優(yōu)先先級最高高、并進進入就緒緒態(tài)的任任務執(zhí)行行。OSTimeDly()OSTimeDlyHMSM()等待時間間過去后后,系統統服務(內部)函數OSTimeTick()使使延遲了了的任務務進入就就緒態(tài)用戶無需需在應用用程序代代碼中調調用這個個函數等待狀態(tài)態(tài)(續(xù))正在運行行的任務務
13、可能需需要通過過調用函函數等待待某一事事件發(fā)生生。如果果該事件件并未發(fā)發(fā)生,任任務就進進入等待待狀態(tài)OSFlagPend();OSMtexPend()OSSemPend();OSMboxPend()當事件發(fā)發(fā)生或等等待超時時,被掛掛起的任任務就進進入就緒緒態(tài)中斷服務務態(tài)(ISRrunning)正在執(zhí)行行的任務務是可以以被中斷斷的,除非該該任務將將中斷關關閉,或或系統將將中斷關關閉。被被中斷的的任務便便進入了了中斷服服務態(tài)響應中斷斷后,正正在運行行的任務務被掛起起,中斷斷服務子子程序控控制了CPu的的使用權權中斷服務務態(tài)(ISRrunning)中斷服務務子程序序可能會會報告一一個或多多個事件件的
14、發(fā)生生,而使使一個或或多個任任務進入入就緒態(tài)態(tài)上述情況況下,從從中斷服服務子程程序返回回之前,C/OSII要判定:被中斷的的任務是是否還是是就緒態(tài)態(tài)任務中中優(yōu)先級級最高的的如果中斷斷服務子子程序使使另一個個優(yōu)先級級更高的的任務進進入了就就緒態(tài),則新進進入就緒緒態(tài)的這這個優(yōu)先先級更高高的任務務將得以以運行;否則,原來被被中斷了了的任務務將繼續(xù)續(xù)運行。任務狀態(tài)態(tài)當所有的的任務都都在等待待時間發(fā)發(fā)生或等等待延遲遲時間結結束時,C/OSII執(zhí)執(zhí)行被被稱為空空閑任務務(IdleTask)的的內部函函數,即即:OSTaskIdle()任務的CPU使使用權被被剝奪中斷6.1.3主主要模塊塊介紹1內存存管理在
15、ANSIC中,一一般采用用內存分分配函數數malloc()和和內存釋釋放函數數free()兩個函函數動態(tài)態(tài)地分配配和釋放放內存。為了消消除多次次動態(tài)分分配與釋釋放內存存所引起起的內存存碎片和和分配、釋放函函數執(zhí)行行時間的的不確定定性的現現象,COS-把連續(xù)續(xù)的大塊塊內存按按分區(qū)來來進行管管理。每每個分區(qū)區(qū)中都包包含若干干個存儲儲容量大大小相同同的內存存塊,但但不同分分區(qū)之間間的內存存塊容量量大小是是可以不不同的。在需要要動態(tài)分分配內存存時,可可選擇一一個適當當的分區(qū)區(qū),按塊塊來分配配內存。在釋放放內存時時,將該該塊放回回它以前前所屬的的分區(qū)。這樣,就能有有效解決決內存碎碎片問題題。而且且每次調
16、調用malloc()和free()分配配和釋放放的都是是整數倍倍的固定定內存塊塊長,這這樣執(zhí)行行時間就就是確定定的了。(1)內內存管理理控制塊塊OS_MEM為便于內內存的管管理,COS-II中使使用內存存控制塊塊(MemoryControl Blocks)的的數據結結構跟蹤蹤每一個個內存分分區(qū)系統統,每個個分區(qū)都都有屬于于自己的的內存控控制塊,系統是是通過內內存控制制塊數據據結構OS_MEM來來管理內內存的。(2)內內存管理理內存管理理主要通通過以下下4個函函數來實實現:OSMemCreate()函數數,用于于建立一一個內存存分區(qū)。該函數數共有4個參數數:內存存分區(qū)的的起始地地址、分分區(qū)內的的
17、內存塊塊數、每每個內存存塊的字字節(jié)數和和一個指指向錯誤誤信息代代碼的指指針。OSMemGet()函數數,用于于分配一一個內存存塊。當當調度某某任務執(zhí)執(zhí)行時,必須先先從已建建立的內內存分區(qū)區(qū)中為該該任務申申請一個個內存塊塊。OSMemPut()函數數,釋放放一個內內存塊。當某一一任務不不再使用用一個內內存塊時時,必須須及時地地把它放放回到相相應的內內存分區(qū)區(qū)中,以以便下一一次的分分配操作作。OSMemQuery()函數,用于查查詢一個個特定內內存分區(qū)區(qū)的狀態(tài)態(tài)。如查查詢某內內存分區(qū)區(qū)中內存存塊的大大小、可可用內存存塊數和和正在使使用的內內存塊數數等信息息。(3)時時間管理理與大部分分內核一一樣,
18、COS-要求提提供定時時中斷,以實現現延時與與超時控控制等功功能。這這個定時時中斷也也可以被被叫作為為時鐘節(jié)節(jié)拍。時時鐘節(jié)拍拍函數的的作用是是用于通通知COS-發(fā)發(fā)生了時時鐘節(jié)拍拍中斷,下面再再介紹幾幾個可以以處理時時間問題題的函數數。任務延延時函數數OSTimeDIy()調用該函函數會使使COS-進行行一次任任務調度度,并且且執(zhí)行下下一個優(yōu)優(yōu)先級最最高的就就緒態(tài)任任務。任任務調用用OSTimeDly()后后,一旦旦規(guī)定的的時間期期滿或者者有其他他任務通通過調用用OSTimeDlyResume()取取消了延延時,它它就會立立即進入入就緒狀狀態(tài)。只只有當該該任務在在所有就就緒任務務中具有有最高的
19、的優(yōu)先級級時,它它才會立立即運行行。恢復延延時的任任務函數數OSTimeDlyResume()COS-II具有有允許結結束正處處于延時時期的任任務的功功能。具具體方法法是通過過調用OSTimeDlyResume()和指指定要恢恢復的任任務的優(yōu)優(yōu)先級的的方式,這樣延延時的任任務就可可以不用用等待延延時期滿滿,而是是通過其其他任務務取消延延時來使使自己處處于就緒緒態(tài)。實實際上,OSTimeDlyResume()也也可喚醒醒正在等等待事件件的任務務。按時、分、秒秒、毫秒秒延時函函數OSTimeDlyHMSM()OSTimeDly()是一一個非常常有用的的函數,但用戶戶的應用用程序須須要知道道延時時時
20、間所對對應的時時鐘節(jié)拍拍的數目目。增加加了OSTimeDlyHMSM()函數數后,就就可按時時、分、秒和毫毫秒來定定義時間間了,這這樣會顯顯得更加加方便。與OSTimeDly()一樣,調用OSTimeDIyHMSM()函函數也會會使COS-II進行一一次任務務調度,并且執(zhí)執(zhí)行下一一個優(yōu)先先級最高高的就緒緒態(tài)任務務。任務務調用OSTimeDlyHMSM()后后,一旦旦規(guī)定的的時間期期滿或有有其他任任務通過過調用OSTimeDlyResme()取消消了延時時,它就就會立即即處于就就緒態(tài)。同樣,只有當當該任務務在所有有就緒態(tài)態(tài)任務中中具有最最高的優(yōu)優(yōu)先級時時,它才才會立即即運行。系統時時間函數數OS
21、TimeGet()和和OSTimeSet()無論時鐘鐘節(jié)拍何何時發(fā)生生,COS-II都會將將一個32位的的計數器器加1。這個計計數器在在調用OSStart()初初始化多多任務和和4294967295個節(jié)節(jié)拍執(zhí)行行完一遍遍后,從從0開始始計數。在時鐘鐘節(jié)拍頻頻率等于于100Hz時時,這個個32位位的計數數器每隔隔497天就重重新開始始計數。在執(zhí)行行的過程程中可以以通過調調用OSTimeGet()函數來來獲得該該計數器器的當前前值,也也可以通通過調用用OSTimeSet()函函數來改改變該計計數器的的值。2、任務務的管理理COS-II提過過大量的的API函數實實現對任任務的管管理,主主要的任任務有
22、:(1)建建立任務務COS-II要管管理用戶戶的任務務,就必必須先建建立任務務。通過過將任務務的地址址和其他他參數傳傳遞給以以下兩個個函數來來建立任任務。OSTaskCreate()和帶帶有擴展展附加功功能的OSTaskCreateExt()函數數。在main()函函數內開開始多任任務調度度(OSStart()前,必須至至少建立立一個任任務,而而且任務務不能由由中斷服服務程序序(ISR)建建立。創(chuàng)建一個個任務控控制塊,并通過過任務控控制塊把把任務代代碼和任任務堆棧棧關聯起起來形成成一個完完整的任任務。還還有使剛剛創(chuàng)建的的任務進進入就緒緒狀態(tài),并引發(fā)發(fā)一次任任務調度度(取決決于任務務是否處處于多
23、多多任務工工作狀態(tài)態(tài))。兩個函數數OSTaskCreate()和和OSTaskCreateExt()原原型如下下:INT8UOSTaskCreate(void (*task)(void*pd);/指向任任務的指指針void *pdata;/傳遞給給任務的的參數OS_STK*ptos;/指向向任務堆堆棧棧頂頂的指針針I(yè)NT8Uprio/任務的的優(yōu)先級級 )INT8UOSTaskCreateExt(void (*task)(void*pd);/指向向任務的的指針void *pdata;/傳傳遞給任任務的參參數OS_STK*ptos;/指向任任務堆棧棧棧頂的的指針I(yè)NT8Uprio/任務的的優(yōu)先級級
24、INT16Uid/任務的的標識OS_STK*pbos;/指向向任務堆堆棧棧低低的指針針I(yè)NT32Ustk_siaze;/任務務堆棧容容量void*pext;/指指向附加加數據域域的指針針I(yè)NT16Uopt/用于于設定操操作選項項)在調用任任務建立立函數后后,COS-II內核核會首先先從TCB空閑閑列表內內申請一一個空的的TCB指針;然后根根據用戶戶給出的的參數初初始化任任務堆棧棧,并在在內部的的任務就就緒表中中標記該該任務為為就緒狀狀態(tài);最最后返回回。這樣樣就建立立了一個個任務。(2)任任務堆棧棧在COS-II中中,每個個任務都都有自己己的堆棧??臻g。堆棧必必須聲明明為OS_STK類型型,并且
25、且由連續(xù)續(xù)的內存存空間組組成??煽梢造o態(tài)態(tài)分配堆堆棧空間間(在編編譯時分分配),也可以以動態(tài)分分配堆棧??臻g(在運行行時分配配),這這兩種聲聲明方式式都應放放置在函函數外面面。任務所需需堆棧的的容量由由應用程程序確定定。但必必須考慮慮到任務務調用的的所有函函數的嵌嵌套情況況、任務務調用的的所有函函數為局局部變量量分配的的所有內內存的數數目,以以及所有有可能的的中斷服服務子程程序嵌套套對堆棧棧的需求求。此外外,堆棧棧必須能能夠保存存CPU所有的的寄存器器。COS-II提供供了堆棧棧檢驗函函數OSTaskStkChk(),用來來確定任任務實際際需要的的堆棧空空間的大大小。這這樣能夠夠避免為為任務分
26、分配過多多的堆棧棧空間,從而減減少應用用程序代代碼所需需的RAM數量量。調用用堆棧檢檢驗函數數后,所所得到的的只是一一個大致致的堆棧棧使用情情況,并并不能說說明堆棧棧使用的的全部實實際情況況。為了了適應系系統以后后的升級級和擴展展,應該該多分配配10100的的堆??湛臻g。(3)任任務的掛掛起和恢恢復掛起一個個任務,就是停停止這個個任務的的運行。在C/OS-II中,用用戶任務務可以通通過調用用系統提提供的函函數OSTaskSuspend()來掛掛起自身身或者除除空閑任任務之外外的其他他任務。掛起的的任務,只能在在其他任任務中通通過調用用恢復函函數OSTaskResume()使其恢恢復為就就緒狀態(tài)
27、態(tài)。但是,如如果任務務在被掛掛起的同同時還在在等待延延遲時間間到,則則需要對對任務取取消掛起起操作,并且要要繼續(xù)等等待延遲遲時間到到,任務務才能轉轉入就緒緒狀態(tài)。(4)任任務的刪刪除刪除一個個任務,就是把把該任務務置于睡睡眠狀態(tài)態(tài),任務務的代碼碼不再被被C/OS-II使使用,而而并不是是說任務務的代碼碼被刪除除了。調調用OSTaskDel()后,先先進行條條件判斷斷,當所所有的條條件都滿滿足后,就會從從所有可可能的C/OS-II的數數據結構構中去除除任務的的任務控控制塊OS_TCB,這樣就就不會被被其他的的任務或或中斷服服務子程程序置于于就緒態(tài)態(tài),即任任務置于于休眠狀狀態(tài)。函數原型型如下:IN
28、T8UOSTaskDel(INT8Uprio)可刪除任任務自身身或者除除了空閑閑任務之之外的其其他任務務。刪除除自己參參數為: OS_PRIO_SELF直接調用用這樣的的刪除任任務,可可能出現現某些問問題,如如果任務務擁有一一些動態(tài)態(tài)的內存存或者信信號量之之類的資資源,那那么如果果它被刪刪除了,它的資資源就不不會被釋釋放而丟丟失,會會造成同同樣使用用資源的的其他任任務進入入死等待待,出現現錯誤情情況。要要慎重使使用。提提供了一一個可以以在請求求刪除方方和被刪刪除方通通信完成成刪除的的函數。原型如如下:INT8UOSTaskDelReq(INT8Uprio)返返回是否否被刪除除和是否否有要刪刪除
29、自己己的要求求。被刪刪除方調調用得知知要刪除除自己,釋放資資源后,在刪除除自己。(5)其其他任務務管理函函數任務優(yōu)先先級別修修改任務運行行過程中中,用戶戶可以根根據需要要來改變變任務的的優(yōu)先級級別。調調用的函函數原型型如下:INT8UOSTaskChangePrio(INT8Uoldprio;/任務務現在的的優(yōu)先級級別INT8Unewprio/要要修改的的優(yōu)先級級別)查詢任務務的信息息查詢一些些任務中中的信息息,函數數原型如如下:INT8UOSTaskQuery(INT8Uprio;OS_TCB*pdata)3、任務務間同步步與通信信的管理理C/OS-II中,使用信信號量、郵箱(消息郵郵箱)和
30、和消息隊隊列來實實現任務務相互同同步或相相互之間間的通信信。C/OS-II把關關于它們們的操作作都定義義為全局局函數,以供應應用程序序的所有有任務來來調用.等待任務務列表采用INT8U類型的的數組OSEventTbl作為記錄錄等待事事件任務務的記錄錄表,叫叫做等待待任務表表,每個個任務占占1位,為1表表示是等等待任務務。任務的等等待時限限,記錄錄在等待待任務的的任務控控制塊TCB的的成員OSTCBDly中(1)事事件控制制塊C/OS-II使用用叫做事事件控制制塊ECB的數數據結構構來描述述諸如信信號量、郵箱和和消息隊隊列這些些事件。事件控控制塊包包含包括括等待任任務表在在內的所所有有關關事件的
31、的數據。操作事件件控制塊塊的函數數C/OS-II有4個對事事件控制制塊進行行基本操操作的函函數(定定義在OS_CORE.C中中)。事件控制制塊的初初始化函函數void OS_EventWaitListInit(OS_ENENT *pevent )把變量OSEventGrp及任務務等待表表中的每每一位都都清0,即令事事件的任任務等待待表中不不含有任任何等待待任務。該函數數被OSXXXCreate()創(chuàng)創(chuàng)建時所所調用。XXXSem信信號號量Mutex互互斥信信號量Mbox消消息郵郵箱Q消消息隊隊列使一個任任務進入入等待狀狀態(tài)的函函數void OS_EventTaskWait( OS_ENENT *
32、pevent)將在任務務調用函函數OSXXXPend()請求一一個事件件時調用用。使一個正正在等待待任務進進入就緒緒狀態(tài)的的函數INT8UOS_EventTaskRdy( OS_EVENT *pevent,void*msg,INT8Umsk)作用:把把調用這這個函數數的任務務在任務務等待表表中的位位置清0后,再再把任務務在任務務就緒表表中的對對應的位位置1,然后引引發(fā)一次次任務調調度將在任務務調用函函數OSXXXPost()發(fā)送一一個事件件時,被被調用。使一個等等待超時時的任務務僅需就就緒狀態(tài)態(tài)的函數數void OS_EventTo(OS_EVENT*pevent)作用:當當任務已已經超過過了
33、等待待的時間間,卻要要使它進進入就緒緒狀態(tài)。將在任務務調用函函數OSXXXPend()請求一一個事件件時,被被調用。(2)信信號量管管理使用信號號量可以以在任務務間傳遞遞信息,實現任任務與任任務或中中斷服務務子程序序的同步步。C/OS-II中的的信號量量由兩部部分組成成:16位的無無符號整整數信號號量的計計數值(065535);另一部部分是由由等待該該信號量量的任務務組成的的等待任任務列表表。C/OS-II提供供了以下下6個函函數對信信號量進進行操作作。操作創(chuàng)建信號號量OSSemCreat(INT16U cnt)創(chuàng)創(chuàng)建,返返回已創(chuàng)創(chuàng)建信號號量的指指針。請求信號號量OSSemPend(OS_EV
34、ENT*pevent,INT16Utimeout,NT8U*err)time為0,則表示示無限等等待。不等待調調用的函函數為OSSemAccept(OS_EVENT* pevent)。發(fā)送信號號量INT8UOSSemPost(OS_EVENT*pevent)當獲得信信號量,訪問共共享資源源結束以以后,釋釋放信號號量,調調用該函函數。先先檢查是是否有等等待該信信號量的的任務。沒有,信號量量計數器器加1,有,則則調用調調度器OS_Sched()。刪除信號號量OS_EVENT*OSSemDel( OS_EVENT *pevent,INT8Uopt, INT8U *err)optOS_DEL_NO_P
35、END沒沒有等等待任務務刪除OS_DEL_ALLWAYS立立即刪刪除只能任務務執(zhí)行,不能在在中斷服服務程序序中刪除除查詢信號號量的狀狀態(tài)INT8UOSSemQuery(OS_EVENT* pevent,OS_SEM_DATA *pdata)pdata是一一個結構構指針,存儲信信號量的的狀態(tài)。(3)消消息郵箱箱管理消息郵箱箱是C/OS-II中的一一種通信信機制,通常使使用時要要先定義義一個指指針型的的變量該該指針指指向一個個包含了了消息內內容的特特定數據據結構。發(fā)送消消息的任任務或中中斷服務務子程序序把這個個變量送送往郵箱箱,接收收消息的的任務從從郵箱中中取出該該指針變變量,完完成信息息交換。
36、C/OS-II提供6種對消消息郵箱箱的操作作,它們們通過以以下函數數實現:創(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)先先級請求消息息郵箱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)消消息隊列列管理消息隊列列是C/OS-II的另一一種通信信機制,它可以以使一個個任務或或中斷服服務子程程序向另另一個任任務發(fā)送送以指針針定義的的變量。 C/OS-II提供了了9個對對消息隊隊列進行行操作的的函數。創(chuàng)建先創(chuàng)建一一個指針針數組,然后用用該數組組來創(chuàng)建建消息隊隊列OS_EVEN
38、TOSQCreate( void*start,INT16U size)請求消息息隊列void*OSQPend(OS_EVENT *pevent,INT16Utimeout,INT8U*err)向消息隊隊列發(fā)送送消息INT8UOSQPost(OS_EVENT *pevent,void*msg)工作方式式FIFOINT8UOSQPostFront(OS_EVENT*pevent,void* msg)工作方式式LIFO發(fā)送廣播播消息INT8UOSQPostOpt(OS_EVENT *pevent,void*msg,INT8Uopt)清空消息息隊列INT8UOSQFlsh( OS_EVENT *pev
39、ent )刪除消息息隊列OS_EVENT* OSQDel(OS_EVENT*pevent)查詢消息息隊列INT8UOSQQuery(OS_EVENT*pevent,OS_Q_DATA*pdata)COS-II操作作系統的的文件體體系結構構如圖2所示,其核心心主要可可分為以以下3部部分:(1)應應用軟件件層,指指的是基基于COS-II的應用用程序代代碼。(2)內內核的核核心代碼碼層,主主要包括括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,其其主要實實
40、現的功功能分別別是核心心管理、事件管管理、存存儲管理理、消息息隊列管管理、定定時管理理、信號號量處理理、消息息管理和和任務調調度等,這部分分代碼與與處理器器無關。(3)系系統設置置與移植植層。系系統設置置部分的的代碼由由兩個頭頭文件OS_CFG.H和INCLDES.H組成。其主要要功能是是用來配配置事件件控制塊塊的數目目以及是是否包含含消息管管理的相相關代碼碼等。與與處理器器相關的的移植代代碼部分分包括:一個頭頭文件OS_CPU.H、一一個匯編編文件OS_CPU_A.ASM和和一個C代碼文文件OS_CPU_C.C。系統設設置與移移植層與與具體應應用和處處理器相相關,在在隨后的的COS-II的的
41、移植和和開發(fā)過過程中,用戶所所需要關關注的就就是這部部分文件件。4、COS-II操作系系統的文文件系統統圖2COS-II文文件體系系結構6.1.4COS-II操操作系統統的初始始化在調用COS-II操作作系統的的其他服服務之前前,COS-II操作系系統要求求用戶首首先調用用系統初初始化函函數OSInit()。執(zhí)行行OSInit()函函數后將將初始化化COS-II所所有的變變量和數數據結構構,另外外OSInit()會會建立空空閑任務務,并且且這個任任務總是是處于就就緒狀態(tài)態(tài)的??湛臻e任務務OSTaskldle()函數的的優(yōu)先級級總是設設置成為為最低級級別,即即OS_LOWEST_PRIO。多任務
42、的的啟動是是用戶通通過調用用OSStart()函數來來實現的的。然而而,在啟啟動COS-II之前,用戶至至少要建建立一個個應用任任務,例例如:void main()OSInit();.通過OSTaskCreate()或OSTaskCreateExt()創(chuàng)建至至少一個個任務.OSStart();/*開始始多任務務調度,OSStart()永遠都都不會返返回*/1.C/OS II基礎2.C/OS II移植3.嵌入入式系統統的初始始化操作作第六章C/OSII程程序設計計基礎6.2COS-II系系統在ARM系系統中的的移植所謂移植植,就是是指使一一個實時時操作系系統能夠夠在其他他的微處處理器平平臺上進進
43、行運行行。由于于COS-II的的主要代代碼都是是由標準準的C語語言寫成成的,所所以,一一般來說說移植過過程并不不復雜。6.2.1COS-II移植植條件雖然COS-II的大部部分源代代碼是用用C語言言寫成的的,但是是,仍需需要用匯匯編語言言完成一一些與微微處理器器相關的的代碼。例如,COS-II在在讀寫微微處理器器、寄存存器時只只能通過過匯編語語言來實實現。這這是因為為COS-II在在設計的的時候就就已經充充分考慮慮了可移移植性。為了要要使COS-II可以正正常工作作,處理理器必須須要滿足足如下要要求:1)微微處理器器的C編編譯器能能產生可可重入代代碼可重入的的代碼指指的是一一段代碼碼(如一一個
44、函數數)可以以被多個個任務同同時調用用,而不不必擔心心會破壞壞其內部部的數據據。也就就是說,可重入入型函數數在任何何時候都都可以被被中斷執(zhí)執(zhí)行,也也不會因因為在函函數中斷斷的時候候被其他他的任務務重新調調用,影影響函數數中的數數據??煽芍厝氪a或者者只使用用局部變變量,即即變量保保存在CPU寄寄存器中中或堆棧棧中;或或者使用用全局變變量,則則要對全全局變量量予以保保護。通常的C編譯器器,把局部變量量分配在棧棧中。所所以,多多次調用用同一個個函數,可以保保證每次次的局部部變量互互不受影影響。而而全局變量量,在多次次調用函函數的時時候,必必然受到到影響。代碼的可可重入性性是保證證完成多多任務的的
45、基礎,除了在在C程序序中使用用局部變變量以外外,還需需要C編編譯器的的支持?;贏RM的的SDT、ADS等集集成開發(fā)發(fā)環(huán)境,都可以以生成可可重入的的代碼。2)在在程序中中可以使使用c語語言打開開或者關關閉中斷斷在COS-II中中,可以以通過進進入中斷斷屏蔽的的宏定義義OS_ENTER_CRITICAL()或者者退出中中斷屏蔽蔽的宏定定義OS EXIT_CRITICAL()來控控制系統統關閉中中斷或者者打開中中斷,這這需要微微處理器器的支持持。在目目前的ARM系系列的微微處理器器上,都都可以設設置相應應的寄存存器來關關閉或者者打開系系統的所所有中斷斷。3)微微處理器器支持中中斷,并并且能產產生定
46、時時中斷(通常在在10Hz-1000Hz之之間)。COS-II是是通過微微處理器器產生定定時的中中斷來實實現多任任務之間間的調度度的。4)微微處理器器支持能能夠容納納一定量量數據的的硬件堆堆棧,并并具有將將堆棧指指針和其其他CPU寄存存器讀寫寫到堆棧棧(或者者內存)的指令令。5)COS-II進行行任務調調度的時時候,會會把當前前任務的的CPU內部寄寄存器的的內容存存放到此此任務的的堆棧中中。然后后,再從從另一個個任務的的堆棧中中恢復原原來的工工作寄存存器,繼繼續(xù)運行行另一個個任務。所以,寄存器器中內容容的入棧棧和出棧棧是COS-II多任務務調度的的基礎。6.2.2COS-II的移移植步驟驟在的
47、移植植過程中中,使用用的是基基于ARM公司司架構的的軟件開開發(fā)工具具作為編編譯器,所值得得關注的的問題是是與微處處理器相相關的代代碼,這這部分主主要包括括一個頭頭文件OS_CPU.H、一一個匯編編文件OS_CPU_A.ASM和和一個C代碼文文件OS_CPU_C.C。1設置置頭文件件OS_CPU.H中中與處理理器和編編譯器相相關的代代碼(1)與與編譯器器相關的的數據類類型#define INT8Uunsignedchar#define INTl6Uunsignedshort#define INT32Uunsignedlong#define OS_STKunsignedlong#define BO
48、OLEANint#define OS_CPU_SRunsignedlong#define INT8Schar因為不同同的微處處理器有有不同的的字長,所以COS-的移植植包括了了一系列列的類型型定義以以確保其其可移植植性。用戶必須須將任務務堆棧的的數據類類型定義義到COS-II操作系系統中,這個過過程是通通過為OS_STK聲聲明正確確的C語語言數據據類型來來完成的的。由于于使用的的微處理理器上的的堆棧成成員是16位的的,所以以將OS_TSK聲明明為無符符號整形形數據類類型。值值得注意意的是,所有的的任務堆堆棧都必必須使用用OS_STK聲明數數據類型型。(2)進進入中斷斷屏蔽的的宏定義義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();與所有的的實時內內核一樣樣,COS-II操作系系統在進進行任務務切換時時需要先先禁止中中斷在訪訪問代碼碼的臨界界區(qū),并并且在訪訪問完畢畢后重新新允許中中斷。這這就使得得COS-II能能夠保護護臨界區(qū)區(qū)代碼免免受多任任務或中
50、中斷服務務例程(ISR)的破破壞。在在S3C44B0微處處理器上上是通過過OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()兩兩個函數數來實現現開、關關中斷的的。(3)棧棧增長方方向標OS_STK_GROWTH#define OS_STK_GROWTH1#define STACKSIZE256絕大多數數的微處處理器的的堆棧是是從高地地址向低低地址增增長的,但是有有些微處處理器是是采用相相反方式式工作的的。鑒于于這種情情況COS-II操作系系統被設設計成為為這兩種種情況都都可以處處理,只只要在結結構常量量OS_STK_GROWTH中指指定堆棧棧的生長長方式就就可以了了。
51、例如如:設OS_STK_GROWTH為0表示堆堆棧從下下往上增增長。設OS_STK_GROWTH為1表示堆堆棧從上上往下增增長。2.用用匯編語語言在OS_CPU_A.ASM文文件中編編寫4個個與微處處理器相相關的函函數(1)調調用用優(yōu)先級級最高的的就緒任任務函數數 OSStartHighRdy()(2)任任務級的的任務切切換函數數 OSCtxSw()(3)中中斷級的的任務切切換函數數 OSIntCtxSw()(4)時時鐘節(jié)拍拍中斷服服務函數數 OSTickISR()3用C語言編編寫6個個操作系系統相關關的函數數(OS_CPU_C.C)這里主要要涉及6個函數數:OSTaskStkInit()、O
52、STaskCreateHook()、OSTaskDelHook()、OSTaskSwHook()、OSTaskStatHook()及及OSTimeTickHook()。這些函數數中,惟惟一必須須移植的的是任務務堆棧初初始化函函數OSTaskStkInit()。這這個函數數在任務務創(chuàng)建時時被調用用,負責責初始化化任務的的堆棧結結構并返返回新堆堆棧的指指針stk。在在ARM體系結結構下,任務堆堆??臻g間由高至至低依次次保存著著PC、LR、R12、R11、R10、R1、R0、CPSR及SPSR。堆棧棧初始化化工作結結束后,返回新新的堆棧棧棧頂指指針。以下5個個Hook函數數,又稱稱為鉤子子函數,主要
53、用用來擴展展COS-功能能,使用用前必須須被聲明明,但并并不一定定要包含含任何代代碼。(1)0STaskCreateHook()函數數當用OSTaskCreate()函數或或OSTaskCreateExt()函函數建立立任務時時,就會會調用OSTaskCreateHook()函函數。COS-設置完完自己的的內部結結構后,會在調調用任務務調度程程序之前前調用OSTaskCreateHook()函函數。該該函數被被調用時時中斷是是禁止的的,因此此應盡量量減少該該函數中中的代碼碼,以縮縮短中斷斷的響應應時問。(2)OSTaskDelHook()函數數當任務被被刪除時時,就會會調用OSTaskDelH
54、ook()函函數。該該函數在在把任務務從COS-的的內部任任務鏈表表中解開開之前被被調用。當OSTaskDelHook()函數數被調用用時,會會收到指指向正被被刪除任任務的OS_TCB的的指針,這樣它它就可訪訪問所有有的結構構成員了了。OSTaskDelHook()函數數可用來來檢驗TCB擴擴展是否否被建立立了(一一個非空空指針),并進進行一些些清除操操作。注注意,此此函數不不返回任任何值。(3)OSTaskSwHook()函數當發(fā)生任任務切換換時,調調用OSTaskSwHook()函數。不管任任務切換換是通過過OSCtxSw()函數,還是通通過OSIntCtxSw()函數數來執(zhí)行行的,都都會
55、調用用該函數數。OSTaskSwHook()函數可可直接訪訪問OSTCBCr和OSTCBHighRdy,這這是因為為它們都都是全局局變量。OSTCBCr指指向被切切換出去去的任務務的OS_TCB,而而OSTCBHighRdy指向新新任務的的OS_TCB。在調用OSTaskSwHook()函數數期間,中斷一一直是被被禁止的的。這時時因為代代碼的多多少會影影響到中中斷的響響應時間間,所以以應盡量量使代碼碼簡化。此函數數沒有任任何參數數,也不不返回任任何值。(4)OSTaskStatHook()函函數OSTaskStatHook()函數每每秒都會會被OSTaskStat()函數數調用一一次,可可用O
56、STaskStatHook()函函數來擴擴展統計計功能。該函數數沒有任任何參數數,也不不返回任任何值。(5)OSTimeTickHook()函函數OSTimeTickHook()函數在在每個時時鐘節(jié)拍拍都會被被0STimeTick()函數調調用。實實際上,OSTimeTickHook()函數數是在節(jié)節(jié)拍被COS-處理,并在通通知用戶戶的移植植實例或或應用程程序之前前被調用用的。OSTimeTickHook()函數沒沒有任何何參數,也不返返回任何何值。1.C/OS II基礎2.C/OS II移植3.嵌入入式系統統的初始始化操作作第六章C/OSII程程序設計計基礎6.2.3C/OS-IIBSP編寫
57、BSP(板級支支持包)是介于于底層硬硬件和操操作系統統之間的的軟件層層次,它它完成系系統上電電后最初初的硬件件和軟件件初始化化,并對對底層硬硬件進行行封裝,使得操操作系統統不再面面對具體體的操作作。BSP的的特點:硬件相關關性:因因為嵌入入式實時時系統的的硬件環(huán)環(huán)境具有有應用相相關性,所以,作為高高層軟件件與硬件件之間的的接口,BSP必須為為操作系系統提供供操作和和控制具具體硬件件的方法法。操作系統統相關性性:不同同的操作作系統具具有各自自的軟件件層次結結構,因因此,不不同的操操作系統統具有特特定的硬硬件接口口形式。嵌入式系系統初始始化過程程及BSP功能能初始化程程序的下下載執(zhí)行行目標機宿主機
58、1)通過過編程器器將可執(zhí)執(zhí)行目標標文件燒燒寫到BootROM(ROM、EPROM、FLASH)等等;2)通過過串行口口和網口口下載執(zhí)執(zhí)行目標標文件,要求宿宿主機系系統上有有數據傳傳輸工具具程序、目標機機裝載器器、嵌入入式監(jiān)視視器或目目標機系系統上的的調試代代理。3)通過過JTAG或BDM接接口下載載;嵌入式系系統的初初始化過過程嵌入式系系統的初初始化過過程硬件初始始化階段段1、復位位向量 ENTRYb ResetHandler;fordebugb Handlerundef;handlerundefb HandlerSWI;SWIinterrupthandlerb HandlerPabort;h
59、andlerPAbortb HandlerDabort;handlerDAbortb;handlerReservedb HandlerIRQb HandlerFIQ嵌入式系系統的初初始化過過程(2)硬件初始始化階段段2、最小小硬件初初始化1)設置置適當的的寄存器器,使嵌嵌入式處處理器處處于一個個已知的的狀態(tài):獲得CPU的類類型;獲得或設設置CPU的時時鐘頻率率。2)禁止止中斷和和高速緩緩存3)初始始化內存存控制器器、內存存芯片和和高速緩緩存單元元,包括括:得到內存存的開始始地址;得到內存存的大小??;如果有要要求,則則還需要要進行主主存測試試;嵌入式系系統的初初始化過過程(3)硬件初始始化階段段
60、3、其余余硬件初初始化1)引導導代碼調調用合適適的函數數對目標標機系統統上的全全部硬件件部件進進行初始始化,包包括:建立執(zhí)行行處理程程序初始化中中斷處理理程序初始化總總線接口口初始化板板級外設設得到內內存的開開始地址址;嵌入式系系統的初初始化過過程(4)RTOS初始化化階段4、RTOS初初始化1)RTOS初初始化2)RTOS對對象和服服務初始始化任務信號量定時器中斷內存管理理3)RTOS任任務堆棧棧初始化化4)RTOS擴擴展部件件初始化化5)啟動動RTOSARM7TDMI系統統初始化化的一般般過程啟動(系系統上電電/復位位)從程序入入口點關閉中斷斷初始化時時鐘等硬硬件相關關寄存器器初始化存存儲
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個性化司機勞動協議范本版B版
- 二零二五版旅游行業(yè)擔保換期權合作協議3篇
- 2025年度智能樓棟能源管理系統移交及運維服務協議4篇
- 二零二五年度綠色建筑材料買賣擔保合作協議3篇
- 二零二四年廢木料回收與加工合作協議范本3篇
- 二零二五年綠色櫥柜研發(fā)與推廣合作協議3篇
- 專業(yè)冷藏庫租賃協議樣本版
- 二零二五年度新能源車輛采購合同補充協議4篇
- 2024版商標使用許可合同
- 2025年度新型能源設備購買合作協議4篇
- 三年級數字加減法巧算
- GB/T 9755-2001合成樹脂乳液外墻涂料
- GB/T 10609.3-1989技術制圖復制圖的折疊方法
- GB 4053.2-2009固定式鋼梯及平臺安全要求第2部分:鋼斜梯
- 通力電梯培訓教材:《LCE控制系統課程》
- 佛山市內戶口遷移申請表
- 品管圈PDCA持續(xù)質量改進提高靜脈血栓栓塞癥規(guī)范預防率
- 一次函數單元測試卷(含答案)
- 陜西省榆林市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細
- 天車設備維護檢修標準設備維護檢修規(guī)程
- 中國智能物聯網(AIoT)研究報告
評論
0/150
提交評論