基于單片機的嵌入式實時OS平臺的研究與實現(xiàn)畢業(yè)論文_第1頁
基于單片機的嵌入式實時OS平臺的研究與實現(xiàn)畢業(yè)論文_第2頁
基于單片機的嵌入式實時OS平臺的研究與實現(xiàn)畢業(yè)論文_第3頁
基于單片機的嵌入式實時OS平臺的研究與實現(xiàn)畢業(yè)論文_第4頁
基于單片機的嵌入式實時OS平臺的研究與實現(xiàn)畢業(yè)論文_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、目 錄摘 要1Abstract11 緒論21.1 引言21.2 實時操作系統(tǒng)的發(fā)展與現(xiàn)狀21.3 選題的背景與意義41.4 論文主要研究的內(nèi)容與論文結(jié)構(gòu)52 嵌入式實時操作系統(tǒng)C/OS-內(nèi)核分析52.1 C/OS-簡介52.2 C/OS-的內(nèi)核結(jié)構(gòu)72.2.1 臨界段的處理72.2.2 任務82.2.3 任務狀態(tài)82.2.4 任務控制塊92.2.5 就緒表112.2.6 任務調(diào)度112.2.7 中斷和時鐘節(jié)拍122.2.8 C/OS-初始化及啟動123 C/OS-在STC89C52單片機上的移植133.1 STC89C52單片機片簡介133.2 C/OS-源文件結(jié)構(gòu)143.2.1 與處理器無關(guān)

2、代碼153.2.2 與應用相關(guān)代碼153.2.3 與處理器相關(guān)代碼163.3 與移植相關(guān)代碼的修改173.3.1 OS_CPU.H的修改173.3.2 OS_CPU_C.C的修改193.3.3 OS_CPU_A.ASM的修改213.4 C/OS-在STC89C52上的移植223.4.1 Keil C51編譯器簡介223.4.2 移植測試程序234 基于C/OS-的應用系統(tǒng)設計264.1 基于C/OS-擴展RTOS的體系結(jié)構(gòu)264.2 實時溫度控制系統(tǒng)的設計284.2.1 整體設計284.2.2 硬件模塊設計284.2.3 系統(tǒng)程序的設計29總結(jié)31參考文獻32致謝35 基于單片機的嵌入式實時O

3、S平臺的研究與實現(xiàn) 摘 要:嵌入式系統(tǒng)融合了微電子、計算機軟/硬件、通信和電子工程等多種技術(shù),廣泛應用于航空、航天、儀器儀表、工業(yè)控制等領(lǐng)域,它已經(jīng)成為了科技創(chuàng)新的重要途徑。而RTOS(Real-Time Operating System)使得在嵌入式操作系統(tǒng)上編程比在傳統(tǒng)意義上編程有著更大的優(yōu)勢,隨著不斷的發(fā)展在更多的場合能夠發(fā)揮其優(yōu)勢和作用。進行嵌入式實時操作系統(tǒng)開發(fā)平臺的討論和研究具有非凡的現(xiàn)實意義。論文首先從實時操作系統(tǒng)的整體概念進行論述,對實時操作系統(tǒng)RTOS的發(fā)展現(xiàn)狀和發(fā)展趨勢等方面進行了簡單綜述,然后在第二個章節(jié)重點分析了操作系統(tǒng)C/OS-內(nèi)核結(jié)構(gòu),如:代碼臨界斷、任務、時鐘和中

4、斷等。再在第三個章節(jié)中,以8位單片機STC89C52為微處理器,以C/OS-內(nèi)核為嵌入式實時操作系統(tǒng),以Keil C51為編譯環(huán)境搭建了一個嵌入式實時操作系統(tǒng)的開發(fā)平臺。在最后一個章節(jié)中,完成了實時溫度控制系統(tǒng)的設計。關(guān)鍵詞:嵌入式實時操作系統(tǒng);C/OS-;STC89C52 The Research and Implementation of the Embedded Real-Time Operating System based on MCU Abstract:Embedded System involves much technology, including micro-electro

5、nics,electronic engineering, the software&hardware of computer, communication, and so on. It has been used in aviation, spaceflight, instrument, industrial-control and so on.It is a important method of science and technology innovation. Embedded operation-system has its advantage of programme mode t

6、han traditions owing to RTOS(Real-Time Operating System).The article first talks about the conception of RTOS and introduces the current situation of the development of RTOS and development trend. In the second chapter,the article talks about the kernel particularly of the real-time operation system

7、 C/OS-, for instance, task, clock and interrupt. In third chapter, the article designs the platform of embedded operation system, which regards STC89C52 as control object, reaving kernel C/OS- as operation system, Keil C51 as code warrior. In last chapter the article completes the design of real-tim

8、e temperature control system. Key Words: embedded Real-Time Operation System; C/OS-; STC89C521 緒論1.1 引言 在嵌入式系統(tǒng)的早期時代,應用程序直接控制CPU和各個接口,因此嵌入式系統(tǒng)開發(fā)人員需要做出大量的工作與硬件與軟件的結(jié)合上。硬件只要發(fā)生簡單的變化,軟件就要作大量的改動,應用程序?qū)τ布囊蕾囆院軓?。而操作系統(tǒng)的出現(xiàn),使得硬件與軟件在一定程度上分離開來,這為嵌入式軟件開發(fā)人員節(jié)省了大量的時間。操作系統(tǒng)在系統(tǒng)層面上,進行CPU的各種運算執(zhí)行和資源管理,就是資源管理器;在應用層面上,它為開發(fā)人員提供

