基于ARM9的UCOS-II移植.doc_第1頁
基于ARM9的UCOS-II移植.doc_第2頁
基于ARM9的UCOS-II移植.doc_第3頁
基于ARM9的UCOS-II移植.doc_第4頁
基于ARM9的UCOS-II移植.doc_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

編號: 嵌入式系統(tǒng)設(shè)計與制作(論文)說明書題 目: 基于嵌入式ARM的 C/OS-II移植 院 (系): 信息與通信學(xué)院 專 業(yè): 電子信息工程 學(xué)生姓名: 學(xué) 號: 指導(dǎo)教師: 2012年12月29日嵌入式系統(tǒng)設(shè)計與制作實訓(xùn)任務(wù)書年級: 09 級 面向?qū)I(yè): 電子信息工程 學(xué)時: 3周 項目名稱:基于嵌入式ARM的C/OS-II移植項目類型硬件與軟件制作特殊要求無承擔學(xué)生姓名學(xué)號專業(yè)聯(lián)系電話電子信息工程項目設(shè)計要求:基本功能要求:1 移植目標芯片ARM92 移植相關(guān)文件的程序注釋3 設(shè)計測試程序測試系統(tǒng)穩(wěn)定性參考資料: 1.譚浩強.C程序設(shè)計.北京:清華大學(xué)出版社,20052.Chris Wright等.ARM嵌入式系統(tǒng)開發(fā).北京:北京航空航天大學(xué)出版社,20053.任哲.嵌入式實時操作系統(tǒng)C/OS-II原理及應(yīng)用.北京.北京航空航天大學(xué)出版社,20054. JeanJ Labrosse.嵌入式實時操作系統(tǒng)C/OS-II.北京.北京航空航天大學(xué)出版社,20035.Norman Matloff等.軟件調(diào)試的藝術(shù).北京:人民郵電出版社,2010完成形式:1. 設(shè)計與制作可供實際檢測的實物樣板;2. 每組的兩位同學(xué)完成一個作品,作品的內(nèi)容必須和ARM嵌入式相關(guān);3. 完成實訓(xùn)論文。項目設(shè)計進度要求:選題:12月09日-12月10日查找資料和方案確定:12月11日-12月15日移植ucosII:12月16日-12月25日軟件和硬件調(diào)試:12月26日-12月27日論文:12月28日驗收:12月29日項目驗收方式:1、在實訓(xùn)期間進行作品驗收,驗收后交實訓(xùn)論文及實訓(xùn)的資料打印稿及電子文稿。2、設(shè)計報告要符合桂林電子科技大學(xué)畢業(yè)設(shè)計論文統(tǒng)一格式。項目開始時間:2012年12月09日項目結(jié)束時間:2012年12月29日任務(wù)下達:2012年12月09日摘 要以應(yīng)用為中心、以計算機為基礎(chǔ)的嵌入式技術(shù),是當今發(fā)展最快、應(yīng)用最廣、最有發(fā)展前景的主要技術(shù)之一。嵌入式技術(shù)已經(jīng)被廣泛應(yīng)用于工業(yè)控制、移動通信、信息家電、醫(yī)療儀器、汽車電子、航空航天等各個領(lǐng)域。在各種嵌入式處理器中,ARM以體積小、低功耗、低成本、高性能等優(yōu)點,獲得許多半導(dǎo)體廠商的支持,在嵌入式應(yīng)用領(lǐng)域取得巨大的成功。軟件方面,uC/OS是一種免費公開源代碼、結(jié)構(gòu)小巧、具有可剝奪實時內(nèi)核的實時操作系統(tǒng),因而被使用頻繁。本文主要研究了C/OS-II在S3c2440芯片上的移植。本文通過對S3c2440硬件和源碼公開的嵌入式實時操作系統(tǒng)C/OS-II的分析,以S3C2440為例,闡述了在ARM9上移植C/OS-II,來運行多個任務(wù),用液晶顯示來說明C/OS-II移植的優(yōu)缺點,以及在移植中應(yīng)注意的問題,啟動代碼的理解,解析代碼的優(yōu)化。關(guān)鍵詞:嵌入式系統(tǒng);實時;ARM9;C/OS-IIAbstractApplication, embedded computer-based technology, is one of todays fastest-growing, most widely used, the most promising technologies. Embedded technology has been widely used in industrial control, mobile communications, information appliances, medical equipment, automotive electronics, aerospace and other fields.In a variety of embedded processors, ARM advantages of small size, low-power, low-cost, high-performance, get the support of many semiconductor manufacturers, achieved great success in the field of embedded applications. Software, u C / OS is a free, open-source, compact structure, can be deprived of a real-time operating system for real-time kernel, thus frequent.This paper studies the C / OS-II in the S3c2440 chip transplant. This article by S3c2440 hardware and open source embedded real-time operating system C / OS-II analysis, for example, described to S3C2440 ARM9 on transplantation C / OS-II to run multiple tasks to illustrate with LCD transplant C / OS-II strengths and weaknesses, as well as the transplant should pay attention to the problem of understanding of the startup code, the parsing code optimization.Key words: embedded system; real-time; ARM9; C / OS-II26目 錄引言11 S3C2440系列微處理器簡介11.1ARM9內(nèi)核11.2ARM9開發(fā)板32 C/OS-II42.1C/OS-II分析42.1.1任務(wù)運行62.1.2任務(wù)通信72.1.3內(nèi)存動態(tài)分配83 C/OS-II在ARM9上的移植93.1與CPU有關(guān)的文件93.1.1 OS_CPU.H93.1.2OS_CPU_C.C103.1.3OS_CPU_A.S123.2移植代碼實現(xiàn)134 測試程序234.1整個測試程序的效果圖234.2測試程序的功能235 總結(jié)24謝 辭25參考文獻26桂林電子科技大學(xué)實訓(xùn)說明書用紙引言早在20世紀60年代,就已經(jīng)有人開始研究和開發(fā)嵌入式操作系統(tǒng)。但直到最近,它才在國內(nèi)被越來越多的提及,在通信、電子、自動化等需要實時處理的領(lǐng)域所曰益顯現(xiàn)的重要性吸引了人們越來越多的注意力。但是,人們所談?wù)摰耐且恍┲纳虡I(yè)內(nèi)核,諸如VxWorks、PSOS等。這些商業(yè)內(nèi)核性能優(yōu)越,但價格昂貴,主要用于16位和32位處理器中,針對國內(nèi)大部分用戶使用的risc系列8/16/32位單片機,可以選擇免費的ucos ii。通過在LPC2132上移植移植ucosii,移植bootload,ucosii的遠行原理。在原理的分析中,通過理論的學(xué)習,理論結(jié)合實際,通過制作和調(diào)試實驗板,其中多次用到單一分析法,單一調(diào)試各個分支,然后系統(tǒng)綜合所有任務(wù),完成整個系統(tǒng)遠行。論文第一章主要介紹lpc2132硬件結(jié)構(gòu)和代碼的編寫;第二章討論ucosii代碼結(jié)構(gòu);第三章分析ucosii在arm板上的移植。1 S3C2440系列微處理器簡介 1.1ARM9內(nèi)核在ARM9系列處理器中S3C2440A是三星公司推出的一款功能強大,功耗極低的基于ARM920T核心的嵌入式處理器,它為手持設(shè)備和普通應(yīng)用提供了低功耗和高性能的小型芯片微控制器的解決方案。為了降低整體系統(tǒng)成本,S3C2440A還提供了豐富的內(nèi)部設(shè)備,其基本特征如下:基于ARM920T內(nèi)核,支持JTAG仿真調(diào)試;具備16KB的指令緩存和16KB的數(shù)據(jù)緩存;具有MMU,支持Windows CE、PalmOS、Symbian OS、Linux等操作系統(tǒng);有外部存儲控制器(SDRAM控制和片選邏輯);LCD 控制器(最大支持4K色STN和256K色TFT)提供1通道LCD專用DMA;4通道DMA有外部請求引腳;3通道UART(IrDA1.0,64字節(jié)發(fā)送FIFO和64字節(jié)接收FIFO);2通道SPI;1通道IIC總線接口(支持多主機);1通道IIS總線音頻編碼器接口;AC97編解碼器接口;兼容SD主接口協(xié)議1.0版和MMC卡協(xié)議2.11兼容版;2通道USB主機/1通道USB設(shè)備(1.1版);4通道PWM定時器和1通道內(nèi)部定時器/看門狗定時8通道10位ADC和觸摸屏接口;具有日歷功能的RTC;攝像頭接口(最大支持40964096像素輸入;20482048像素輸入支持縮放);130個通用I/O口和24通道外部中斷源;具有普通、慢速、空閑和掉電模式;具有PLL片上時鐘發(fā)生器;圖1.1 ARM模塊示圖1.2ARM9開發(fā)板基于S3C2440A的ARM9開發(fā)板在目前市場上有很多如友善之臂的mini2440、飛凌的TE2440開發(fā)板和OK2440開發(fā)板、天嵌科技的TQ2440開發(fā)板等等。在眾多知名的開發(fā)板中它們都包含了豐富的硬件資源及參考資料。在這些開發(fā)板中都包含了電源電路、系統(tǒng)復(fù)位電路、系統(tǒng)時鐘電路、JTAG接口、串行接口、按鍵輸入接口、IIC接口、USB接口、IIS音頻數(shù)據(jù)接口電路、以太網(wǎng)接口、ADC輸入接口、攝像頭接口、液晶接口等電路。本文選用Micro2440開發(fā)板,采用底板與核心板分離設(shè)計,核心板6層布線系統(tǒng)運行相對比較穩(wěn)定,底板預(yù)留了各個接口及總線的排針接口非常方便二次開發(fā),對于液晶屏接口它采用的是24位,比其它非24位的要好得多。在技術(shù)售后方面該公司還專門建立了BBS,對使用中遇到的難題會有熱心人士解答或有公司專業(yè)人士解答。目前使用TQ2440開發(fā)板在車載手持設(shè)備、GIS平臺、Data Servers、VOIP、網(wǎng)絡(luò)終端、工業(yè)控制、檢測設(shè)備、儀器儀表、智能終端、醫(yī)療器械、安全監(jiān)控等產(chǎn)品中均有應(yīng)用。本設(shè)計使用TQ2440開發(fā)板作為硬件平臺,其中它的板載存儲器資源有:一片2MB的Nor Flash(EN29LV160AB)一片256MB的Nand Flash (K9F2G08U0A) 及用2片SDRAM (MT48LC16M16A2)組成32位總線寬度構(gòu)成64MB32bit的SDRAM,供系統(tǒng)使用。從性能及板載資源來看它完成勝任于本設(shè)計。2 C/OS-II隨著嵌入式技術(shù)的快速發(fā)展,實時多任務(wù)操作系統(tǒng)作為一種軟件平臺已逐步成為國際嵌入式系統(tǒng)的主流,目前世界上已經(jīng)有一大批成熟的實時嵌入式操作系統(tǒng),通常,對嵌入式軟件的基本要求是體積小、指令速度快、具有較好的裁減性和可移植性,目前,實時操作系統(tǒng)很多,如VxWorks,WindowsCE,pSOS,QNX,LynxOS等,這些操作系統(tǒng)都具有高可靠性、強實時性等特點,但他們都是商業(yè)操作系統(tǒng),價格昂貴,人們往往很難接受,C/OS-操作系統(tǒng)的出現(xiàn)是對這些商業(yè)操作系統(tǒng)的一個很大的沖擊。C/OS-是源碼公開的實時操作系統(tǒng),是一個自由操作系統(tǒng)。程序開發(fā)人員可以改寫源代碼,使之符合自己的要求,裁減掉不需要的部分,使操作系統(tǒng)變得小巧、靈活、并且能滿足用戶特定操作系統(tǒng)的需要。為了提高系統(tǒng)的實時能力,C/OS-可以將一個復(fù)雜的應(yīng)用劃分為多個相互獨立的任務(wù),并根據(jù)任務(wù)的重要性來分配優(yōu)先級。任務(wù)的調(diào)度完全由C/OS-的實時內(nèi)核完成,主要包括任務(wù)的狀態(tài)管理、選擇最高優(yōu)先級的任務(wù)、執(zhí)行任務(wù)和撤銷任務(wù)等,C/OS-內(nèi)核還負責CPU時間分配,CPU時間總是優(yōu)先分配給中斷事件,其次是任務(wù)隊列中當前優(yōu)先級最高的任務(wù),不同任務(wù)間的通信可以通過C/OS-提供的信號量、郵箱、信息隊列等機制完成,他的絕大部分代碼是用C語言編寫的,可移植性強,因此1997年以后,在國際上逐漸被廣泛采用。2.1C/OS-II分析實時系統(tǒng)的特點是,如果邏輯和時序出現(xiàn)偏差將會引起嚴重后果的系統(tǒng)。有兩種類型的實時系統(tǒng):軟實時系統(tǒng)和硬實時系統(tǒng)。在軟實時系統(tǒng)中系統(tǒng)的宗旨是使各個任務(wù)運行得越快越好,并不要求限定某一任務(wù)必須在多長時間內(nèi)完成。在硬實時系統(tǒng)中,各任務(wù)不僅要執(zhí)行無誤而且要做到準時。大多數(shù)實時系統(tǒng)是二者的結(jié)合。實時系統(tǒng)的應(yīng)用涵蓋廣泛的領(lǐng)域,而多數(shù)實時系統(tǒng)又是嵌入式的。這意味著計算機建在系統(tǒng)內(nèi)部,用戶看不到有個計算機在系統(tǒng)里面。以下是一些嵌入式系統(tǒng)的例子:通訊類:Switch Hurb路由器機器人:航空航天飛機管理系統(tǒng)過程控制:藥品加工化工廠汽車業(yè):發(fā)動機控制防抱死系統(tǒng)(ABS)實時應(yīng)用軟件的設(shè)計一般比非實時應(yīng)用軟件設(shè)計難。不復(fù)雜的小系統(tǒng)一般設(shè)計成如圖2.1 ucosii工作原理簡圖上圖所示的那樣時間相關(guān)性很強的關(guān)鍵操作(Criticaloperation)一定是靠中斷服務(wù)來保證的。因為中斷服務(wù)提供的信息一直要等到后臺程序走到該處理這個信息這一步時才能得到處理,這種系統(tǒng)在處理信息的及時性上,比實際可以做到的要差。這個指標稱作任務(wù)級響應(yīng)時間。最壞情況下的任務(wù)級響應(yīng)時間取決于整個循環(huán)的執(zhí)行時間。因為循環(huán)的執(zhí)行時間不是常數(shù),程序經(jīng)過某一特定部分的準確時間也是不能確定的。進而,如果程序修改了,循環(huán)的時序也會受到影響。 2.1.1任務(wù)運行任務(wù)的狀態(tài)如下:1.睡眠態(tài)(taskdormat):任務(wù)駐留于程序空間(rom或ram)中,暫時沒交給ucos-ii處理。2.就緒態(tài)(taskready):任務(wù)一旦建立,這個任務(wù)就進入了就緒態(tài)。3.運行態(tài)(taskrunning):調(diào)用OSStart()可以啟動多任務(wù)。OSStart()函數(shù)只能調(diào)用一次,一旦調(diào)用,系統(tǒng)將運行進入就緒態(tài)并且優(yōu)先級最高的任務(wù)。4.等待狀態(tài)(taskwaiting):正在運行的任務(wù),通過延遲函數(shù)或pend(掛起)相關(guān)函數(shù)后,將進入等待狀態(tài)。5.中斷狀態(tài)(ISRrunning):正在運行的任務(wù)是可以被中斷的,除非該任務(wù)將中斷關(guān)閉或者ucos-ii將中斷關(guān)閉。任務(wù)是一個無返回的無窮循環(huán),都有唯一的一個優(yōu)先級。uc/os-ii總是運行進入就緒狀態(tài)的最高優(yōu)先級的任務(wù)。因為uc/os-ii總是運行進入就緒狀態(tài)的最高優(yōu)先級的任務(wù)。所以,確定哪個任務(wù)優(yōu)先級最高,下面該哪個任務(wù)運行,這個工作就是由調(diào)度器(scheduler)來完成的。任務(wù)級的調(diào)度是由函數(shù)OSSched()完成的,而中斷級的調(diào)度是由函數(shù)OSIntExt()完成。對OSSched(),它內(nèi)部調(diào)用的是OS_TASK_SW()完成實際的調(diào)度(人為模仿一次中斷);OSIntExt()內(nèi)部調(diào)用的是OSCtxSw()實現(xiàn)調(diào)度。任務(wù)切換其實很簡單,由如下2步完成:(1)將被掛起任務(wù)的處理器寄存器推入自己的任務(wù)堆棧。(2)然后將進入就緒狀態(tài)的最高優(yōu)先級的任務(wù)的寄存器值從堆棧中恢復(fù)到寄存器中。圖2.2 OS_TCB鏈結(jié)構(gòu)調(diào)度算法主要基于分級查詢??紤]到任務(wù)數(shù)目64,可以用6bit來表示,分為高3位和低3位。uC/OS-II將優(yōu)先級進行分組,按高三位進行分組,可得8個(最多)優(yōu)先級數(shù)組(000-111);每個優(yōu)先級的在數(shù)組中的位置由其低三位表示。在源碼中,高三位用帶Y后綴的變量表示,而低三位用帶X后綴的變量表示。這樣建立了1個變量OSRdyGrp(INT8U,8bit,每個bit代表一組)和1個數(shù)組OSRdyTbl8(INT8U,每組8bit,每個bit代表一個優(yōu)先級)。這樣形成了的二級查詢,先選組,再選組內(nèi)偏移。圖2.3 ucosii任務(wù)等待表2.1.2任務(wù)通信任務(wù)有如下狀態(tài):1.空閑任務(wù)(IdleTask)空閑任務(wù)OSTaskIdle()什么也不做,只是在不停地給一個32位的名叫OSIdleCtr的計數(shù)器加1,統(tǒng)計任務(wù)使用這個計數(shù)器以確定現(xiàn)行應(yīng)用軟件實際消耗的CPU時間。2.統(tǒng)計任務(wù)(OSTaskstat)統(tǒng)計任務(wù)每秒計算一次CPU在單位時間被使用的時間,并且把計算結(jié)果一百分比的形式存放在變量OSCPUUsage中,以便應(yīng)用程序通過反問來了解CPU的利用率,如果用戶要使用這個函數(shù),那么在系統(tǒng)頭文件OS_CFG.H中的系統(tǒng)配置常數(shù)OS_TASK_STAT_EN設(shè)置為1,創(chuàng)建之前,調(diào)用OSTaskstat對統(tǒng)計任務(wù)進行初始化。3.非系統(tǒng)任務(wù)這些任務(wù)是用戶任務(wù),通過運行,達到測量、監(jiān)測、通信等功能,如圖2.4。圖2.4 Relationshipbetweentasks,ISRsandasemaphore2.1.3內(nèi)存動態(tài)分配Ucos為內(nèi)存中存儲塊的動態(tài)分配提供了支持。不同于malloc(),free(),ucos的存儲管理機制是基于固定大小存儲塊的分配與回收。對于任務(wù)而言,每次只能申請固定大小的存儲塊,因而不存在外部碎片的問題??茖W(xué)利用內(nèi)存,操作系統(tǒng)把連續(xù)的大塊內(nèi)存按分區(qū)來管理,每個分區(qū)中包含有整數(shù)個大小相同的內(nèi)存塊,使得它們可以分配和釋放固定大小的內(nèi)存塊。如下圖所示:圖2.8 內(nèi)存模塊3 C/OS-II在ARM9上的移植隨著國內(nèi)工業(yè)化、數(shù)字化的步伐加快,嵌入式開發(fā)在IT行業(yè)中的重要性越來顯著。中國成為“世界制造中心”甚至“設(shè)計中心”的趨勢,必然對小型數(shù)字控制系統(tǒng)的需求越來越大。在這種情況下,類似于UCOS-II的小型硬實時嵌入式操作系統(tǒng)內(nèi)核,具有低成本、易控制、小規(guī)模、高性能的特性,因而有相當好的發(fā)展前景。但是這類系統(tǒng)的基礎(chǔ)較為薄弱,面臨產(chǎn)品化、商業(yè)化程度不夠的問題。采用此類系統(tǒng)進行產(chǎn)品開發(fā)需要仔細的分析、設(shè)計,否則也很難真正滿足工業(yè)產(chǎn)品生產(chǎn)的要求。正是針對這種情況,在ARM微處理器環(huán)境下,針對商業(yè)化、產(chǎn)品化環(huán)境的嚴格要求,設(shè)計構(gòu)造了一種硬實時嵌入式內(nèi)核體系結(jié)構(gòu)。當然真正的商業(yè)化、產(chǎn)品化的嵌入式內(nèi)核,既需要這種能夠滿足高標準要求的體系結(jié)構(gòu)設(shè)計基礎(chǔ),還需要嚴格的產(chǎn)品化軟件開發(fā)測試過程。只有理論基礎(chǔ)和工程實踐完整的結(jié)合,才能產(chǎn)生真正經(jīng)受得起考驗的,能夠滿足工業(yè)化生產(chǎn),能夠在各種環(huán)境下穩(wěn)定運行并確保達到設(shè)計目的的產(chǎn)品。從這個角度考慮,僅僅拿來一個操作系統(tǒng)內(nèi)核并開發(fā)應(yīng)用產(chǎn)品,很難萬全滿足這種要求。必須要對內(nèi)核的涉及思路進行仔細的考慮、驗證,對應(yīng)用的可選開發(fā)設(shè)計方法進行審慎的評估,并配合真正工業(yè)化的項目發(fā)管理辦法,才能保障產(chǎn)品達到要求。3.1與CPU有關(guān)的文件與處理器相關(guān)的代碼,這是移植中最關(guān)鍵的部分。內(nèi)核將應(yīng)用系統(tǒng)和底層硬件有機地結(jié)合成一個實時系統(tǒng),要使同一個內(nèi)核能適用于不同的硬件體系,就需要在內(nèi)核和硬件之間有一個中間層,這就是與處理器相關(guān)的代碼,處理器不同,這部分代碼也不同,我們在移植時需要自己處理這部分代碼,在C/OS中這一部分代碼分成3個文件:OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C,分別如下:3.1.1 OS_CPU.H包含了用#define定義的與處理器相關(guān)的常量、宏和類型定義,具體有系統(tǒng)數(shù)據(jù)類型定義、棧增長方向定義、關(guān)中斷和開中斷定義、系統(tǒng)軟中斷的定義等。(1)不依賴于編譯的數(shù)據(jù)類型C/OS-不使用C語言中的short,int和long等數(shù)據(jù)類型的定義,因為他們與處理器類型有關(guān),隱含著不可移植性,代之以移植性強的整數(shù)數(shù)據(jù)類型,這樣,既直觀又可移植。根據(jù)ADS編譯器的特性,代碼為:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedshortINT16U;typedefsignedshortINT16S;typedefunsignedintINT32U;typedefsignedintINT32S;typedeffloatFP32;typedefdoubleFP64;typedefINT32UOS_STK;(2)使用軟中斷SWI做底層接口因為帶T變量的ARM7處理器核具有兩個指令集,用戶任務(wù)可以使用兩種處理器模式,為了使底層接口函數(shù)與處理器狀態(tài)無關(guān),同時在任務(wù)調(diào)用相應(yīng)函數(shù)時不需要知道該函數(shù)位置,本例使用軟中斷指令SWI作為底層接口,使用不同的功能號區(qū)分不同的函數(shù)。(3)OS_STK_GROWTHC/OS-使用結(jié)構(gòu)常量OS_STK_GROWTH指定堆棧的生長方式,其lpc2132代碼為:#defineOS_STK_GROWTH13.1.2OS_CPU_C.C移植OS_CPU_C.C文件時,需要編寫的是任務(wù)堆棧初始化函數(shù)OSTaskStkInit和時鐘節(jié)拍中斷服務(wù)鉤子函數(shù)OSTimeTickHook。在C/OS-II中,每一個任務(wù)都有自己的任務(wù)堆棧,當發(fā)生任務(wù)切換或者中斷時,其CPU使用權(quán)被剝脫,為了任務(wù)能被再次運行,那么這個被打斷的任務(wù)所用到的處理器的寄存器內(nèi)容均應(yīng)得到保存,按照ARM7處理器的壓棧和入棧指令的特點,設(shè)計任務(wù)堆棧如下3:CPSRR0R1R12LR(R14)PC(R15)根據(jù)任務(wù)堆棧結(jié)構(gòu)示意圖,OS_STK函數(shù)編寫如下5:#defineSVCMODE0x13OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt)OS_STK*stk;opt=opt;stk=(OS_STK)ptos;*-stk=(OS_STK)task;*-stk=(OS_STK)task;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=0;*-stk=(INT32U)pdata;*-stk=(SVC32MODE|0x40);return(OS_STK*)stk);說明:用戶創(chuàng)建任務(wù)時,OSTaskCreat()會調(diào)用OSTaskStkInit函數(shù)初始化該任務(wù)的堆棧,并把返回的堆棧指針保存到該任務(wù)的TCB結(jié)構(gòu)中的最前面的參數(shù)OSTCBStkPtr中,當該任務(wù)要被恢復(fù)時,任務(wù)切換函數(shù)從其TCB塊中取得其任務(wù)堆棧指針,依次將堆棧內(nèi)容彈到處理器對應(yīng)的CPSR、r0,r1,r12,lr,pc的寄存器中,完成現(xiàn)場的恢復(fù)和程序指針PC的返回。另一個需要編寫的函數(shù)是OSTimeTickHook,該函數(shù)被時鐘節(jié)拍中斷服務(wù)函數(shù)OSTickISR中的OSTimeTick函數(shù)調(diào)用,用來清除時鐘節(jié)拍中斷發(fā)生設(shè)備的請求。本移植方案使用處理器的RTC模塊的tick中斷作為時鐘節(jié)拍中斷,該函數(shù)編寫如下:voidOSTimeTickHook(void)rI_ISPC=(INT32U)0x01)20;注意:用戶也可不修改此函數(shù),但是必須在OSTickISR中執(zhí)行清除發(fā)生節(jié)拍中斷的設(shè)備的中斷請求標志,為便于說明,本文將利用內(nèi)核提供給用戶的OSTimeTickHook函數(shù)來完成清中斷的任務(wù)。另外幾個hook函數(shù)不必去改它們,至此,OS_CPU.C編寫完成。包含了與移植有關(guān)的C函數(shù),包括堆棧的初始化和一些鉤子函數(shù)的實現(xiàn),但是最重要的是OSTaskStkInit()函數(shù),該函數(shù)是在用戶建立任務(wù)時系統(tǒng)內(nèi)部自己調(diào)用的,用來對用戶任務(wù)的堆棧初始化。在ARM7體系結(jié)構(gòu)下,任務(wù)堆??臻g由高至低遞減,依次保存著PC,LR,R12,R1,R0,CPSR的初始化堆棧結(jié)構(gòu),當用戶初始化了堆棧,OSTaskStkInit()就返回新的堆棧指針STK所指的定地址。OSTaskCreate()和OSTaskCreateExt()會獲得該地址并將他保存到任務(wù)控制塊TCB中,其他的幾個鉤子函數(shù)必須聲明,但可以不包含任務(wù)代碼,這些鉤子函數(shù)在本移植中全為空函數(shù)。3.1.3OS_CPU_A.SC/OS-移植的絕大部分工作都集中在OS_CPU_A.S文件的移植上,在這個文件里,最困難的工作又集中體現(xiàn)在OSIntCtxSw和OSTickISR這兩個函數(shù)的實現(xiàn)上。這是因為這兩個函數(shù)的實現(xiàn)是和移植者的移植思路以及相關(guān)硬件定時器、中斷寄存器的設(shè)置有關(guān),在實際的移植工作中,這兩個地方也是比較容易出錯的地方,這部分需要對處理器的寄存器進行操作,所以必須用匯編語言編寫,包括4個子函數(shù):OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。OSStartHighRdy()該函數(shù)首先調(diào)用鉤子函數(shù)OSTaskSwHook(),然后將OSRunning標志位設(shè)置為真,表示任務(wù)開始執(zhí)行,從而保證任務(wù)切換操作的正確執(zhí)行,緊接著從具有最高優(yōu)先級的任務(wù)控制塊中取得任務(wù)的堆棧指針,初始化堆棧指針寄存器SP,然后恢復(fù)其他的寄存器,開始執(zhí)行最高優(yōu)先級的任務(wù)。OSCtxSw()該函數(shù)在任務(wù)級任務(wù)切換函數(shù)中調(diào)用,首先保存處理器寄存器,將當前SP存入任務(wù)TCB中,載入就緒最高優(yōu)先級任務(wù)的SP,從新任務(wù)的任務(wù)堆棧中恢復(fù)處理器所有寄存器的值,然后執(zhí)行中斷返回指令。OSIntCtxSw()該函數(shù)是在ISR中執(zhí)行任務(wù)切換功能,其原理基本上與任務(wù)級的切換相同,區(qū)別只是ISR已經(jīng)保存了CPU的寄存器,因此不要再進行類似的操作,只需對堆棧指針作相應(yīng)的調(diào)整即可。OSTickISR()該函數(shù)是系統(tǒng)時鐘節(jié)拍中斷服務(wù)函數(shù),首先要保存處理器寄存器,接著調(diào)用OSIntEnter()函數(shù),以保證中斷嵌套層數(shù)不超過255層,如果滿足了該條件,則把堆棧指針保存到當前任務(wù)的任務(wù)控制塊TCB中,然后給產(chǎn)生中斷的設(shè)備清中斷,重新允許中斷,接下來調(diào)用OSTimeTick()來維持C/OS-內(nèi)部的定時以及調(diào)用OSIntExit()函數(shù)決定是否因為這個中斷服務(wù)程序的執(zhí)行,使得更高優(yōu)先級的任務(wù)就緒。這一部分是用戶根據(jù)自己的應(yīng)用系統(tǒng)來定制合適的內(nèi)核服務(wù)功能,包括2個文件:OS_CFG.H和INCLUDES.H。OS_CFG.H用來配置內(nèi)核,用戶根據(jù)需要對內(nèi)核進行修改,留下需要的部分,去掉不需要的部分,比如系統(tǒng)可提供的最大任務(wù)數(shù)量,是否定制郵箱服務(wù),是否提供優(yōu)先級動態(tài)改變功能等等,所有的配置更改包括頭文件的增減均在該文件中進行。INCLUDES.H系統(tǒng)頭文件,整個實時系統(tǒng)程序所需要的文件,包括了內(nèi)核和用戶的頭文件,這樣使得用戶項目中的每個C文件不用分別去考慮他實際上需要哪些頭文件。3.2移植代碼實現(xiàn)復(fù)位入口代碼的主要功能就是設(shè)置好PLL然后搬遷代碼。此處列出的是標準寫法,根據(jù)編譯鏈接參數(shù)不同,還有其他一些優(yōu)化寫法。例如,在編譯調(diào)試工具中(SDTV2.51或ADSV1.2),如果只配置RO-BASE參數(shù),不配置RW-BASE參數(shù),RO和RW段是自然銜接的,這樣代碼的拷貝搬遷工作可以簡化。另外要注意的是,這部分代碼要仔細檢查、調(diào)試實際的執(zhí)行結(jié)果。例如,搬遷后,應(yīng)該初始化的全局變量是否正確初始化。SDTV2.51下,如果用JTAG調(diào)試,RW-BASE配置了參數(shù),直接下載代碼到RAM中,因為沒有自己控制內(nèi)存搬遷和拷貝初始化數(shù)據(jù)段的代碼,就存在全局變量沒有正確初始化的問題。工程師編寫代碼的時候,不可能不考慮調(diào)試狀態(tài),因此這種調(diào)試狀態(tài)下代碼段搬遷的初始化問題同樣要仔細考慮。比較好的方式,是在模塊的初始化函數(shù)中,進行所有處于RW段、ZI段的全局變量的詳細初始化。這種初始化過程不影響主體代碼的僅僅在開始階段執(zhí)行一次,完全不會影響主體程序的執(zhí)行效率,確能夠保障代碼在任何情況下的穩(wěn)定運行。代碼三十五.2132復(fù)位及中斷入口代碼init.sIMPORTi_pCurTcbIMPORTIrqFinishIMPORTPreISRIMPORTIntrNestedIMPORTI2C0VectIMPORTIsrHandlerIMPORT|Image$RO$Limit|IMPORT|Image$RW$Base|IMPORT|Image$ZI$Base|IMPORT|Image$ZI$Limit|EXPORTENTER_U0EXPORTENTER_U1EXPORTENTER_I2C0EXPORTENTER_DEFAREAInit,CODE,READONLYCODE32ENTRY;入口;/*/;/異常矢量,接到異常跳轉(zhuǎn)*/;/有順序問題必須按照異常順序*/;/*/bHandlerRST;實際啟動點,非再次跳轉(zhuǎn)的例程bHandleFIQ;此下之后均為再次跳轉(zhuǎn)例程bHandleFIQbHandleFIQbHandleFIQ;不適合跳轉(zhuǎn)處理DCD0xA73FFFC6LDRPC,PC,#-0xff0;分發(fā)例程可以C安裝設(shè)備中斷HandleFIQ;不處理FIQ,所有異常進入此處死循環(huán)nop;并通過看門狗完成復(fù)位bHandleFIQLTORG;/*/;/*IRQ中斷預(yù)處理例程*/;/*入口條件:IRQ中斷屏蔽,LR是被中斷任務(wù)或ISR的PC值,*/;/*SPSR是被中斷任務(wù)或ISR的當前處理器狀態(tài)值,*/;/*SP是IRQ模式當前堆棧指針值*/;/*/HandlerIRQ;/*/;1.4SPSR保存到R0;壓棧R0,是IRQ模式的SPSR,也是被中斷模式的CPSR;/*/mrsr4,spsrstmfdsp!,r4movr0,r6blPreISR;r0中返回處理結(jié)果cmpr0,#0beqkeepirq;/*/;結(jié)束應(yīng)急處理并結(jié)束中斷處理,已處理完;/*/ldrr0,=SFR_VICVectAddrldrr1,=0strr1,r0ldmfdsp!,r0msrspsr_cxsf,r0ldmfdsp!,r0-r12,lr,pcLTORGkeepirq;/*/;1.6恢復(fù)堆棧指針的原值,并保存到R3;方便后面算法使用,此后不再用到IRQ堆棧;/*/addr3,sp,#64movsp,r3;/*/;2.判斷是否第一層中斷,如果不是第一層,進入3;2.1嵌套中斷數(shù)變量地址到R0,變量值讀入到R1;/*/ldrr0,=IntrNestedldrr1,r0cmpr1,#0;/*/;2.2如果不是第一次,跳到第3步;/*/bneIRQNESTMODE;/*/;3設(shè)置嵌套層數(shù)為1。R1=1,保存R1值到R0地址(前面2.1);/*/ldrr1,=1strr1,r0;/*/;不是嵌套中斷切換到svc模式處理任務(wù);3.1切換到SVC模式,第一層中斷,一定是中斷運行在SVC模式下的任務(wù);/*/msrcpsr_cxsf,#ARM9_SVC_MOD|ARM7_I_BIT;/*/;3.2將保存在IRQ模式下的任務(wù)環(huán)境拷貝到任務(wù)的堆棧(SP),;其中LR無法拷貝,需要在本模式獲取;/*/ldmdbr3!,r0;拷貝PCstmfdsp!,r0ldmdbr3!,r0;壓棧真正LRstmfdsp!,lrldrr1,=56;準備要拷貝字節(jié)數(shù),與硬件相關(guān)IRQSTACKSVCCOPYldmdbr3!,r0;反向popstmfdsp!,r0;pushsubsr1,r1,#4;遞減計數(shù)bneIRQSTACKSVCCOPY;/*/;3.3當前SP指針(這是SVC模式下任務(wù)當前的堆棧指針)保存到任務(wù)控制;塊結(jié)構(gòu)的第一個字段.保存sp到tcb,便于任務(wù)切換*/;因為任務(wù)被中斷時,堆棧尚未與環(huán)境同步;/*/ldrr0,=i_pCurTcbldrr1,r0strsp,r1;/*/;3.4完成了SVC模式下的處理,切換到SYS/UND,跳轉(zhuǎn)到5;/*/msrcpsr_cxsf,#ARM7_UND_MOD|ARM7_I_BITbIRQPREOVERLTORGIRQNESTMODE;/*/;/*4.嵌套數(shù)加1.R1+=1,保存R1值到R0地址(前面2.1);/*/addr1,r1,#1strr1,r0;/*/;是嵌套中斷切換到sys模式處理ISR;4.1切換到SYS模式,UND替代;/*/msrcpsr_cxsf,#ARM7_UND_MOD|ARM7_I_BIT;/*/;4.2將保存在IRQ模式下的ISR環(huán)境拷貝到ISR的堆棧(SP),;其中LR無法拷貝,需要在本模式獲取;/*/ldmdbr3!,r0;拷貝PCstmfdsp!,r0ldmdbr3!,r0;壓棧真正LRstmfdsp!,lrldrr1,=56;準備要拷貝字節(jié)數(shù),與硬件相關(guān)NESTSTACKSVCCOPYldmdbr3!,r0;反向popstmfdsp!,r0;pushsubsr1,r1,#4;遞減計數(shù)bneNESTSTACKSVCCOPY;/*/;因為SYS模式一旦運行就不會被切換掉,只能被中斷或退出;因此不存在3.3的對應(yīng)步驟;同時已經(jīng)是SYS模式下,也不存在3.4的對應(yīng)步驟;/*/IRQPREOVER;/*/;5.調(diào)用IRQ處理函數(shù),也就是HandleIRQ位置的函數(shù)指針,;實際上是os_isr.c文件中的voidIsrHandler(void)函數(shù)。;注意該函數(shù)中可能打開了中斷,因此才存在嵌套中斷的可能。;如果不需要嵌套中斷,只需要在該函數(shù)中,保持中斷屏蔽即可。;返回后中斷是屏蔽的,即該函數(shù)結(jié)尾時再次打開了中斷,;并且是在在中斷屏蔽后才退出設(shè)備保護,這樣處理;即能保持系統(tǒng)的嵌套中斷能力,又能防止同一設(shè)備的嵌套中斷;/*/movr0,r6;r6中中斷偏移blIsrHandlerldrr0,=SFR_VICVectAddrldrr1,=0strr1,r0;/*/;6中斷結(jié)束處理,IrqFinish,SYS模式的原有堆棧指針作為參數(shù);6.1屏蔽中斷;6.2遞減中斷嵌套計數(shù);6.3判斷是否最后一層,如果不是則函數(shù)返回進入76.4(最后一層)調(diào)中斷調(diào)度器,恢復(fù)SYS模式的原始堆棧指針,調(diào)度;到被中斷任務(wù),不再返回。從這里可以看出,中斷結(jié)束時,沒有回來恢;復(fù)IRQ模式的堆棧,因此才有前面第1.6步的預(yù)先恢復(fù)IRQ模式的SP指針。;同時在這一步處理中還要恢復(fù)SYS模式的堆棧指針,道理相同。;如果IrqFinish和HandleIRQ中的函數(shù)指針;沒有定義為_irq,函數(shù)會破壞寄存器;/*/blIrqFinish;僅僅是嵌套數(shù)減1;/*/;7.恢復(fù)SYS模式的環(huán)境回到上一層被中斷的中斷;第一個位置應(yīng)該存放的是被中斷模式的CPSR也就是irq的SPSR;/*/ldmfdsp!,r0msrspsr_cxsf,r0ldmfdsp!,r0-r12,lr,pcLTORG;/*/;/*開始*/;/*復(fù)位初始化完成后CSPR中的I/F是打開的*/;/*因此不應(yīng)該在此過程中打開具體設(shè)備*/;/*/HandlerRSTmrsr0,cpsrbicr0,r0,#ARM7_TMOD_MASKorrr1,r0,#ARM7_SVC_MOD|ARM7_NOINTRmsrcpsr_cxsf,r1;屏蔽中斷控制器中各個中斷l(xiāng)drr0,=SFR_VICIntEnClrldrr1,=0xFFFFFFFFstrr1,r0ldrr0,=SFR_VICSoftIntClearstrr1,r0ldrr0,=SFR_VICVectAddrldrr1,=0strr1,r0;*;*設(shè)置PLL時鐘控制器寄存器*;*ldrr0,=SFR_PLLCFGldrr1,=0x22;0x43=00100010=001(P=2)00010(M=3)strr1,r0ldrr0,=SFR_PLLCONldrr1,=0x3;使能并連接strr1,r0ldrr0,=SFR_PLLFEEDldrr1,=0xAAldrr2,=0x55strr1,r0strr2,r0ldrr0,=SFR_PLLSTATldrr0,=SFR_VPBDIV;外設(shè)時鐘除數(shù)ldrr1,=0x00;1/4時鐘strr1,r0checkpllldrr1,r0orrr2,r1,#0x0400;檢查PLOCKcmpr2,#0beqcheckpll;拷貝準備ldrr1,=|Image$RO$Limit|;也是RW在FLASH中起始位置ldrr2,=|Image$RW$Base|;從r1位置拷貝到r2位置ldrr3,=|Image$ZI$Base|subsr3,r3,r2;r3=RW大小beqRW2SRAM_OKRW2SRAM_COPY_LOOP;拷貝rwldrr0,r1,#4strr0,r2,#4subsr3,r3,#4;遞減計數(shù)bneRW2SRAM_COPY_LOOPRW2SRAM_OKldrr1,=|Image$ZI$Base|ldrr2,=|Image$ZI$Limit|subsr2,r2,r1;r2=zi大小beqCLEARZI_OKmovr0,

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論