




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、. . . . 1緒論1.1 背景概要在計算機技術和信息技術高速發(fā)展的今天,計算機和計算機技術,大量應用于人們的日常生活中。其中,以計算機主機嵌入于應用系統(tǒng)或設備之中為特征的嵌入式應用更是令人矚目。嵌入式系統(tǒng)已經(jīng)廣泛滲透到人們的工作、生活中,包括家用電器、手持通訊設備、信息終端、儀器儀表、汽車、航空航天、軍事、制造工業(yè)、過程控制等領域。嵌入式系統(tǒng)具有便利靈活、性能價格比高、嵌入性強等特點,可以嵌入到現(xiàn)有任何家電和工業(yè)控制系統(tǒng)中。從軟件角度來看,嵌入式系統(tǒng)具有系統(tǒng)所需配置要求較低、系統(tǒng)專業(yè)性和實時性較強等特點。隨著嵌入式技術的蓬勃發(fā)展,計算機工業(yè)也正邁入一個充滿挑戰(zhàn)和機遇的階段后PC時代。后PC
2、時代是一個真實的階段,而且是一個可以預測的時代。 uC/OS-II是由美國人Jean J.Labrosse編寫的一個公開源代碼的,微核嵌入式實時操作系統(tǒng),其實時性能和核的健壯性早已經(jīng)在大量的實際應用中得到了證實。程序開發(fā)人員可以改寫源代碼,使之符合自己的要求。裁減掉不需要的部分,使操作系統(tǒng)變得小巧、靈活,并且能滿足用戶特定操作系統(tǒng)的需要。uC/OS對于學校研究完全免費,只有在應用于盈利項目時才需要支付少量的費,特別適合一般使用者的學習、研究和開發(fā)1。1.2研究平臺與開發(fā)環(huán)境本論文基于源代碼公開的嵌入式實時操作系統(tǒng)uC/OS-II。使用的主機是PC機,運行的操作系統(tǒng)是Windows XP,使用的
3、開發(fā)環(huán)境是Borland C/C+ V3.1。1.3 論文的組織結構論文共分六章,其組織結構為:第一章是緒言。主要講述了本題目的背景。第二章是嵌入式實時操作系統(tǒng)綜述。此章對嵌入式系統(tǒng)的發(fā)展做了回顧,然后概要的分析闡述了嵌入式系統(tǒng)的硬件部分的特點,嵌入式實時操作系統(tǒng)的特點和因為它的出現(xiàn),給嵌入式系統(tǒng)開發(fā)帶來的巨大變化。第三章是實時操作系統(tǒng)uC/OS-II的分析。本章對uC/OS-II的各個模塊以與移植性進行了系統(tǒng)的分析。第四章是uC/OS-II移植的應用。在這一章里,詳細闡述了將uC/OS-II移植到PC機上的具體步驟。第五章是uC/OS-II的測試程序。通過一個例子,測試所移植的uC/OS-I
4、I能夠正常工作,并且反映出操作系統(tǒng)的多任務調(diào)度、任務切換等。第六章是結束語,對整篇論文進行了簡短總結,并提出了進一步的改進設想。2 嵌入式實時操作系統(tǒng)綜述2.1 嵌入式系統(tǒng)的產(chǎn)生與發(fā)展早在20世紀60年代后期,通信領域里就出現(xiàn)了“存儲程序控制”系統(tǒng),這是早期的嵌入式系統(tǒng)。這時的計算機是面向具體應用定做的,它們是一些專用指令的引擎以與與之集成在一起的I/O設備。軟件是由存儲在存的程序和路由信息組成。隨著微處理器的出現(xiàn),硬件體系結構引入了總線概念,不同外設可掛接在一起。與此同時,軟件也得到了發(fā)展,70年代中期開始采用軟件模塊和標準庫的編程思想。20世紀70年代后期,專用于嵌入式系統(tǒng)的操作系統(tǒng)開始出
5、現(xiàn),當時大部分是用匯編語言寫的,僅能用于特定的微處理器。當新的處理器出現(xiàn),則必須為之重新寫一遍。直到C語言出現(xiàn)后,嵌入式操作系統(tǒng)才可以用一種高效、穩(wěn)定和可移植的方式來開發(fā)。20世紀80年代,嵌入式商業(yè)操作系統(tǒng)開始得到蓬勃發(fā)展。如今已有幾十種商業(yè)操作系統(tǒng)可供選擇,出現(xiàn)了許多相互競爭的產(chǎn)品,如Vxworks,Psos,Neculeus、Windows CE、和各種嵌入式Linux等。近年來,嵌入式軟件涉與的面也愈發(fā)擴大。它不僅包括嵌入式操作系統(tǒng)等系統(tǒng)軟件,還包括一系列支撐軟件,如數(shù)據(jù)庫、調(diào)試軟件、網(wǎng)絡通訊協(xié)議、用戶界面系統(tǒng)等,當然也包括各種應用軟件。隨著信息技術的飛速發(fā)展,嵌入式系統(tǒng)具有了新的涵,
6、同時萌生了許多形態(tài)各異的接入設備,如手持電腦、可上網(wǎng)的無線移動手機、機頂盒、家庭網(wǎng)關、可上網(wǎng)的電視機、可上網(wǎng)的車載盒、智能家用電器等。相應的對嵌入式軟件也提出了與最初不同的要求2。2.2 嵌入式實時操作系統(tǒng)嵌入式實時操作系統(tǒng)并不是簡單嵌入的操作系統(tǒng),它與通用操作系統(tǒng)有本質(zhì)區(qū)別。嵌入式實時操作系統(tǒng)必須體現(xiàn)其所在系統(tǒng)的特征,能夠通過裝卸某些模塊來達到系統(tǒng)所要求的功能。與通用的操作系統(tǒng)相比,嵌入式實時操作系統(tǒng)具有如下一些特征:1.體積小。嵌入式系統(tǒng)所能提供的資源有限,尤其是存資源,所以嵌入式操作系統(tǒng)必須做到小巧以滿足嵌入式系統(tǒng)硬件的限制。2.實時性。大多數(shù)嵌入式系統(tǒng)工作在實時性要求很高的環(huán)境中,這就
7、要求嵌入式操作系統(tǒng)必須將實時性作為一個重要的方面來考慮。3.可裝卸。由于嵌入式系統(tǒng)需要根據(jù)應用的要求進行裝卸,所以嵌入式操作系統(tǒng)也必須能夠根據(jù)應用的要求進行裝卸,去掉多余的部分。4.固化代碼。在嵌入式系統(tǒng)中,嵌入式操作系統(tǒng)和應用軟件被固化在嵌入式系統(tǒng)計算機的ROM中。輔助存儲器在嵌入式系統(tǒng)中使用很少,因此,嵌入式操作系統(tǒng)的文件管理功能應該能夠很容易地拆卸,取而代之的是各種存文件系統(tǒng)。5.弱交互性。大多數(shù)嵌入式系統(tǒng)的工作過程不需要人的干預。嵌入式操作系統(tǒng)的用戶接口一般不提供操作命令,它通過系統(tǒng)調(diào)用命令向用戶程序提供服務。6.強穩(wěn)定性。嵌入式系統(tǒng)一旦開始運行就不需要人過多的干預。在這種條件下,要求
8、負責系統(tǒng)管理的嵌入式操作系統(tǒng)具有很高的穩(wěn)定性。7.統(tǒng)一的接口。隨著各種各樣的嵌入式操作系統(tǒng)的出現(xiàn),人們有必要為嵌入式系統(tǒng)提供的接口進行約定,從而為嵌入式應用軟件的設計者提供統(tǒng)一的服務接口,為嵌入式應用軟件的運行提供平臺的無關性。在中國,嵌入式操作系統(tǒng)可分為兩大類型:一類是自主的操作系統(tǒng),另一類是基于Linux的操作系統(tǒng)。自主的操作系統(tǒng)方面,國有“女蝸Hopen”操作系統(tǒng)和DeltaOS操作系統(tǒng)等3。2.3 嵌入式系統(tǒng)的硬件特征嵌入式計算機系統(tǒng)的硬件同通用計算機相比具有以下特點:1.嵌入式系統(tǒng)通常是面向特定應用的。嵌入式CPU與通用型的最大不同就是嵌入式CPU大多工作在為特定用戶群設計的系統(tǒng)中,
9、它通常都具有低功耗、體積小、集成度高等特點,能夠把通用CPU中許多由板卡完成的任務集成在芯片部,從而有利于嵌入式系統(tǒng)設計趨于小型化,移植能力大大增強,與網(wǎng)絡的結合也越來越緊密。2.嵌入式系統(tǒng)是將先進的計算機技術、半導體技術和電子技術與各個行業(yè)的具體應用相結合后的產(chǎn)物。這一點就決定了它必然是一個技術密集、資金密集、不斷創(chuàng)新的知識集成系統(tǒng)。3.嵌入式系統(tǒng)的硬件和軟件都必須高效率地設計,量體裁衣、去除冗余,力爭在同樣的硅片面積上實現(xiàn)更高的性能,這樣才能在具體應用中對處理器的選擇更具有競爭力。4.嵌入式系統(tǒng)和具體應用有機地結合在一起,它的升級換代也是和具體產(chǎn)品同步進行,因此嵌入式系統(tǒng)產(chǎn)品一旦進入市場,
10、具有較長的生命周期。5.為了提高系統(tǒng)可靠性,嵌入式系統(tǒng)中的軟件一般都固化在存儲器芯片(外接或CPU置)中,而不是存貯于磁盤等載體中。6.嵌入式系統(tǒng)本身不具備直接開發(fā)能力,即設計完成以后用戶通常是不能對其中的程序功能進行修改的,必須有一套開發(fā)工具和環(huán)境才能進行開發(fā)3。2.4 接入網(wǎng)絡的嵌入式系統(tǒng)在自動化工業(yè)領域,有成千上萬的感應器,檢測器,PLC,讀卡器,或其他設備,互相連接形成一個控制網(wǎng)絡,作為信息系統(tǒng)管理數(shù)據(jù)的工具。而最常用來連接這些設備的通信界面就是RS-232和RS-422/485總線。近幾年來,以太網(wǎng)/互聯(lián)網(wǎng)等網(wǎng)絡架構己逐漸在自動化產(chǎn)業(yè)被廣泛的采用,取代傳統(tǒng)的串口通信而成為自動化系統(tǒng)通
11、信的主流。在這種趨勢下,以TCP/IP和以太網(wǎng)為代表成熟度較高的開放式網(wǎng)絡技術,正逐漸地被應用在各個自動化系統(tǒng),連接并控制所有的設備。嵌入式產(chǎn)品將與互聯(lián)網(wǎng)應用相互促進,快速發(fā)展,嵌入式產(chǎn)品將成為互聯(lián)網(wǎng)的主要終端之一,網(wǎng)上將出現(xiàn)大量的服務于嵌入式產(chǎn)品的軟件,并有專門服務于嵌入式產(chǎn)品的容。對所有設備制造商和設備使用者而言,尋求一個經(jīng)濟、快速的解決方案,讓現(xiàn)有的設備可立即聯(lián)網(wǎng)使用,成為掌握競爭商機的重要課題4。3 實時操作系統(tǒng)uC/OS-II的分析實時操作系統(tǒng)uC/OS -II有如下特點:(1)公開源代碼,且源代碼中有詳細的注釋,源代碼清晰易讀且結構協(xié)調(diào)、組織有序,對實時操作系統(tǒng)的基本原理做了非常詳
12、細的解釋,實時核讓人一目了然,簡單易懂。(2)移植性好,絕大部分uC/OS的源代碼是用移植性很強的ANSI C編寫的,與微處理器件相關的部分是用匯編語言寫的,而且已經(jīng)壓縮到了最低程度,使得uC/OS-II便于移植到其它處理器上。(3)可裁剪,用戶可以根據(jù)自己的寄存器空間的大小和實際需要,只保留uC/OS-II中應用程序需要的那些系統(tǒng)服務,這樣可以大大減少產(chǎn)品中uC/OS-II所需要的存儲器空間(RAM/ROM)。這樣使得uC/OS-II適合中小系統(tǒng),靈活應用。(4)穩(wěn)定性和可靠性高,抗干擾能力強5。3.1 uC/OS-II的核結構3.1.1 uC/OS-II的任務管理uC/OS-II的任務管理
13、包括如何在用戶的應用程序中建立任務、刪除任務、改變?nèi)蝿盏膬?yōu)先級、掛起和恢復任務,以與獲得有關任務的信息。uC/OS-II可以管理多達64個任務,每個任務一個優(yōu)先級,并從中保留了四個最高優(yōu)先級和四個最低優(yōu)先級的任務供自己使用,所以用戶可以使用的只有56個任務。任務的優(yōu)先級越高,其優(yōu)先級的值則越低,任務的優(yōu)先級也可作為任務的標識符使用。uC/OS-II提供的任務管理的各種函數(shù)調(diào)用,包括:創(chuàng)建任務:OSTaskCreate()或者是OSTaskCreateExt();刪除任務:OSTaskDel();改變?nèi)蝿盏膬?yōu)先級:OSTaskChangePrio();掛起任務:OSTaskSuspend();恢
14、復任務:OSTaskResunte();獲得有關任務的信息:OSTaskQuery();系統(tǒng)初始化時會自動產(chǎn)生兩個任務:一個是空閑任務OSTaskIdle(),它的優(yōu)先級最低,為OS_LOWEST_PRIO;另一個是統(tǒng)計任務OSTaskStat(),它的優(yōu)先級為OS_LOWEST_PRIO-1,該任務每秒運行一次,負責計算當前CPU的利用率。當所有任務都處于等待事件發(fā)生或者等待延遲時間結束的狀態(tài)時,uC/OS-II執(zhí)行空閑任務(idle task),即執(zhí)行OSTaskIdle()函數(shù)。uC/OS-II任務調(diào)度按搶占式多任務系統(tǒng)設計的,即它總是執(zhí)行處于就緒條件上優(yōu)先級最高的任務。為了簡化系統(tǒng)的設
15、計,uC/OS-II規(guī)定所有任務的優(yōu)先級必須不同,任務的優(yōu)先級同時唯一的標識了該任務。系統(tǒng)通過兩種方法進行任務調(diào)度:一是時鐘節(jié)拍或其它硬件中斷到來,系統(tǒng)會調(diào)用函數(shù)OSIntCtxSw()執(zhí)行切換功能;二是任務主動進入掛起或等待狀態(tài),這時系統(tǒng)通過發(fā)軟中斷命令或依靠處理器執(zhí)行陷阱指令來完成任務切換,中斷服務例程或陷阱處理程序的向量地址必須指向函數(shù)OSCtxSw()6。3.1.2 uC/OS-II的時間管理uC/OS-II(和其它核一樣)要求用戶提供定時中斷來實現(xiàn)延時與超時控制等功能這個定時中斷叫做時鐘節(jié)拍,它應該每秒發(fā)生10至100次。時鐘節(jié)拍的實際頻率是由用戶的應用程序決定的,時鐘節(jié)拍的頻率越高
16、,系統(tǒng)的負荷就越重。uC/OS-II提供了這樣一個系統(tǒng)服務,申請該服務的任務可以延時一段時間,這段時間的長短是用時鐘節(jié)拍的數(shù)目來確定的。實現(xiàn)這個系統(tǒng)服務的函數(shù)是OSTimeDly()。調(diào)用該函數(shù)會讓uC/OS-II進行一次任務調(diào)度,并執(zhí)行下一個優(yōu)先級最高的就緒態(tài)任務。任務調(diào)用OSTimeDly()后,一旦規(guī)定的時間期滿或者有其他的任務通過調(diào)用OSTimeDlyResume()取消了延時,它就會馬上進入就緒狀態(tài)。uC/OS-II支持的延時最長為65535個節(jié)拍,uC/OS-II允許用戶結束正處于延時期的任務。延時的任務可以不等待延時期滿,而是通過其他任務取消延時來使自己處于就緒態(tài),可以通過調(diào)用O
17、STimeDlyResume()和指定要恢復的任務的優(yōu)先級來完成。3.1.3 uC/OS-II任務間的通信與同步對于一個多任務的操作系統(tǒng)來說,任務間的同步和通信是必不可少的。uC/OS-II提供了四種同步對象,分別是信號量、消息隊列和事件。通過和消息隊列還可以進行任務間的通信。一個任務或者中斷服務子程序可以通過事件控制塊(ECB,Event ControlBlock)來向另外的任務發(fā)信號。這里所有的信號都被看成是事件。一個任務可以等待另一個任務或中斷服務子程序給它發(fā)送信號。多個任務也可以等待同一個事件的發(fā)生,事件發(fā)生后,優(yōu)先級最高的任務得到該事件并進入就緒狀態(tài),準備執(zhí)行。所有的同步對象都有相應
18、的創(chuàng)建、等待、發(fā)送的函數(shù).但這些對象一旦創(chuàng)建就不能刪除,所以要避免創(chuàng)建過多的同步對象以節(jié)約系統(tǒng)資源7。3.1.4 uC/OS-II的存管理存管理是操作系統(tǒng)的另一項重要功能。在uC/OS-II中,為了消除多次動態(tài)分配與釋放,uC/OS-II把連續(xù)的大塊存按分區(qū)來管理。每個分區(qū)中都包含有整數(shù)個大小一樣的存塊,但不同分區(qū)之間存塊的大小可以不同。用戶的應用程序可以從不同的存分區(qū)中得到不同大小的存塊。但是,特定的存塊在釋放時必須重新放回它以前所屬的存分區(qū),通過這種方式,uC/OS-II解決了存碎片問題。為了便于存的管理,uC/OS-II使用存控制塊(memory control block)的數(shù)據(jù)結構來
19、跟蹤每一個存分區(qū),系統(tǒng)中的每個存分區(qū)都有它自己的存控制塊。uC/OS-II也提供了創(chuàng)建存分區(qū)(OSMemCreate()、分配存塊(OSMemGet()、釋放存塊(OSMemPut()、查詢一個存分區(qū)狀態(tài)(OSMemQuery()等函數(shù)調(diào)用。3.2 uC/OS-II的程序結構uC/OS-II是完全嵌入于應用程序中的,以系統(tǒng)調(diào)用的形式向應用程序提供服務。對于應用程序,uC/OS-II提供一系列的函數(shù)調(diào)用,在編譯應用程序時要將uC/OS-II源文件一起編譯、,使得應用程序與uC/OS-II靜態(tài)在一起形成一個系統(tǒng)映象,這時可以稱這個映象為uC/OS-II,此時它己經(jīng)作為靜態(tài)庫到應用程序中去了。在完成
20、系統(tǒng)映象裝入存并且完成CPU寄存器的初始化后(詳情情參閱第四章第一、二節(jié)),會跳轉到函數(shù)main()開始執(zhí)行,在這里完成系統(tǒng)的初始化工作。示例代碼如下:void main(void)/清屏PC_DispClrScr();/向屏幕打印系統(tǒng)啟動信息PC_DispStr(0,0,Welcome to MicroC/OS-II on x86 in protected mode!,14);/初始化時鐘控制器、時鐘中斷控制器;OSCpuInit()/設置中斷描述符表,各核心數(shù)據(jù)結構初始化,包括任務調(diào)度初始化、/任務間通信初始化、存管理初始化、Idle任務和統(tǒng)計任務初始化;OSInit();OSTimerI
21、nit();/創(chuàng)建用戶任務OSTaskCreate(lwip_init_task,(void*)0,&lwip_tsk_stkTASK_STK_SIZE-1,5);/LWIP TASK/調(diào)度最高優(yōu)先級任務開始運行OSStart();3.2.1 向屏幕打印提示信息向屏幕打印系統(tǒng)提示信息的實現(xiàn)函數(shù)是PC_DispStr(),這一步不是必需的,是為了向用戶通知系統(tǒng)開始啟動。系統(tǒng)為了簡便起見,為了取得更好的性能,顯示函數(shù)直接向顯示存區(qū)中寫數(shù)據(jù)。3.2.2 初始化可編程中斷控制器、定時/計數(shù)器8259中斷控制器的中斷操作功能很強,包括中斷的請求、屏蔽、排隊、結束、級連以與提供中斷類型號和查詢等操作,并且
22、其操作的方式又有不同。系統(tǒng)啟動時對8259的初始化工作決定了系統(tǒng)將以何種方式控制外部中斷。系統(tǒng)共有兩片8259,分為主片和從片,其中主片的兩個口地址為0x20,0x21,從片的兩個口地址為0xA0,0xA1,對于8259的初始化工作就是通過這四個口地址實現(xiàn)的。uC/OS-II對8259的使用要求與特點是:1.共15級向量中斷,采用兩片級連,從片的INT直接連到主片的IRQ2;2.主從片的中斷請求信號均采用邊沿觸發(fā);3.采用完全嵌套方式,優(yōu)先級的排列次序為0號中斷優(yōu)先級最高,向下依次為1號中斷,8-15號中斷,最低是3-7號中斷;4.采用非緩沖方式;5.映射0-7號中斷為中斷0x20-0x27,
23、8-15號中斷為中斷0x28-0x2f;實現(xiàn)代碼如下:#define HZ 100/*時鐘頻率為100HZ*/#define CLOCK_TICK_RATE 1193180#define LATCH(CLOCK_TICK_RATE+HZ)2)/HZ)/*計算初值*/outb_p(0x34,0x43)outb_p(LATCH&0xff,0x40);outb_p(LATCH8,0x40);3.2.3 設置中斷描述符表(IDT)在X86體系結構的保護模式下,中斷處理程序的地址不再是通過查詢中斷向量表提供,而是通過查詢中斷描述符表得到,中斷描述符表的表項從單純的入口地址改成了門(GATE),在門中帶有
24、除入口地址外的更多信息,按不同的用途和目的,CPU中一共有四種門,即任務門(task GATE),中斷門(interruptGATE),陷阱門(trapGATE)以與調(diào)用門(call GATE),在uC/OS-II中僅使用中斷門。門結構可以提供非常強的保護機制,但是uC/OS-II中并不需要如此復雜的保護機制,uC/OS-II的存管理模式是平模式(flat),并不分段,應用程序和uC/OS-II核在同一地址空間執(zhí)行,系統(tǒng)調(diào)用不引起地址空間的切換。實際上,在uC/OS-II中任務的切換就象是位于存中不同位置的程序段之間的跳轉,第3.2.9節(jié)詳細闡述了任務調(diào)度技術。3.2.4 核心數(shù)據(jù)結構初始化在
25、這一階段對系統(tǒng)用到的全局變量和核各模塊所用到的數(shù)據(jù)結構進行初始化工作,例如,任務控制塊數(shù)組初始化(如圖3.1所示),將系統(tǒng)時鐘OSTime初始化為0等。因為uC/OS-II是可定制的,對于不使用的模塊,相應的數(shù)據(jù)結構就無需初始化,達到節(jié)約存的目的。OSTCBFreeList圖3.1 任務控制塊數(shù)組初始化3.2.5 任務調(diào)度初始化對任務調(diào)度的初始化主要是對以下幾個變量和數(shù)據(jù)結構的初始化,for(i=0,iOS_RDY_TBL_SIZE,i+)OSRdyTbli=0;unsigned char類型變量OSRdyGrp和unsigned char類型數(shù)組OSRdyTbl共同決定系統(tǒng)中有哪些任務處于就
26、緒態(tài)。OSRdyTbl是個字符型數(shù)組,每一項有8位,每一位對應一個任務,如果OSRdyTb1有N個元素,則可容納N*8個任務。系統(tǒng)中所有處于就緒態(tài)的任務對應與它的優(yōu)先級(或任務標識數(shù))在OSRdyTbl中相應位會置1,OSRdyGrp用于檢索OSRdyTbl元素的位,如圖3.2所示:圖3.2 OSRdyGrp和OSRdyTblOSPrioCur=0;/*當前占有CPU的任務的優(yōu)先級*/OSPrioHighRdy=0;/*當前處于就緒態(tài)的任務中,優(yōu)先級最高者的優(yōu)先級*/OSTCBHighRdy=(OS_TCB*)0;/*指向處于就緒態(tài)的優(yōu)先級最高任務的任務控制塊的指針初始為零*/OSTCBCur
27、=(OS_TCB)0;/*指向當前占有CPU的任務的任務控制塊的指針初始為零*/OSTCBList=(OS TCB)0;/*系統(tǒng)所有處于以創(chuàng)建任務處于這是一個雙向鏈表中,OSTCBList指向雙向鏈表的起始,當創(chuàng)建一個新任務就會加入這個鏈表*/for(i=0;i(OS_LOWEST_PRIO+1,i+)/*Clear the priority table*/OSTCBPrioTbli=(OS_TCB)0;/*指針數(shù)組,每一項指向一個已建立任務,指針數(shù)組下標用于按優(yōu)先級檢索任務*/3.2.6 任務間通信初始化主要是對事件控制塊和消息隊列控制塊的初始化。3.2.7 存管理初始化這樣u C/Os-I
28、I在啟動時就會對存管理器進行初始化。初始化主要建立一個存控制塊鏈表,OSMemFreeList指向這個鏈表的第一項,其中的常數(shù)OS_MAX_MEM_PART定義了最大的存分區(qū)數(shù),該常數(shù)值至少為2。3.2.8 Idle任務和統(tǒng)計任務的初始化在OSInit()初始化完uC/OS-II的所有的變量和數(shù)據(jù)結構后,可以說為多任務運行已經(jīng)完成了所有物質(zhì)或說資源上的準備工作,但是現(xiàn)在還不能馬上調(diào)度任務運行,原因很簡單,現(xiàn)在還沒有一個處于就緒態(tài)的任務可供調(diào)度,為此必須建立任務。除了用戶任務外,還必須建立任務Idle,即空閑任務。建立此任務的原因是,在所用的任務都因故阻塞時,需要有一個任務占有CPU,因為系統(tǒng)在
29、任何情況下都要有至少一個任務處于就緒態(tài)。Idle就是這樣一個任務,它總是處于就緒態(tài),但是它的優(yōu)先級設成最低。uC/OS-II有一個提供運行時間統(tǒng)計的任務,這個任務叫做OSTaskStat(),如果用戶將系統(tǒng)定義常數(shù)OS_TASK_STAT_EN設為1,這個任務就會在初始時建立,OSTaskStat()告訴用戶應用程序使用了多少CPU時間,用百分比表示。如果用戶應用程序打算使用統(tǒng)計任務,用戶必須在初始化時建立一個任務,這個任務中調(diào)用OSStatInit()。在上述初始化過程完成以后,核可已開始調(diào)度任務運行8。3.2.9 調(diào)度最高優(yōu)先級任務開始運行多任務的啟動是用戶通過調(diào)用OSStart()實現(xiàn)的
30、,示例代碼如下所示。當OSStart()工作時,它從任務就緒表中找出用戶建立的優(yōu)先級最高任務的任務控制塊。然后,OSStart()調(diào)用高優(yōu)先級就緒任務啟動函數(shù)OSStartHighRdy(),將任務棧中保存的值彈回到CPU寄存器中,然后執(zhí)行一條中斷返回指令,中斷返回指令強制執(zhí)行該任務代碼。OSStartHighRdy()運行后,uC/OS-II系統(tǒng)通過調(diào)度函數(shù)在各任務間跳轉,不會返回到OSStart()。void OSStart(void)INT8U y;INT8U x;if(OSRunning=FALSE)y=OSUnMapTblOSRdyGrp; /*找出最高優(yōu)先級任務的優(yōu)先級*/x=OS
31、UnMapTbl(OSRdyTbly);OSPrioHighRdy=(INT8U)(y3)+x);OSPrioCur=OSPrioHighRdy;OSTCBHighRdr=OSTCBPrioTblOSPrioHighRdy;/*指向?qū)⒁{(diào)度運行的任務的控制塊*/OSTCBCur=OSTCBHighRdy;OSStartHighRdy();/*運行最高優(yōu)先級任務*/3.3 uC/OS-II的移植分析移植uC/OS-,其實就是使該實時核能在某個微處理器或微控制器上運行。為方便移植,大部分的uC/OS-代碼是用C語言寫的,但仍需要用匯編語言寫一些與處理器相關的代碼,這是因為uC/OS-在讀寫處理器和
32、寄存器時只能通過匯編語言來實現(xiàn)。uC/OS-II的移植過程,包括編譯常量的設置,數(shù)據(jù)類型的定義,宏定義,以與與操作系統(tǒng)調(diào)度相關的函數(shù)的編寫,其部分是用匯編語言實現(xiàn)的9。3.3.1 uC/OS-II的移植對芯片的要求(1)處理器的C編譯器可以產(chǎn)生可重入代碼,即可以編寫可重入型函數(shù)??芍厝胄秃瘮?shù)可以被一個以上的任務調(diào)用,而不必擔心數(shù)據(jù)的破壞。可重入型函數(shù)任何時候都可以被中斷,一段時間以后又可以運行,而相應數(shù)據(jù)不會丟失??芍厝胄秃瘮?shù)或者只使用局部變量,即變量保存在CPU寄存器中或堆棧中。如果使用全局變量,則要對全局變量予以保護。 (2)用C語言就可以打開或者關閉中斷。中斷使得CPU可以在事件發(fā)生時才
33、予以處理,而不必讓微處理器連續(xù)不斷地查詢(Polling)是否有事件發(fā)生。通過兩條特殊指令:關中斷和開中斷可以讓微處理器不響應或響應中斷。這樣可以使程序在運行中可以自主的開關中斷,以保護數(shù)據(jù)或堆棧等。在uC/OS-II中一般使用OS_ENTER_CRITICAL()宏和OS_EXIT_CRITICAL()宏來控制系統(tǒng)中斷的打開和關閉。 (3)C編譯器還要支持匯編語言程序。絕大部分的C編譯器都是為嵌入式系統(tǒng)設計的,它包括匯編器、連接器和定位器。連接器用來將不同的模塊(編譯過和匯編過的文件)連接成目標文件。定位器則允許用戶將代碼和數(shù)據(jù)放置在目標處理器的指定存映射空間中。(4)處理器支持中斷,并可以
34、產(chǎn)生定時中斷(通常在10到100HZ之間)。(5)處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧。(6)處理器有將堆棧指針和其他CPU寄存器讀出并存儲到堆?;虼嬷械闹噶?。因為在uC/OS-II進行任務調(diào)度的時候,會將寄存器存放到任務堆棧當中。3.3.2 uC/OS-II的移植工作uC/OS-II硬件和軟件的體系結構如圖3.3所示,從圖中可以看到,對uC/OS-II的移植實際上就是對與處理器有關的代碼進行重寫或修改。圖3.3 uC/OS-II硬件和軟件體系結構移植工作主要包括以下幾個容:OS_CPU.H中需要針對具體處理器的字長重新定義一系列數(shù)據(jù)類型。OS_CPU.H中需要設置常量來標
35、志堆棧增長方向。OS_CPU.H中需要聲明用于開關中斷和任務切換的宏。OS_CPU_A.ASM中需要改寫4個匯編語言的函數(shù)。OS_CPU_C.C中需要用C語言寫6個簡單的函數(shù)。從uC/OS-II的硬件和軟件體系結構圖中可以看到,如果要使用uC/OS-II, 必須為其編寫OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM三個文件。這三個文件是與芯片的硬件特性有關的,它們主要提供任務切換與系統(tǒng)時鐘的功能。其它文件用C寫成,它們?yōu)橄到y(tǒng)提供任務管理、任務之間通信、時間管理以與存管理等功能10。4 uC/OS-II移植的應用要移植的目標機是使用X86 CPU的PC機,希望移植后的uC/OS
36、-II工作在X86 CPU的實地址模式下,下面簡單介紹一下X86 CPU。Intel X86 CPU是Intel公司生產(chǎn)的32位微處理器,可以工作在實地址模式和保護地址模式,是現(xiàn)在個人計算機硬件研究中使用最多的CPU。采用的開發(fā)工具是Borland C/C+ V3.1和Borland Turbo Assembler匯編器完成程序的移植和測試,它可以產(chǎn)生可重入的代碼,同時支持在C程序中嵌入?yún)R編語句。編譯完成后,程序可在PC機上運行。4.1 Intel X86 CPU在實地址模式下的寄存器在X86 CPU實地址模式下,可以見到6個16位寄存器(CS,DS,SS,ES,FS,GS)和24個32位寄存
37、器,其中的9個寄存器對于實模式下編程很重要,它們是:4個數(shù)據(jù)寄存器(EAX,EBX,ECX,EDX),2個指針寄存器(EBP,ESP),2個變址寄存器(ESI,EDI)和1個標志寄存器(FLAGS)。4.1.1 通用寄存器X86 CPU有8個32位通用寄存器,EAX,EBX,ECX,EDX,ESP,EBP,ESI和EDI。它們是原來80286 CPU的16位通用寄存器的擴展.這些寄存器的低16位可以作為16位的通用寄存器獨立使用,分別為AX,BX,CX,DX,SP,BP,SI和DI。其中AX,BX,DX和DX的高8位和低8位可以獨立存取,形成AL,AH,BL,BH,CL,CH,DL和DH 8個
38、8位通用寄存器。這些寄存器可以用來傳送數(shù)據(jù)、暫存數(shù)據(jù)、保存結果、還可以存放地址。在X86 CPU中,這8個32位通用寄存器都可以作為指針寄存器使用,這與8086,80286 CPU不同。4.1.2 段寄存器X86 CPU有個16位段寄存器,分別為CS,SS,DS,ES,FS和GS。在實模式下,這些段寄存器存放段的基地址。與段偏移組合“段基址:偏移”形成地址。在保護模式下,這些寄存器的作用將發(fā)生改變。4.1.3 指令指針寄存器EIP是X86的指令指針寄存器,存放將要運行的下一條指令的地址偏移。EIP是由IP擴展來的,因為在實模式下段的最大圍是64K,所以,EIP的高16位是0。4.1.4 標志寄
39、存器X86 CPU的標志寄存器用來記錄與機器有關的各種狀態(tài)。如圖4.1所示,標志寄存器包含運算結果標志和狀態(tài)控制標志11。圖4.1 標志寄存器4.2 實時操作系統(tǒng)uC/OS-II的移植過程uC/OS-II的移植工作主要包括以下幾個容:(1)OS_CPU.H中需要針對處理器的字長重新定義一系列數(shù)據(jù)類型。(2)OS_CPU.H中需要設置常量來標志堆棧增長方向。(3)OS_CPU.H中需要聲明用于開關中斷和任務切換的宏。(4)OS_CPU_A.ASM中需要改寫4個匯編語言的函數(shù)。(5)OS_CPU_C.C中需要用C語言寫6個簡單的函數(shù)12。 下面分別進行說明。4.2.1 INCLUDES.H頭文件I
40、NCLUDES.H 是主頭文件,在所有后綴名為.C的文件的開始都包含INCLUDES.H文件。使用INCLUDES.H的好處是所有的.C文件都只包含一個頭文件,程序簡潔,可讀性強。缺點是.C文件可能會包含一些它并不需要的頭文件,額外的增加編譯時間。與優(yōu)點相比,多一些編譯時間還是可以接受的。用戶可以改寫INCLUDES.H文件,增加自己的頭文件,但必須加在文件末尾。為80x86編寫的INCLUDES.H的程序如下所示:#include #include #include #include #include #include #include #include softwareucos-iiix8
41、6los_cpu.h#include os_cfg.h#include softwareblockspcsourcepc.h#include softwareucos-iisourceucos_ii.h4.2.2 OS_CPU.H文件OS_CPU.H 文件中包含與處理器相關的常量,宏和結構體的定義。為80x86編寫的OS_CPU.H文件的程序如下所示:#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endif/* 數(shù)據(jù)類型(與編譯器相關的容)*/typedef unsigned char BOOLEAN
42、;typedef unsigned char INT8U;/* 無符號8位數(shù) (1)*/typedef signed char INT8S;/* 帶符號8位數(shù) */typedef unsigned int INT16U;/* 無符號16位數(shù) */typedef signed int INT16S;/* 帶符號16位數(shù) */typedef unsigned long INT32U;/* 無符號32位數(shù) */typedef signed long INT32S; /* 帶符號32位數(shù) */typedef float FP32;/* 單精度浮點數(shù) */typedef double FP64;/* 雙
43、精度浮點數(shù) */typedef unsigned int OS_STK;/* 堆棧入口寬度為16位 */#define BYTE INT8S /* 以下定義的數(shù)據(jù)類型是為了與uC/OS V1.xx 兼容 */#define UBYTE INT8U /*在uC/OS-II中并沒有實際的用處 */#define WORD INT16S#define UWORD INT16U#define LONG INT32S#define ULONG INT32U/*Intel 80x86 (實模式, 大模式編譯)*方法: 用簡單指令開關中斷。*注意,用此方法關閉中斷,從調(diào)用函數(shù)返回后中斷會重新打開!*注意將文
44、件OS_CPU_A.ASM中與OSIntCtxSw()相關的常量從10改到8。*/#define OS_CRITICAL_METHOD 2#if OS_CRITICAL_METHOD = 1#define OS_ENTER_CRITICAL() asm CLI /* 關閉中斷*/#define OS_EXIT_CRITICAL() asm STI /* 打開中斷*/#endif#if OS_CRITICAL_METHOD = 2#define OS_ENTER_CRITICAL() asm PUSHF; CLI /* 關閉中斷 */#define OS_EXIT_CRITICAL() asm
45、POPF/* 打開中斷 */#endif/* Intel 80x86 (實模式, 大模式編譯)*/#define OS_STK_GROWTH 1 /* 堆棧由高地址向低地址增長 (3)*/#define uCOS 0x80 /* 中斷向量0x80用于任務切換 (4)*/#define OS_TASK_SW() asm INT uCOS /* (5) */* 全局變量 */OS_CPU_EXT INT8U OSTickDOSCtr; /*為調(diào)用DOS時鐘中斷而定義的計數(shù)器 (6)*/4.2.2.1 數(shù)據(jù)類型由于不同的處理器有不同的字長,C/OS-II 的移植需要重新定義一系列的數(shù)據(jù)結構。使用Bo
46、rland C/C+編譯器,整數(shù)(int)類型數(shù)據(jù)為16 位,長整形(long)為32 位。盡管C/OS-II 中沒有用到浮點類型的數(shù),在源代碼中還是提供了浮點類型的定義。由于在80x86實模式中堆棧都是按字進行操作的,沒有字節(jié)操作,所以Borland C/C+編譯器中堆棧數(shù)據(jù)類型OS_STK 聲明為16 位。所有的堆棧都必須用OS_STK 聲明。4.2.2.2 代碼臨界區(qū)與其他實時系統(tǒng)一樣,C/OS-II 在進入系統(tǒng)臨界代碼區(qū)之前要關閉中斷,等到退出臨界區(qū)后再打開。從而保護核心數(shù)據(jù)不被多任務環(huán)境下的其他任務或中斷破壞。Borland C/C+支持嵌入?yún)R編語句,所以加入關閉/打開中斷的語句是很
47、方便的。C/OS-II定義了兩個宏用來關閉/打開中斷:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。直接將OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()定義為處理器的關閉(CLI)和打開(STI)中斷指令。但這種方法有一個隱患,如果在關閉中斷后調(diào)用C/OS-II函數(shù),當函數(shù)返回后,中斷將被打開!嚴格意義上的關閉中斷應該是執(zhí)行OS_ENTER_CRITICAL()后中斷始終是關閉的,但本方法的最大優(yōu)點是簡單,執(zhí)行速度快(只有一條指令),在此類操作頻繁的時候更為突出。此時需要將OSIntCtxSw()中的常量由10改到8(見文件OS_C
48、PU_A.ASM)。4.2.2.3 堆棧增長方向80x86 處理器的堆棧是由高地址向低地址方向增長的,所以常量OS_STK_GROWTH必須設置為1見程序中的注釋(3)。4.2.2.4 OS_TASK_SW()函數(shù)在C/OS-II中, 就緒任務的堆棧初始化應該模擬一次中斷發(fā)生后的樣子,堆棧中應該按進棧次序設置好各個寄存器的容。OS_TASK_SW()函數(shù)模擬一次中斷過程,在中斷返回的時候進行任務切換。80x86提供了256個軟中斷源可供選用,中斷服務程序(ISR)(也稱為例外處理過程)的入口點必須指向匯編函數(shù)OSCtxSw()(請參看文件OS_CPU_A.ASM)。4.2.2.5 時鐘節(jié)拍的發(fā)
49、生頻率實時系統(tǒng)中時鐘節(jié)拍的發(fā)生頻率應該設置為10到100 Hz。通常(但不是必須的)為了方便計算設為整數(shù)。不幸的是,在PC中,系統(tǒng)缺省的時鐘節(jié)拍頻率是18.20648Hz,更改PC的時鐘節(jié)拍頻率到200 Hz(間隔5ms)。一方面200 Hz近似18.20648Hz的11倍,可以經(jīng)過11次延時再調(diào)用DOS中斷;另一方面,在DOS中,有些操作要求時鐘間隔為54.93ms,設定的間隔5ms也可以滿足要求。在文件OS_CPU.H的末尾聲明了一個8位變量OSTickDOSCtr,將保存時鐘節(jié)拍發(fā)生的次數(shù),每發(fā)生11次,調(diào)用DOS的時鐘節(jié)拍函數(shù)一次,從而實現(xiàn)與DOS時鐘的同步。OSTickDOSCtr是
50、專門為PC環(huán)境而聲明的,如果在其他非PC的系統(tǒng)中運行C/OS-II,就不用這種同步方法,直接設定時鐘節(jié)拍發(fā)生頻率就行了13。4.2.3 OS_CPU_A.ASM文件C/OS-II 的移植需要用戶改寫OS_CPU_A.ASM中的四個函數(shù): (1)OSStartHighRdy()(2)OSCtxSw()(3)OSIntCtxSw()(4)OSTickISR()4.2.3.1 OSStartHighRdy()函數(shù)該函數(shù)由OSStart()函數(shù)調(diào)用,功能是運行優(yōu)先級最高的就緒任務,在調(diào)用OSStart()之前,用戶必須先調(diào)用OSInit(),并且已經(jīng)至少創(chuàng)建了一個任務(請參考OSTaskCreate(
51、)和OSTaskCreateExt()函數(shù))。OSStartHighRdy()默認指針OSTCBHighRdy指向優(yōu)先級最高就緒任務的任務控制塊(OS_TCB)(在這之前OSTCBHighRdy已由OSStart()設置好了)。圖4.2給出了由函數(shù)OSTaskCreate() 或OSTaskCreateExt() 創(chuàng)建的任務的堆棧結構。很明顯,OSTCBHighRdy-OSTCBStkPtr指向的是任務堆棧的頂端。函數(shù)OSStartHighRdy()的代碼如下所示:_OSStartHighRdy PROC FARMOV AX, SEG _OSTCBHighRdy ; 載入 DSMOV DS,
52、AX ;CALL FAR PTR _OSTaskSwHookINC BYTE PTR DS:_OSRunning LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy-OSTCBStkPtr(1)MOV SS, ES:BX+2 ;MOV SP, ES:BX+0 ;POP DS ; 恢復任務環(huán)境 (2)POP ES ; (3)POPA ; (4);IRET ; 運行任務 (5)_OSStartHighRdy ENDP函數(shù)OSTaskCreate() 或OSTaskCreateExt() 創(chuàng)建的任務的堆棧結構如下圖所示:圖4.2 任務創(chuàng)
53、立時的80x86堆棧結構為了啟動任務,OSStartHighRdy()從任務控制塊(OS_TCB)見程序注釋(1)中找到指向堆棧的指針,然后運行POP DS 見程序注釋(2), POP ES 見程序注釋(3), POPA 見程序注釋(4), 和 IRET 見程序注釋(5)指令。此處將任務堆棧指針保存在任務控制塊的開頭,這樣使得堆棧指針的存取在匯編語言中更容易操作。當執(zhí)行了IRET指令后,CPU會從(SS:SP)指向的堆棧中恢復各個寄存器的值并執(zhí)行中斷前的指令。SS:SP+4指向傳遞給任務的參數(shù)pdata14。4.2.3.2 OSCtxSw()函數(shù)OSCtxSw()是一個任務級的任務切換函數(shù)(在
54、任務中調(diào)用,區(qū)別于在中斷程序中調(diào)用的OSIntCtxSw())。在80x86系統(tǒng)上,它通過執(zhí)行一條軟中斷的指令來實現(xiàn)任務切換。軟中斷向量指向OSCtxSw()。在C/OS-II中,如果任務調(diào)用了某個函數(shù),而該函數(shù)的執(zhí)行結果可能造成系統(tǒng)任務重新調(diào)度(例如試圖喚醒了一個優(yōu)先級更高的任務),則在函數(shù)的末尾會調(diào)用OSSched(),如果OSSched()判斷需要進行任務調(diào)度,會找到該任務控制塊OS_TCB的地址,并將該地址拷貝到OSTCBHighRdy,然后通過宏OS_TASK_SW()執(zhí)行軟中斷進行任務切換。注意到在此過程中,變量OSTCBCur始終包含一個指向當前運行任務OS_TCB的指針。程序如下所示:_OSCtxSw PROC FAR ;(1);PUSHA ;保存當前任務環(huán)境(2)PUSH ES ;(3)PUSH DS ;(4);MOV AX, SEG _OSTCBCur ; 載入DSMOV DS, AX;LES BX, DWORD PTR DS:_OSTCBCur ; OSTCBCur-OSTCBStkPtr = S
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建省長汀、連城一中等六校聯(lián)考2024-2025學年高三5月份綜合模擬檢測試題英語試題含解析
- 2025年甘肅省天水市清水縣第六中學高三年級調(diào)研測試(英語試題)試題含解析
- 云南三鑫職業(yè)技術學院《土木工程施工設計》2023-2024學年第一學期期末試卷
- 松原市前郭爾羅斯蒙古族自治縣2024-2025學年數(shù)學五年級第二學期期末達標檢測模擬試題含答案
- 第11課 元朝的建立與統(tǒng)一 教案2024-2025學年七年級歷史下冊新課標
- 現(xiàn)階段在高中生中大規(guī)模推廣體育運動種類的調(diào)研
- 裝修鋼結構施工方案
- 加固現(xiàn)澆閣樓施工方案
- 坡屋面保溫施工方案
- 外墻保溫膠泥施工方案
- 2024年高考英語作文【5篇】
- 結直腸癌免疫治療
- 老年學概論(第3版) 課件 第5-7章 衰老生物學、老年人口學、老年心理學
- 人教版八年級物理下冊《第八章運動和力》單元測試卷-含答案
- 江蘇省南京師范大學附屬中學樹人學校2023-2024學年九年級下學期3月月考數(shù)學試卷
- 阿拉伯國家聯(lián)盟課件
- 油氣管道視頻監(jiān)控系統(tǒng)總體設計方案
- 毫米波集成電路詳述
- 打印設備維護服務投標方案
- JGT454-2014 建筑門窗、幕墻中空玻璃性能現(xiàn)場檢測方法
- 一定溶質(zhì)質(zhì)量分數(shù)的氯化鈉溶液的配制
評論
0/150
提交評論