9、了函數(shù)庫,便于對硬件進行操作。在現(xiàn)在嵌入式系統(tǒng)中,操作系統(tǒng)的引入,使得大部分不確定的因素得到減少,極大的保證了整個應用系統(tǒng)的穩(wěn)定性。而對于嵌入式開發(fā)人員來說,他們也能夠?qū)W⒂趹孟到y(tǒng)的開發(fā),不再進行控制CPU的繁雜工作和控制硬件的工作。1.2 實時操作系統(tǒng)的發(fā)展與現(xiàn)狀 實時操作系統(tǒng)(RTOS)是指當外界事件或數(shù)據(jù)產(chǎn)生時,能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能在規(guī)定的時間之內(nèi)來控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)作出快速響應,并控制所有實時任務協(xié)調(diào)一致運行的操作系統(tǒng)。因而,提供及時響應和高可靠性是其主要特點??v觀其發(fā)展,大致可分以下3個階段:簡單的實時操作系統(tǒng) 早期的實時操作系統(tǒng)小而簡單的,運行

10、相對快速,帶有一定專用型的軟件,功能相對單一,不能說是真正的RTOS而是一種監(jiān)控程序。它一般為用戶提供系統(tǒng)初始化管理以及簡單的實時時鐘管理。這個時間應用較簡單,實時性也要求不高,應用程序、實時監(jiān)控程序和硬件運行平臺往往是緊密聯(lián)系在一起的。 專有的實時操作系統(tǒng)這類操作系統(tǒng)在國外稱為Real-Time Operating System Developed in House。它是在當時用戶為了滿足自身應用需求而開發(fā)的,它并不適用于所有的硬件環(huán)境,只適用于特殊的硬件條件,因此移植性也不好。隨著各個行業(yè)的應用發(fā)展,早期簡單的RTOS已經(jīng)越來越顯出功能單一等各方面的不足。而RTOS的開發(fā)者為了滿足這種快速

11、發(fā)展的應用需求,開發(fā)了與之相符合的專有的實時操作系統(tǒng)。通用型實時操作系統(tǒng) 在各種專用RTOS中,一些多任務的機制如優(yōu)先級的調(diào)度、實時時鐘管理、任務間的通訊、同步互斥機構(gòu)基本上是相同的,不同的是面向各自硬件環(huán)境與應用目標。實際上,相同的多任務機制是能夠共享的,因而可以把這部分很好的組織起來,形成以個通用的實時操作系統(tǒng).一方面,在RTOS內(nèi)核的最底層將不同的硬件特性屏蔽掉;另一方面,對不同的應用環(huán)境提供標準的、可裁剪的系統(tǒng)服務組件。這使得用戶可以根據(jù)不同的實時應用要求及硬件環(huán)境選擇不同的組件,也使得實時操作系統(tǒng)開發(fā)商在開發(fā)的過程中減少重復性工作。嵌入式實時操作系統(tǒng)的技術(shù)經(jīng)過多年發(fā)展已經(jīng)逐漸走向成熟

12、。嵌入式實時操作系統(tǒng)已廣泛應用于家庭、通訊、商業(yè)、工業(yè)、國防領(lǐng)域,擁有非常多的不同品種的各類產(chǎn)品,例如數(shù)碼相機、數(shù)字電視、掌上機頂盒、電腦PDA、手機、航天飛機、太空飛行器中都應用了嵌入式實時操作系統(tǒng)。目前占據(jù)市場的主要有論文所研究的C/OS-以及VxWorks、CLinux等。1.3 選題的背景與意義在嵌入式實時操作系統(tǒng)開發(fā)平臺之上,開發(fā)人員不需要對操作系統(tǒng)的內(nèi)核實現(xiàn)有詳細的了解就能夠進行一些嵌入式控制器的開發(fā)工作??刂祁I(lǐng)域的專業(yè)人員在利用平臺開發(fā)嵌入式系統(tǒng)的時候,可以在一定程度上繞開操作系統(tǒng)這個專業(yè)壁壘。有嵌入式實時操作系統(tǒng)的開發(fā)平臺作為基礎,開發(fā)者只需要將精力集中在各個功能模塊的編寫之上

13、,模塊之間的聯(lián)系都遵循同樣的接口協(xié)議。這樣不同開發(fā)者就可以很方便的進行協(xié)作開發(fā),提高開發(fā)的效率,而且各個開發(fā)者開發(fā)的模塊也可以相互利用,很好的做到資源共享。這樣的開發(fā)平臺,勢必對嵌入式系統(tǒng)在工業(yè)控制領(lǐng)域內(nèi)的應用起到促進作用。C/OS-是由Jean.labrasse于1992年編寫的一個嵌入式實時多任務操作系統(tǒng)。最早這個系統(tǒng)叫做C/OS,后來經(jīng)過10年的應用和修改,在1999年Jean.labrasse推出了C/OS-,并在2000年得到了美國聯(lián)邦航空管理局對于應用飛機的、符合RTCA DO-178B的標準認證,從而證明了C/OS-具有足夠的穩(wěn)定性和安全性。該操作系統(tǒng)是用C語言和匯編語言編寫的,

14、其中大部分代碼都是用C語言編寫的,只有極少部分與處理器密切相關(guān)的代碼是用匯編語言編寫,所以用戶只需做很少的工作可以很方便的移植到各類8位、16位、32位嵌入式處理器上。該操作系統(tǒng)結(jié)構(gòu)簡潔精練,可讀性強,并具有較強的可擴展性。1.4 論文主要研究的內(nèi)容與論文結(jié)構(gòu)論文研究的目的是在基于STC89C52單片機的硬件平臺上搭建一個C/OS-的應用平臺,平臺由硬件系統(tǒng)和軟件系統(tǒng)兩個部分組成:硬件系統(tǒng):基于STC89C52芯片的硬件系統(tǒng)。軟件系統(tǒng):基于C/OS-內(nèi)核的嵌入式實時操作系統(tǒng)。論文的主要工作有:C/OS-內(nèi)核結(jié)構(gòu)介紹與分析。以STC89C52為嵌入式處理器,以Keil C51為編譯環(huán)境,完成C/

15、OS-嵌入式實時操作系統(tǒng)的移植?;贑/OS-內(nèi)核擴展RTOS的體系結(jié)構(gòu),在搭建的平臺上完成實時溫度控制系統(tǒng)的設計。 2 嵌入式實時操作系統(tǒng)C/OS-內(nèi)核分析2.1 C/OS-簡介C/OS-是一個完整的,可移植、固化、裁剪的占先式實時多任務內(nèi)核。C/OS-是專為嵌入式應用設計的,可移植在8位、16位、32位單片機或DSP中。C/OS-的主要特點有:源代碼開放 全部源代碼約5500行,清晰易讀,結(jié)構(gòu)協(xié)調(diào)??梢浦残?C/OS-源代碼絕大部分是用移植性很強的ANSI C寫的,與微處理器硬件相關(guān)的部分是用匯編語言寫的,便于移植到其他微處理器上??刹眉?通過條件編譯,可以實現(xiàn)C/OS-的裁剪,只使用C/

16、OS-中應用程序需要的服務。 可固化 C/OS-是為嵌入式應用而設計的,這就意味著,只要具備合適的系列軟件工具,就可以將C/OS-嵌入到產(chǎn)品中作為產(chǎn)品的一部分。多任務 C/OS-可以管理64個任務,留給用戶的應用程序最多可有56個任務,賦予每個任務不同的優(yōu)先級??蓜儕Z性 C/OS-是完全可剝奪型的實時內(nèi)核,總是運行就緒條件下優(yōu)先級最高的任務。系統(tǒng)服務 C/OS-提供很多系統(tǒng)服務,例如信號量、互斥型信號量、時間標志、消息郵箱、消息隊列、塊大小固定的內(nèi)存的申請與釋放及時間管理函數(shù)等。 中斷管理 中斷可以使正在執(zhí)行的任務暫時掛起。如果優(yōu)先級更高的任務被該中斷喚醒,則高優(yōu)先級的任務在中斷嵌套全部退出后

17、立即執(zhí)行,中斷嵌套層數(shù)可達255層。可確定性 絕大多數(shù)C/OS-的函數(shù)調(diào)用和服務的執(zhí)行時間具有可確定性。任務棧 C/OS-允許每個任務有不同的棧空間,以便壓低應用程序?qū)AM的需求。2.2 C/OS-的內(nèi)核結(jié)構(gòu)2.2.1 臨界段的處理C/OS-為了處理臨界段代碼,須關(guān)中斷,處理完畢后,再開中斷。關(guān)中斷使得C/OS-能夠避免同時有其他任務或中斷服務進入臨界段代碼。C/OS-定義2個宏調(diào)用來關(guān)中斷和開中斷,分別是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。因為這2個宏定義取決于使用的微處理器,故在文件OS_CPU.H中可以找到相應的宏定義。OS_ENTER_CR

18、ITICAL()和OS_EXIT_CRITICAL()總是成對使用的,把臨界段代碼包起來。2.2.2 任務C/OS-可以管理多達64個任務,有2個任務已經(jīng)被系統(tǒng)占用。必須個每個任務賦以不同的優(yōu)先級,所以優(yōu)先級從0到OS_LOWEST_PRIO-2優(yōu)先級號越低,任務的優(yōu)先級越高。 在C/OS-中任務通常是一個無限的循環(huán)??雌饋砭拖衿渌鸆函數(shù)一樣,有函數(shù)返回類型,但是絕對不會返回的,故返回參數(shù)必須定義成void。2.2.3 任務狀態(tài)下圖是C/OS-任務狀態(tài)轉(zhuǎn)換圖,在任一給定的時間,任務狀態(tài)一定是在以下5種狀態(tài)之一: 圖2.1 任務狀態(tài)睡眠態(tài) 指任務駐留在程序空間,還沒有交給C/OS-來管理。就緒態(tài)

19、 任務一旦建立,這個任務就進入了就緒態(tài),準備運行。運行態(tài) 任務占有CPU,正在運行。等待狀態(tài) 等待除CPU以外的其它資源或條件(如信號量),不能運行。中斷服務態(tài) 正在運行的任務被中斷,進入中斷服務子程序。2.2.4 任務控制塊任務控制塊是一個數(shù)據(jù)結(jié)構(gòu),它與任務一一對應的。在操作系統(tǒng)初始化時,系統(tǒng)申請了一塊RAM空間來存儲空閑任務塊。一旦任務建立,系統(tǒng)就會分配一個任務控制塊OS_TCB(task control blocks)給該任務。當任務的CPU使用權(quán)被剝奪時,C/OS-用它來保存該任務的狀態(tài),當任務重新得到CPU的使用權(quán)時,任務控制塊能確保任務從斷點處繼續(xù)執(zhí)行下去。OS_TCB全部駐留在R

20、AM中,在任務建立時,OS_TCB被初始化。數(shù)據(jù)結(jié)構(gòu)如下:typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; INT16U OSTCBId;#endif struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev;#if (OS_Q_EN0)&(OS_MAX_QS0)|(OS_MBOX_EN0)| (OS_S

21、EM0)|(OS_MUTEX_EN0) OS_EVENT *OSTCBEventPtr;#endif#if (OS_Q_EN0)&(OS_MAX_QS0)|(OS_MBOX_EN0) void *OSTCBMsg;#endif#if (OS_VERSION=251)&(OS_FLAG_EN0)&(OS_MAX_FLAGS0)#if OS_TASK_DEL_EN0 OS_FLAG_NODE *OSTCBFlagNode;#endif OS_FLAGS OSTCBFlagsRdy;#endif INT16U OSTCBDly; INT8U OSTCBStat; INT8U OSTCBPrio; I

22、NT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTCBBitY:#if OS_TASK_DEL_EN0 BOOLEAN OSTCBDelReq;#endifOS_TCB2.2.5 就緒表C/OS-中每個就緒的任務都放在就緒表中,就緒表中有2個變量,OSRdyGrp和OSRdyTb1。在OSRdyGrp中,任務按優(yōu)先級分組,8個任務為一組。OSRdyGrp中的每一位表示8組任務中每一組是否有進入就緒態(tài)的任務。任務進入就緒態(tài)時,就緒表OSRdyTb1中的相應元素的相應位也置為1。2.2.6 任務調(diào)度在多任務系統(tǒng)中,令CPU中止當前正在運行的任

23、務而轉(zhuǎn)去運行另外一個任務的工作叫做任務的切換,而按照某種規(guī)則進行任務切換的工作叫做任務的調(diào)度。在C/OS-中,任務調(diào)度是由任務調(diào)度器來完成的。任務調(diào)度器的主要工作有兩項:一是在任務就緒表中查找具有最高優(yōu)先級別的就緒任務;二是實現(xiàn)任務的切換。C/OS-有兩種調(diào)度器一種是任務及的調(diào)度器;另一種是中斷級的調(diào)度器。任務級的調(diào)度器由函數(shù)OSSched()來實現(xiàn),而中斷級的調(diào)度器由函數(shù)OSIntExt()來實現(xiàn)。調(diào)度器把任務切換工作分為兩個步驟:第一是獲得待運行任務的TCB指針:第二是進行斷點數(shù)據(jù)的切換。2.2.7 中斷和時鐘節(jié)拍C/OS-中,中斷服務子程序是用匯編來寫的,下面是中斷處理程序一般處理過程的

24、示意代碼:用戶中斷服務子程序: 保存全部CPU寄存器; 調(diào)用OSIntEnter或OSIntNesting直接加1; 執(zhí)行用戶代碼做中斷服務; 調(diào)用OSIntExit(); 恢復所有CPU寄存器; 執(zhí)行中斷返回指令;時鐘節(jié)拍是周期性發(fā)生的特殊中斷(時鐘中斷),這個中斷可視為系統(tǒng)心臟的跳動。操作系統(tǒng)通過時鐘中斷來確定時間間隔,實現(xiàn)時間延時及確定超時。時鐘中斷的頻率越高,系統(tǒng)的額外負荷越多。通常將頻率設置在10到100Hz之間。用戶必須在多任務系統(tǒng)啟動以后再啟動時鐘節(jié)拍源計時也就是在調(diào)用OSStart()之后。如果在之前調(diào)用,時鐘節(jié)拍中斷可能在C/OS-啟動第一個任務之前發(fā)生,此時C/OS-是處在

25、一個不確定的狀態(tài)之中,用戶應用程序可能崩潰。2.2.8 C/OS-初始化及啟動在調(diào)用C/OS-的任何其他服務之前,C/OS-要求用戶首先調(diào)用系統(tǒng)初始化函數(shù)OSInit()。OSInit()初花C/OS-所有的變量和數(shù)據(jù)結(jié)構(gòu)。OSInit()將建立空閑任務OSTaskIdle(),這個任務總是處于就緒態(tài)的??臻e任務的優(yōu)先級為最低,即為OS_LOWST_PRIO。如果使用統(tǒng)計任務OSTaskStat(),則會建立統(tǒng)計任務并讓其進入就緒態(tài),其優(yōu)先級總是為OS_LOWST_PRIO-1。C/OS-還初始化了4個空數(shù)據(jù)結(jié)構(gòu)緩沖區(qū)。每個緩沖區(qū)都是單向鏈表,允許C/OS-從緩沖區(qū)中迅速得到或釋放一個緩沖區(qū)中

26、的元素。C/OS-多任務的啟動是用戶通過調(diào)用OSStart()實現(xiàn)的,在啟動之前,用戶至少要建立一個應用任務。OSStart()是從任務就緒表中構(gòu)造出優(yōu)先級最高的任務,然后調(diào)用高優(yōu)先級就緒任務啟動函數(shù)OSStartHighRdy(),這是一個跟處理器相關(guān)的函數(shù),可以用匯編語言來實現(xiàn)。OSStartHighRdy()將永遠不返回到OSStart()。3 C/OS-在STC89C52單片機上的移植3.1 STC89C52單片機片簡介MCS-51系列單片機是美國Intel公司在1980年推出的高性能8位單片機微型計算機,較原來的MCS-48系列結(jié)構(gòu)更為新進,功能增強,它包括51和52兩個系列。全球各

27、單片機生產(chǎn)廠商在MCS51內(nèi)核基礎上,派生了大量的51內(nèi)核系列單片機,是極大地豐富了MCS51的種群。其中,STC公司推出了STC89系列單片機,增加了大量的新功能,提高了51單片機的性能。STC89C52單片機是MCS-51系列單片機的派生產(chǎn)品。它在指令系統(tǒng)、硬件結(jié)構(gòu)和片內(nèi)資源上與標準的8051單片機完全兼容。其主要特性如下: 增強型6時鐘/機器周期,12時鐘/機器周期8051核心處理單 元。3.4V-5.5V工作電壓,工作頻率范圍:0-40MHZ。 8K字節(jié)片內(nèi)程序存儲器ROM;片上集成512字節(jié)RAM;通用I/O口32個,復位后為:P1/P2/P3是準雙向口,P0口是開漏輸出,作為總線擴

28、展時用,不用加上拉電阻,作為I/O口用時,需加上拉電阻;可編程看門狗定時器(WDT)。3個16位定時器/計數(shù)器,其中定時器0還刻意當成2個8位 定時器;外部中斷4路,下降沿中斷或低電平出發(fā)中斷。SPI(串行外圍接口)和增強型UART。3.2 C/OS-源文件結(jié)構(gòu)C/OS-的源文件構(gòu)成如下圖所示,C/OS-操作系統(tǒng)由三部分代碼組成,主要是與處理器相關(guān)的代碼、與應用程序有關(guān)的代碼、與移植相關(guān)的代碼,如圖3.1所示: 圖3.1 C/OS-源文件結(jié)構(gòu)3.2.1 與處理器無關(guān)代碼與處理器無關(guān)的代碼主要是OS_CORE.C、OS_FLAG.C、OS_MBOX.C、OS_MEM.C、OS_MUTEX.C、O

29、S_Q.C、OS_SEM.C、OS_TASK.C、OS_TIME.CuCOS_II.C、uCOS_II.H。這些代碼大致分為一下幾個部分:內(nèi)核結(jié)構(gòu)部分、任務管理部分、時間控制塊、時間管理部分、信號管理部分、信號量管理、互斥信號量管理、時間標志組管理、消息郵箱管理以及消息隊列管理。3.2.2 與應用相關(guān)代碼與應用相關(guān)的代碼主要是兩個文件:OS_CFG.H、INCLUDES.H。 OS_CFG.H文件主要功能是實現(xiàn)操作系統(tǒng)的裁剪功能。包含了許多C/OS-的初始化配置選項。在C/OS-中每個函數(shù)只有當通過文件OS_CFG.H中的對應項“置1”,才刻意使用該函數(shù),該函數(shù)是否使用是通過條件編譯實現(xiàn)的。I

30、NCLUDES.H文件是一個主頭文件,它出現(xiàn)在每個.C文件的第一行。使用INCLUDES.H的好處是所有的.C文件都只包含一個頭文件,程序簡潔,可讀性強。缺點是.C文件可能會包含一些它并不需要的頭文件,額外的增加編譯時間。用戶刻意改寫INCLUDES.H文件,增加自己的頭文件,但必須加在文件末尾。3.2.3 與處理器相關(guān)代碼這是移植中最關(guān)鍵的部分,內(nèi)核將應用系統(tǒng)和底層硬件有機的結(jié)合成一個實時系統(tǒng),要使同一個內(nèi)核能適用于不同的硬件體系,就需要在內(nèi)核和硬件之間有一個中間層,這就是與處理器相關(guān)的代碼。處理器不同,這部分代碼也不同。與處理器相關(guān)的代碼是OS_CPU.H、OS_CPU_A.ASM、OS_

31、CPU_C.C。OS_CPU.H包括了用#defines定義的與處理器相關(guān)的常量,宏和類型定義。因為不同的處理器有不同的字長,所以C/OS-的移植包括了一系列的類型定義以確保其可移植性。 OS_CPU_C.C文件中共定義了10個函數(shù)在該文件中。但是最重要的是OSTaskStkInit()。其他9個函數(shù)必須聲明,但都是對系統(tǒng)內(nèi)核的擴展時用的。OSTaskStkInit()是在用戶建立任務時被函數(shù)OSTaskCreate()和OSTaskCreateExt()調(diào)用,是系統(tǒng)內(nèi)部自己調(diào)用的,用來對用戶任務的堆棧進行初始化,并使用建立好的進入就緒態(tài)任務的堆棧與系統(tǒng)發(fā)生中斷并且將環(huán)境變量保存完畢時的棧結(jié)構(gòu)

32、一致。這樣就可以用中斷返回指令使就緒的任務運行起來。OS_CPU_A.ASM文件里包含了4個簡單的匯編函數(shù)。OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。OSStartHighRdy()函數(shù)在多任務系統(tǒng)啟動函數(shù)OSStart()中調(diào)用。OSCtxSw()函數(shù)實在任務級切換函數(shù)中調(diào)用的。OSIntCtxSw()在退出中斷服務函數(shù)OSIntExit()中調(diào)用,實現(xiàn)中斷級任務切換。OSTickISR()系統(tǒng)時鐘節(jié)拍中斷服務函數(shù),這是一個周期性中斷,為內(nèi)核提供時鐘節(jié)拍,頻率越高系統(tǒng)負荷越重。3.3 與移植相關(guān)代碼的修改3.3.1 OS_CPU.

33、H的修改修改后的OS_CPU.H代碼如下所示:/* 文件名:OS_CPU.H */#ifndef _OS_CPU_H#define _OS_CPU_H#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endif /* 數(shù)據(jù)類型 */* (編譯器相關(guān)) */typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; typedef unsigned int INT16U; typedef sig

34、ned int INT16S; typedef unsigned long INT32U; typedef signed long INT32S; typedef float FP32; typedef double FP64; typedef unsigned char OS_STK; typedef unsigned char OS_CPU_SR; /* 處理器相關(guān)代碼 */ #define OS_CRITICAL_METHOD 1#if OS_CRITICAL_METHOD = 1#define OS_ENTER_CRITICAL() EA=0 #define OS_EXIT_CRITI

35、CAL() EA=1 #endif #define OS_STK_GROWTH 0 #define OS_TASK_SW() OSCtxSw() #define OS_ISR_PROTO_EXT1void OSCtxSw(void);void InitHardware(void) reentrant; /*/ #endif 首先,文件先定義了整型數(shù)據(jù)類型。舉例來說,INT16U數(shù)據(jù)類型總是代表16位的無符號整型數(shù)。為了方便起見,雖然C/OS-中并不使用浮點數(shù),但還是定義了浮點數(shù)據(jù)類型。同時,將任務堆棧的寬度定義為8位。其次,OS_CRITICAL_METHOD的值意味著OS_ENTER_CRI

36、TICAL()和OS_EXIT_CRITICAL()兩個宏調(diào)用的實現(xiàn)方法。在此OS_CPU.H中,將OS_CRITICAL_METHOD的值宏定義為1,即OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()兩個宏調(diào)用的實現(xiàn)方法為最簡單的方法:調(diào)用相應處理器指令關(guān)中斷和開中斷(EA=0和EA=1)。最后,文件還通過宏定義指定了OS_STK_GROWTH的值為0。這表明堆棧從下(低地址)往上(高地址)遞增。而聲明函數(shù)OSCtxSw(),是用子程序調(diào)用來代替中斷調(diào)用;聲明InitHardware(),該函數(shù)用來實現(xiàn)初始化硬件時鐘中斷等系統(tǒng)初始化工作。3.3.2 OS_CPU_

37、C.C的修改在OS_CPU_C.C文件中,最重要的是OSTaskStkInit()函數(shù),OSTaskStkInit()是在用戶建立任務時被函數(shù)OSTaskCreate()和OSTaskCreateExt()調(diào)用,是系統(tǒng)內(nèi)部自己調(diào)用的,用來對用戶任務的堆棧進行初始化,并使用建立好的進入就緒態(tài)任務的堆棧與系統(tǒng)發(fā)生中斷并且將環(huán)境變量保存完畢時的棧結(jié)構(gòu)一致。這樣就可以用中斷返回指令使就緒的任務運行起來。其代碼如下:OS_STK *OSTaskStkInit (void (*task)(void *pd) reentrant, void *ppdata, OS_STK *ptos, INT16U opt

38、) reentrant OS_STK *stk; ppdata = ppdata; opt = opt; stk = ptos; /用戶堆棧最低有效地址 *stk+ = 15; /用戶堆棧長度 *stk+ = (INT16U)task & 0xFF; /任務地址低8位 *stk+ = (INT16U)task 8; /任務地址高8位 *stk+ = 0x0A; /ACC *stk+ = 0x0B; /B *stk+ = 0x00; /DPH *stk+ = 0x00; /DPL *stk+ = 0x00; /PSW *stk+ = 0x00; /R0 *stk+ = (INT16U)ppdat

39、a & 0xFF; /R1 *stk+ = (INT16U)ppdata 8; /R2 *stk+ = 0x01; /R3 *stk+ = 0x04; /R4 *stk+ = 0x05; /R5 *stk+ = 0x06; /R6 *stk+ = 0x07; /R7 *stk+ = (INT16U) (ptos+MaxStkSize) 8; *stk+ = (INT16U) (ptos+MaxStkSize) & 0xFF; return (void *)ptos);3.3.3 OS_CPU_A.ASM的修改移植工作的難點是在OS_CPU_A.ASM文件上,這里用戶需要編寫4個匯編語言函數(shù):O

40、SStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()。其中,OSTickISR()在OS_CPU_C.C中已經(jīng)用C語言實現(xiàn),即用定時器中斷處理了程序來代替它。因此,只需要寫3個匯編語言函數(shù)。OS_CPU_A.ASM部分代碼如下: EXTRN DATA (?C_XBP) EXTRN IDATA (OSTCBCur) EXTRN IDATA (OSTCBHighRdy) EXTRN IDATA (OSRunning) EXTRN IDATA (OSPrioCur) EXTRN IDATA (OSPrioHighRdy) EXTRN CODE (_?O

41、STaskSwHook) EXTRN CODE (_?OSIntEnter) EXTRN CODE (_?OSIntExit) EXTRN CODE (_?OSTimeTick)在OS_CPU_A.ASM的首部,聲明了引用的全局變量和外部子程序。接著是3個匯編函數(shù)OSStartHighRdy()、OSCtxSw()、OSIntCtxSw():調(diào)用運行優(yōu)先級最高的就緒任務函數(shù)OSStartHighRdy()。該函數(shù)是在操作系統(tǒng)初始化并建立了至少一個任務之后被調(diào)用的,它首先找到當前就緒的最高優(yōu)先級任務,并從該任務控制塊OS_TCB中取出堆棧指針,然后從堆棧中彈出全部寄存器,并RET返回。任務切換函

42、數(shù)OSCtxSw()。該函數(shù)是由于執(zhí)行進入任務切換宏OS_TASK_SW而進入的,它是一個任務級的切換函數(shù),它的主要任務是保存當前任務的CPU現(xiàn)場并恢復最高優(yōu)先級任務的CPU現(xiàn)場。中斷任務切換函數(shù)OSIntCtxSw()。該函數(shù)的工作是在中斷處理程序退出時進行任務切換。OSIntCtxSw()的代碼大部分都與OSCtxSw()相同,僅僅在以下兩點有所區(qū)別:由于中斷已經(jīng)發(fā)生,此處不需要再保存寄存器;OSIntCtxSw()需要調(diào)整堆棧指針,去掉堆棧中一些不需要的內(nèi)容,以使堆棧中止包含任務的運行環(huán)境。3.4 C/OS-在STC89C52上的移植3.4.1 Keil C51編譯器簡介大部分的C/OS

43、-代碼是用C語言寫的。因此,移植C/OS-需要一個C編譯器,此處選擇Keil C51作為開發(fā)平臺。Keil C51是美國Keil Software公司出品的基于80C51內(nèi)核的微處理器軟件開發(fā)平臺,內(nèi)嵌多種符合當前工業(yè)標準的開發(fā)工具,可以完成從工程的建立、管理、軟件編譯、鏈接,到目標代碼的生成、軟件方針和硬件方針等完整的開發(fā)流程。尤其C編譯工具在產(chǎn)生代碼的準確性和效率方面達到了較高的水平,而且刻意附加靈活的控制選項,在開發(fā)大型項目時非常理想。原則上我們不用修改與處理器無關(guān)的代碼,但是由于Keil C51編譯器的特殊性,這些代碼仍要多出改動。因為Keil C51在缺省情況下,編譯的代碼不可重入,

44、而多任務系統(tǒng)要求并發(fā)操作導致重入,所以要在每個C函數(shù)及其聲明后標注reentrant關(guān)鍵字。本論文采用的是Keil C51 V8版本作為開發(fā)平臺。3.4.2 移植測試程序為了證明C/OS-能在STC89C52上成功的移植,可以編寫一個測試程序來證明。本測試程序主要測試C/OS-內(nèi)核在STC89C52運行的正確性。測試程序?qū)釉贗/O口的發(fā)光二極管進行了閃亮操作,在實際過程中,設置了3個發(fā)光二極管的點亮任務:Task1:只點亮1號燈(Q1),然后延時4秒時間,優(yōu)先級為4;Task2:只點亮2號燈(Q2),然后延時2秒時間,優(yōu)先級為5;Task3:只點亮3號燈(Q3),然后延時1秒時間,優(yōu)先級為6

45、;3個任務的代碼如下: void Task1(void *ppdata) ppdata=ppdata; for(;) P1=0x7F; OSTimeDly(4*OS_TICKS_PER_SEC); void Task2(void *ppdata) ppdata=ppdata; for(;) P1=0xBF; OSTimeDly(2*OS_TICKS_PER_SEC); void Task3(void *ppdata) ppdata=ppdata; for(;) P1=0xDF; OSTimeDly(1*OS_TICKS_PER_SEC); 測試程序的main函數(shù)代碼如下: void main(

46、void) OSInit(); InitHardware(); OSTaskCreate(Task1,(void*)0,&TaskStartStk10,4); OSTaskCreate(Task2,(void*)0,&TaskStartStk20,5); OSTaskCreate(Task3,(void*)0,&TaskStartStk30,6); OSStart(); 將測試程序下載到目標板上,并分析執(zhí)行程序??梢郧逦挠^察到亮燈的順序為:Q1、Q2、Q3、Q3、Q2、Q3、Q3、Q1、Q2、Q3、Q3、Q2、Q3、Q3、Q1、Q2、Q3、Q3、Q2、Q3、Q3、Q1、Q2、Q3、Q3.分析

47、:系統(tǒng)啟動后,內(nèi)核完成必要的初始化之后,開始任務調(diào)度,此時Task1是4個就緒態(tài)任務中優(yōu)先級最高的,得到CPU開始執(zhí)行,點亮Q1,延時4秒,轉(zhuǎn)入休眠;接著轉(zhuǎn)入Task2,點亮Q2,延時2秒;最后Task3得到運行,點亮Q3,延時1秒。此時系統(tǒng)的執(zhí)行開始形成一個循環(huán):首先運行空閑任務直到1秒過去以后,Task3恢復,點亮Q3(此次點亮Q3即為上述實現(xiàn)數(shù)據(jù)中第一個標注出來的Q3),延時1秒。系統(tǒng)再次執(zhí)行空閑任務。再過去1秒,Task2、Task3同時恢復,但是由于Task2優(yōu)先級高于Task3,先點亮Q2,再點亮Q3,Task2和Task3分別再次延時2秒和1秒。再過去1秒,Task3恢復,點亮Q

48、3,延時1秒。再過去1秒,Task1、Task2、Task3同時恢復,依次點亮Q1、Q2、Q3,至此循環(huán)體結(jié)束。接下來系統(tǒng)將按照循環(huán)執(zhí)行下去。此測試程序中,C/OS-內(nèi)核保證了任務按照優(yōu)先級來搶奪CPU,并且能夠正確的完成任務調(diào)度。證明了C/OS-內(nèi)核的正確運行,移植的成功。此移植的成功表示著今后應用程序的編寫就可以在C/OS-的系統(tǒng)環(huán)境下編寫了,而不像以前要編寫大量的針對處理器的匯編程序。這樣就會大大減少程序的編寫難度,更是能大大縮短開發(fā)周期,同時也可以輕松的開發(fā)出比較復雜的應用程序了。4 基于C/OS-的應用系統(tǒng)設計4.1 基于C/OS-擴展RTOS的體系結(jié)構(gòu)將C/OS-移植到STC89C

49、52單片機上以后,接下來的工作就是對操作系統(tǒng)本身的擴充。C/OS-提供的僅僅是一個任務調(diào)度內(nèi)核,要想實現(xiàn)一個相對完整、使用的嵌入式操作系統(tǒng),還需要相當多的擴展性工作?;贑/OS-內(nèi)核擴展的RTOS的軟件整體框圖如圖4.1所示: 圖4.1 RTOS整體框圖外圍的硬件系統(tǒng)。因為整個RTOS體系可能設計用于多種功能的實現(xiàn),所以外圍的硬件系統(tǒng)就包括多個硬件模塊。它們通過不同方式與單片機形成一個整體系統(tǒng)。外圍的硬件系統(tǒng)是保證整個RTOS系統(tǒng)實現(xiàn)指定任務和指定功能的最底層部件。驅(qū)動程序。驅(qū)動程序是連接底層的硬件和C/OS-內(nèi)核的紐帶,有了驅(qū)動程序模塊,操作系統(tǒng)的API函數(shù)可以和底層的硬件分離開來。任何一

50、個硬件的改變、刪除或者添加,只需要隨之改變、刪除或者添加提供給操作系統(tǒng)的相應驅(qū)動程序就刻意了,并不會影響到API函數(shù)的功能,更不會影響到用戶的應用程序。操作系統(tǒng)的API函數(shù)。在操作系統(tǒng)中提供的標準的應用程序接口函數(shù),刻意加速用戶應用程序的開發(fā),同意應用程序的標準,同時也給操作系統(tǒng)版本的升級帶來了方便。在API函數(shù)中,提供了大量的常用模塊,可以大大簡化用戶應用程序的編寫。用戶應用程序。用戶的應用程序建立在系統(tǒng)的任務基礎之上。用戶應用程序主要通過調(diào)用系統(tǒng)的API函數(shù)對系統(tǒng)進行操作,完成用戶的要求。用戶在應用程序中創(chuàng)建自己的任務。任務之間的協(xié)調(diào)主要依賴于C/OS-內(nèi)核。4.2 實時溫度控制系統(tǒng)的設計

51、4.2.1 整體設計在論文的最后,設計一個簡單的實時溫度控制系統(tǒng)。首先,進行一個整體性的需求分析:實時采集室內(nèi)溫度。實時顯示當前室內(nèi)溫度。為用戶提供一個輸入模塊,讓其輸入想設定的室內(nèi)溫度。進行實際溫度和設定溫度的比較。根據(jù)不同的情況對室內(nèi)溫度進行制冷或制熱的調(diào)整。4.2.2 硬件模塊設計針對上述整體性的需求分析,我們可以針對硬件模塊進行一個初步的設計。由于本論文所討論的是基于嵌入式實時操作系統(tǒng)平臺上的應用系統(tǒng)設計,所以在這個嵌入式實時操作系統(tǒng)平臺之下的硬件模塊的實現(xiàn)不在論文中做詳細的論述。此實時溫度控制系統(tǒng)的硬件模塊設計如圖4.2所示: 圖4.2 硬件模塊設計 共有5個模塊,分別對應各自的硬件設備。其中制熱系統(tǒng)模塊和制冷系統(tǒng)模塊比其他3模塊更龐大、更復雜。4.2.3 系統(tǒng)程序的設計整個實時溫度控制系統(tǒng)的系統(tǒng)程序由以下幾部分構(gòu)成:硬

溫馨提示

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

評論

0/150

提交評論