




已閱讀5頁,還剩26頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
編號: 嵌入式系統設計與制作(論文)說明書題 目: 基于嵌入式ARM的 C/OS-II移植 院 (系): 信息與通信學院 專 業: 電子信息工程 學生姓名: 學 號: 指導教師: 2012年12月29日嵌入式系統設計與制作實訓任務書年級: 09 級 面向專業: 電子信息工程 學時: 3周 項目名稱:基于嵌入式ARM的C/OS-II移植項目類型硬件與軟件制作特殊要求無承擔學生姓名學號專業聯系電話電子信息工程項目設計要求:基本功能要求:1 移植目標芯片ARM92 移植相關文件的程序注釋3 設計測試程序測試系統穩定性參考資料: 1.譚浩強.C程序設計.北京:清華大學出版社,20052.Chris Wright等.ARM嵌入式系統開發.北京:北京航空航天大學出版社,20053.任哲.嵌入式實時操作系統C/OS-II原理及應用.北京.北京航空航天大學出版社,20054. JeanJ Labrosse.嵌入式實時操作系統C/OS-II.北京.北京航空航天大學出版社,20035.Norman Matloff等.軟件調試的藝術.北京:人民郵電出版社,2010完成形式:1. 設計與制作可供實際檢測的實物樣板;2. 每組的兩位同學完成一個作品,作品的內容必須和ARM嵌入式相關;3. 完成實訓論文。項目設計進度要求:選題:12月09日-12月10日查找資料和方案確定:12月11日-12月15日移植ucosII:12月16日-12月25日軟件和硬件調試:12月26日-12月27日論文:12月28日驗收:12月29日項目驗收方式:1、在實訓期間進行作品驗收,驗收后交實訓論文及實訓的資料打印稿及電子文稿。2、設計報告要符合桂林電子科技大學畢業設計論文統一格式。項目開始時間:2012年12月09日項目結束時間:2012年12月29日任務下達:2012年12月09日摘 要以應用為中心、以計算機為基礎的嵌入式技術,是當今發展最快、應用最廣、最有發展前景的主要技術之一。嵌入式技術已經被廣泛應用于工業控制、移動通信、信息家電、醫療儀器、汽車電子、航空航天等各個領域。在各種嵌入式處理器中,ARM以體積小、低功耗、低成本、高性能等優點,獲得許多半導體廠商的支持,在嵌入式應用領域取得巨大的成功。軟件方面,uC/OS是一種免費公開源代碼、結構小巧、具有可剝奪實時內核的實時操作系統,因而被使用頻繁。本文主要研究了C/OS-II在S3c2440芯片上的移植。本文通過對S3c2440硬件和源碼公開的嵌入式實時操作系統C/OS-II的分析,以S3C2440為例,闡述了在ARM9上移植C/OS-II,來運行多個任務,用液晶顯示來說明C/OS-II移植的優缺點,以及在移植中應注意的問題,啟動代碼的理解,解析代碼的優化。關鍵詞:嵌入式系統;實時;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內核11.2ARM9開發板32 C/OS-II42.1C/OS-II分析42.1.1任務運行62.1.2任務通信72.1.3內存動態分配83 C/OS-II在ARM9上的移植93.1與CPU有關的文件93.1.1 OS_CPU.H93.1.2OS_CPU_C.C103.1.3OS_CPU_A.S123.2移植代碼實現134 測試程序234.1整個測試程序的效果圖234.2測試程序的功能235 總結24謝 辭25參考文獻26桂林電子科技大學實訓說明書用紙引言早在20世紀60年代,就已經有人開始研究和開發嵌入式操作系統。但直到最近,它才在國內被越來越多的提及,在通信、電子、自動化等需要實時處理的領域所曰益顯現的重要性吸引了人們越來越多的注意力。但是,人們所談論的往往是一些著名的商業內核,諸如VxWorks、PSOS等。這些商業內核性能優越,但價格昂貴,主要用于16位和32位處理器中,針對國內大部分用戶使用的risc系列8/16/32位單片機,可以選擇免費的ucos ii。通過在LPC2132上移植移植ucosii,移植bootload,ucosii的遠行原理。在原理的分析中,通過理論的學習,理論結合實際,通過制作和調試實驗板,其中多次用到單一分析法,單一調試各個分支,然后系統綜合所有任務,完成整個系統遠行。論文第一章主要介紹lpc2132硬件結構和代碼的編寫;第二章討論ucosii代碼結構;第三章分析ucosii在arm板上的移植。1 S3C2440系列微處理器簡介 1.1ARM9內核在ARM9系列處理器中S3C2440A是三星公司推出的一款功能強大,功耗極低的基于ARM920T核心的嵌入式處理器,它為手持設備和普通應用提供了低功耗和高性能的小型芯片微控制器的解決方案。為了降低整體系統成本,S3C2440A還提供了豐富的內部設備,其基本特征如下:基于ARM920T內核,支持JTAG仿真調試;具備16KB的指令緩存和16KB的數據緩存;具有MMU,支持Windows CE、PalmOS、Symbian OS、Linux等操作系統;有外部存儲控制器(SDRAM控制和片選邏輯);LCD 控制器(最大支持4K色STN和256K色TFT)提供1通道LCD專用DMA;4通道DMA有外部請求引腳;3通道UART(IrDA1.0,64字節發送FIFO和64字節接收FIFO);2通道SPI;1通道IIC總線接口(支持多主機);1通道IIS總線音頻編碼器接口;AC97編解碼器接口;兼容SD主接口協議1.0版和MMC卡協議2.11兼容版;2通道USB主機/1通道USB設備(1.1版);4通道PWM定時器和1通道內部定時器/看門狗定時8通道10位ADC和觸摸屏接口;具有日歷功能的RTC;攝像頭接口(最大支持40964096像素輸入;20482048像素輸入支持縮放);130個通用I/O口和24通道外部中斷源;具有普通、慢速、空閑和掉電模式;具有PLL片上時鐘發生器;圖1.1 ARM模塊示圖1.2ARM9開發板基于S3C2440A的ARM9開發板在目前市場上有很多如友善之臂的mini2440、飛凌的TE2440開發板和OK2440開發板、天嵌科技的TQ2440開發板等等。在眾多知名的開發板中它們都包含了豐富的硬件資源及參考資料。在這些開發板中都包含了電源電路、系統復位電路、系統時鐘電路、JTAG接口、串行接口、按鍵輸入接口、IIC接口、USB接口、IIS音頻數據接口電路、以太網接口、ADC輸入接口、攝像頭接口、液晶接口等電路。本文選用Micro2440開發板,采用底板與核心板分離設計,核心板6層布線系統運行相對比較穩定,底板預留了各個接口及總線的排針接口非常方便二次開發,對于液晶屏接口它采用的是24位,比其它非24位的要好得多。在技術售后方面該公司還專門建立了BBS,對使用中遇到的難題會有熱心人士解答或有公司專業人士解答。目前使用TQ2440開發板在車載手持設備、GIS平臺、Data Servers、VOIP、網絡終端、工業控制、檢測設備、儀器儀表、智能終端、醫療器械、安全監控等產品中均有應用。本設計使用TQ2440開發板作為硬件平臺,其中它的板載存儲器資源有:一片2MB的Nor Flash(EN29LV160AB)一片256MB的Nand Flash (K9F2G08U0A) 及用2片SDRAM (MT48LC16M16A2)組成32位總線寬度構成64MB32bit的SDRAM,供系統使用。從性能及板載資源來看它完成勝任于本設計。2 C/OS-II隨著嵌入式技術的快速發展,實時多任務操作系統作為一種軟件平臺已逐步成為國際嵌入式系統的主流,目前世界上已經有一大批成熟的實時嵌入式操作系統,通常,對嵌入式軟件的基本要求是體積小、指令速度快、具有較好的裁減性和可移植性,目前,實時操作系統很多,如VxWorks,WindowsCE,pSOS,QNX,LynxOS等,這些操作系統都具有高可靠性、強實時性等特點,但他們都是商業操作系統,價格昂貴,人們往往很難接受,C/OS-操作系統的出現是對這些商業操作系統的一個很大的沖擊。C/OS-是源碼公開的實時操作系統,是一個自由操作系統。程序開發人員可以改寫源代碼,使之符合自己的要求,裁減掉不需要的部分,使操作系統變得小巧、靈活、并且能滿足用戶特定操作系統的需要。為了提高系統的實時能力,C/OS-可以將一個復雜的應用劃分為多個相互獨立的任務,并根據任務的重要性來分配優先級。任務的調度完全由C/OS-的實時內核完成,主要包括任務的狀態管理、選擇最高優先級的任務、執行任務和撤銷任務等,C/OS-內核還負責CPU時間分配,CPU時間總是優先分配給中斷事件,其次是任務隊列中當前優先級最高的任務,不同任務間的通信可以通過C/OS-提供的信號量、郵箱、信息隊列等機制完成,他的絕大部分代碼是用C語言編寫的,可移植性強,因此1997年以后,在國際上逐漸被廣泛采用。2.1C/OS-II分析實時系統的特點是,如果邏輯和時序出現偏差將會引起嚴重后果的系統。有兩種類型的實時系統:軟實時系統和硬實時系統。在軟實時系統中系統的宗旨是使各個任務運行得越快越好,并不要求限定某一任務必須在多長時間內完成。在硬實時系統中,各任務不僅要執行無誤而且要做到準時。大多數實時系統是二者的結合。實時系統的應用涵蓋廣泛的領域,而多數實時系統又是嵌入式的。這意味著計算機建在系統內部,用戶看不到有個計算機在系統里面。以下是一些嵌入式系統的例子:通訊類:Switch Hurb路由器機器人:航空航天飛機管理系統過程控制:藥品加工化工廠汽車業:發動機控制防抱死系統(ABS)實時應用軟件的設計一般比非實時應用軟件設計難。不復雜的小系統一般設計成如圖2.1 ucosii工作原理簡圖上圖所示的那樣時間相關性很強的關鍵操作(Criticaloperation)一定是靠中斷服務來保證的。因為中斷服務提供的信息一直要等到后臺程序走到該處理這個信息這一步時才能得到處理,這種系統在處理信息的及時性上,比實際可以做到的要差。這個指標稱作任務級響應時間。最壞情況下的任務級響應時間取決于整個循環的執行時間。因為循環的執行時間不是常數,程序經過某一特定部分的準確時間也是不能確定的。進而,如果程序修改了,循環的時序也會受到影響。 2.1.1任務運行任務的狀態如下:1.睡眠態(taskdormat):任務駐留于程序空間(rom或ram)中,暫時沒交給ucos-ii處理。2.就緒態(taskready):任務一旦建立,這個任務就進入了就緒態。3.運行態(taskrunning):調用OSStart()可以啟動多任務。OSStart()函數只能調用一次,一旦調用,系統將運行進入就緒態并且優先級最高的任務。4.等待狀態(taskwaiting):正在運行的任務,通過延遲函數或pend(掛起)相關函數后,將進入等待狀態。5.中斷狀態(ISRrunning):正在運行的任務是可以被中斷的,除非該任務將中斷關閉或者ucos-ii將中斷關閉。任務是一個無返回的無窮循環,都有唯一的一個優先級。uc/os-ii總是運行進入就緒狀態的最高優先級的任務。因為uc/os-ii總是運行進入就緒狀態的最高優先級的任務。所以,確定哪個任務優先級最高,下面該哪個任務運行,這個工作就是由調度器(scheduler)來完成的。任務級的調度是由函數OSSched()完成的,而中斷級的調度是由函數OSIntExt()完成。對OSSched(),它內部調用的是OS_TASK_SW()完成實際的調度(人為模仿一次中斷);OSIntExt()內部調用的是OSCtxSw()實現調度。任務切換其實很簡單,由如下2步完成:(1)將被掛起任務的處理器寄存器推入自己的任務堆棧。(2)然后將進入就緒狀態的最高優先級的任務的寄存器值從堆棧中恢復到寄存器中。圖2.2 OS_TCB鏈結構調度算法主要基于分級查詢。考慮到任務數目64,可以用6bit來表示,分為高3位和低3位。uC/OS-II將優先級進行分組,按高三位進行分組,可得8個(最多)優先級數組(000-111);每個優先級的在數組中的位置由其低三位表示。在源碼中,高三位用帶Y后綴的變量表示,而低三位用帶X后綴的變量表示。這樣建立了1個變量OSRdyGrp(INT8U,8bit,每個bit代表一組)和1個數組OSRdyTbl8(INT8U,每組8bit,每個bit代表一個優先級)。這樣形成了的二級查詢,先選組,再選組內偏移。圖2.3 ucosii任務等待表2.1.2任務通信任務有如下狀態:1.空閑任務(IdleTask)空閑任務OSTaskIdle()什么也不做,只是在不停地給一個32位的名叫OSIdleCtr的計數器加1,統計任務使用這個計數器以確定現行應用軟件實際消耗的CPU時間。2.統計任務(OSTaskstat)統計任務每秒計算一次CPU在單位時間被使用的時間,并且把計算結果一百分比的形式存放在變量OSCPUUsage中,以便應用程序通過反問來了解CPU的利用率,如果用戶要使用這個函數,那么在系統頭文件OS_CFG.H中的系統配置常數OS_TASK_STAT_EN設置為1,創建之前,調用OSTaskstat對統計任務進行初始化。3.非系統任務這些任務是用戶任務,通過運行,達到測量、監測、通信等功能,如圖2.4。圖2.4 Relationshipbetweentasks,ISRsandasemaphore2.1.3內存動態分配Ucos為內存中存儲塊的動態分配提供了支持。不同于malloc(),free(),ucos的存儲管理機制是基于固定大小存儲塊的分配與回收。對于任務而言,每次只能申請固定大小的存儲塊,因而不存在外部碎片的問題。科學利用內存,操作系統把連續的大塊內存按分區來管理,每個分區中包含有整數個大小相同的內存塊,使得它們可以分配和釋放固定大小的內存塊。如下圖所示:圖2.8 內存模塊3 C/OS-II在ARM9上的移植隨著國內工業化、數字化的步伐加快,嵌入式開發在IT行業中的重要性越來顯著。中國成為“世界制造中心”甚至“設計中心”的趨勢,必然對小型數字控制系統的需求越來越大。在這種情況下,類似于UCOS-II的小型硬實時嵌入式操作系統內核,具有低成本、易控制、小規模、高性能的特性,因而有相當好的發展前景。但是這類系統的基礎較為薄弱,面臨產品化、商業化程度不夠的問題。采用此類系統進行產品開發需要仔細的分析、設計,否則也很難真正滿足工業產品生產的要求。正是針對這種情況,在ARM微處理器環境下,針對商業化、產品化環境的嚴格要求,設計構造了一種硬實時嵌入式內核體系結構。當然真正的商業化、產品化的嵌入式內核,既需要這種能夠滿足高標準要求的體系結構設計基礎,還需要嚴格的產品化軟件開發測試過程。只有理論基礎和工程實踐完整的結合,才能產生真正經受得起考驗的,能夠滿足工業化生產,能夠在各種環境下穩定運行并確保達到設計目的的產品。從這個角度考慮,僅僅拿來一個操作系統內核并開發應用產品,很難萬全滿足這種要求。必須要對內核的涉及思路進行仔細的考慮、驗證,對應用的可選開發設計方法進行審慎的評估,并配合真正工業化的項目發管理辦法,才能保障產品達到要求。3.1與CPU有關的文件與處理器相關的代碼,這是移植中最關鍵的部分。內核將應用系統和底層硬件有機地結合成一個實時系統,要使同一個內核能適用于不同的硬件體系,就需要在內核和硬件之間有一個中間層,這就是與處理器相關的代碼,處理器不同,這部分代碼也不同,我們在移植時需要自己處理這部分代碼,在C/OS中這一部分代碼分成3個文件:OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C,分別如下:3.1.1 OS_CPU.H包含了用#define定義的與處理器相關的常量、宏和類型定義,具體有系統數據類型定義、棧增長方向定義、關中斷和開中斷定義、系統軟中斷的定義等。(1)不依賴于編譯的數據類型C/OS-不使用C語言中的short,int和long等數據類型的定義,因為他們與處理器類型有關,隱含著不可移植性,代之以移植性強的整數數據類型,這樣,既直觀又可移植。根據ADS編譯器的特性,代碼為:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedshortINT16U;typedefsignedshortINT16S;typedefunsignedintINT32U;typedefsignedintINT32S;typedeffloatFP32;typedefdoubleFP64;typedefINT32UOS_STK;(2)使用軟中斷SWI做底層接口因為帶T變量的ARM7處理器核具有兩個指令集,用戶任務可以使用兩種處理器模式,為了使底層接口函數與處理器狀態無關,同時在任務調用相應函數時不需要知道該函數位置,本例使用軟中斷指令SWI作為底層接口,使用不同的功能號區分不同的函數。(3)OS_STK_GROWTHC/OS-使用結構常量OS_STK_GROWTH指定堆棧的生長方式,其lpc2132代碼為:#defineOS_STK_GROWTH13.1.2OS_CPU_C.C移植OS_CPU_C.C文件時,需要編寫的是任務堆棧初始化函數OSTaskStkInit和時鐘節拍中斷服務鉤子函數OSTimeTickHook。在C/OS-II中,每一個任務都有自己的任務堆棧,當發生任務切換或者中斷時,其CPU使用權被剝脫,為了任務能被再次運行,那么這個被打斷的任務所用到的處理器的寄存器內容均應得到保存,按照ARM7處理器的壓棧和入棧指令的特點,設計任務堆棧如下3:CPSRR0R1R12LR(R14)PC(R15)根據任務堆棧結構示意圖,OS_STK函數編寫如下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);說明:用戶創建任務時,OSTaskCreat()會調用OSTaskStkInit函數初始化該任務的堆棧,并把返回的堆棧指針保存到該任務的TCB結構中的最前面的參數OSTCBStkPtr中,當該任務要被恢復時,任務切換函數從其TCB塊中取得其任務堆棧指針,依次將堆棧內容彈到處理器對應的CPSR、r0,r1,r12,lr,pc的寄存器中,完成現場的恢復和程序指針PC的返回。另一個需要編寫的函數是OSTimeTickHook,該函數被時鐘節拍中斷服務函數OSTickISR中的OSTimeTick函數調用,用來清除時鐘節拍中斷發生設備的請求。本移植方案使用處理器的RTC模塊的tick中斷作為時鐘節拍中斷,該函數編寫如下:voidOSTimeTickHook(void)rI_ISPC=(INT32U)0x01)20;注意:用戶也可不修改此函數,但是必須在OSTickISR中執行清除發生節拍中斷的設備的中斷請求標志,為便于說明,本文將利用內核提供給用戶的OSTimeTickHook函數來完成清中斷的任務。另外幾個hook函數不必去改它們,至此,OS_CPU.C編寫完成。包含了與移植有關的C函數,包括堆棧的初始化和一些鉤子函數的實現,但是最重要的是OSTaskStkInit()函數,該函數是在用戶建立任務時系統內部自己調用的,用來對用戶任務的堆棧初始化。在ARM7體系結構下,任務堆棧空間由高至低遞減,依次保存著PC,LR,R12,R1,R0,CPSR的初始化堆棧結構,當用戶初始化了堆棧,OSTaskStkInit()就返回新的堆棧指針STK所指的定地址。OSTaskCreate()和OSTaskCreateExt()會獲得該地址并將他保存到任務控制塊TCB中,其他的幾個鉤子函數必須聲明,但可以不包含任務代碼,這些鉤子函數在本移植中全為空函數。3.1.3OS_CPU_A.SC/OS-移植的絕大部分工作都集中在OS_CPU_A.S文件的移植上,在這個文件里,最困難的工作又集中體現在OSIntCtxSw和OSTickISR這兩個函數的實現上。這是因為這兩個函數的實現是和移植者的移植思路以及相關硬件定時器、中斷寄存器的設置有關,在實際的移植工作中,這兩個地方也是比較容易出錯的地方,這部分需要對處理器的寄存器進行操作,所以必須用匯編語言編寫,包括4個子函數:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。OSStartHighRdy()該函數首先調用鉤子函數OSTaskSwHook(),然后將OSRunning標志位設置為真,表示任務開始執行,從而保證任務切換操作的正確執行,緊接著從具有最高優先級的任務控制塊中取得任務的堆棧指針,初始化堆棧指針寄存器SP,然后恢復其他的寄存器,開始執行最高優先級的任務。OSCtxSw()該函數在任務級任務切換函數中調用,首先保存處理器寄存器,將當前SP存入任務TCB中,載入就緒最高優先級任務的SP,從新任務的任務堆棧中恢復處理器所有寄存器的值,然后執行中斷返回指令。OSIntCtxSw()該函數是在ISR中執行任務切換功能,其原理基本上與任務級的切換相同,區別只是ISR已經保存了CPU的寄存器,因此不要再進行類似的操作,只需對堆棧指針作相應的調整即可。OSTickISR()該函數是系統時鐘節拍中斷服務函數,首先要保存處理器寄存器,接著調用OSIntEnter()函數,以保證中斷嵌套層數不超過255層,如果滿足了該條件,則把堆棧指針保存到當前任務的任務控制塊TCB中,然后給產生中斷的設備清中斷,重新允許中斷,接下來調用OSTimeTick()來維持C/OS-內部的定時以及調用OSIntExit()函數決定是否因為這個中斷服務程序的執行,使得更高優先級的任務就緒。這一部分是用戶根據自己的應用系統來定制合適的內核服務功能,包括2個文件:OS_CFG.H和INCLUDES.H。OS_CFG.H用來配置內核,用戶根據需要對內核進行修改,留下需要的部分,去掉不需要的部分,比如系統可提供的最大任務數量,是否定制郵箱服務,是否提供優先級動態改變功能等等,所有的配置更改包括頭文件的增減均在該文件中進行。INCLUDES.H系統頭文件,整個實時系統程序所需要的文件,包括了內核和用戶的頭文件,這樣使得用戶項目中的每個C文件不用分別去考慮他實際上需要哪些頭文件。3.2移植代碼實現復位入口代碼的主要功能就是設置好PLL然后搬遷代碼。此處列出的是標準寫法,根據編譯鏈接參數不同,還有其他一些優化寫法。例如,在編譯調試工具中(SDTV2.51或ADSV1.2),如果只配置RO-BASE參數,不配置RW-BASE參數,RO和RW段是自然銜接的,這樣代碼的拷貝搬遷工作可以簡化。另外要注意的是,這部分代碼要仔細檢查、調試實際的執行結果。例如,搬遷后,應該初始化的全局變量是否正確初始化。SDTV2.51下,如果用JTAG調試,RW-BASE配置了參數,直接下載代碼到RAM中,因為沒有自己控制內存搬遷和拷貝初始化數據段的代碼,就存在全局變量沒有正確初始化的問題。工程師編寫代碼的時候,不可能不考慮調試狀態,因此這種調試狀態下代碼段搬遷的初始化問題同樣要仔細考慮。比較好的方式,是在模塊的初始化函數中,進行所有處于RW段、ZI段的全局變量的詳細初始化。這種初始化過程不影響主體代碼的僅僅在開始階段執行一次,完全不會影響主體程序的執行效率,確能夠保障代碼在任何情況下的穩定運行。代碼三十五.2132復位及中斷入口代碼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;入口;/*/;/異常矢量,接到異常跳轉*/;/有順序問題必須按照異常順序*/;/*/bHandlerRST;實際啟動點,非再次跳轉的例程bHandleFIQ;此下之后均為再次跳轉例程bHandleFIQbHandleFIQbHandleFIQ;不適合跳轉處理DCD0xA73FFFC6LDRPC,PC,#-0xff0;分發例程可以C安裝設備中斷HandleFIQ;不處理FIQ,所有異常進入此處死循環nop;并通過看門狗完成復位bHandleFIQLTORG;/*/;/*IRQ中斷預處理例程*/;/*入口條件:IRQ中斷屏蔽,LR是被中斷任務或ISR的PC值,*/;/*SPSR是被中斷任務或ISR的當前處理器狀態值,*/;/*SP是IRQ模式當前堆棧指針值*/;/*/HandlerIRQ;/*/;1.4SPSR保存到R0;壓棧R0,是IRQ模式的SPSR,也是被中斷模式的CPSR;/*/mrsr4,spsrstmfdsp!,r4movr0,r6blPreISR;r0中返回處理結果cmpr0,#0beqkeepirq;/*/;結束應急處理并結束中斷處理,已處理完;/*/ldrr0,=SFR_VICVectAddrldrr1,=0strr1,r0ldmfdsp!,r0msrspsr_cxsf,r0ldmfdsp!,r0-r12,lr,pcLTORGkeepirq;/*/;1.6恢復堆棧指針的原值,并保存到R3;方便后面算法使用,此后不再用到IRQ堆棧;/*/addr3,sp,#64movsp,r3;/*/;2.判斷是否第一層中斷,如果不是第一層,進入3;2.1嵌套中斷數變量地址到R0,變量值讀入到R1;/*/ldrr0,=IntrNestedldrr1,r0cmpr1,#0;/*/;2.2如果不是第一次,跳到第3步;/*/bneIRQNESTMODE;/*/;3設置嵌套層數為1。R1=1,保存R1值到R0地址(前面2.1);/*/ldrr1,=1strr1,r0;/*/;不是嵌套中斷切換到svc模式處理任務;3.1切換到SVC模式,第一層中斷,一定是中斷運行在SVC模式下的任務;/*/msrcpsr_cxsf,#ARM9_SVC_MOD|ARM7_I_BIT;/*/;3.2將保存在IRQ模式下的任務環境拷貝到任務的堆棧(SP),;其中LR無法拷貝,需要在本模式獲取;/*/ldmdbr3!,r0;拷貝PCstmfdsp!,r0ldmdbr3!,r0;壓棧真正LRstmfdsp!,lrldrr1,=56;準備要拷貝字節數,與硬件相關IRQSTACKSVCCOPYldmdbr3!,r0;反向popstmfdsp!,r0;pushsubsr1,r1,#4;遞減計數bneIRQSTACKSVCCOPY;/*/;3.3當前SP指針(這是SVC模式下任務當前的堆棧指針)保存到任務控制;塊結構的第一個字段.保存sp到tcb,便于任務切換*/;因為任務被中斷時,堆棧尚未與環境同步;/*/ldrr0,=i_pCurTcbldrr1,r0strsp,r1;/*/;3.4完成了SVC模式下的處理,切換到SYS/UND,跳轉到5;/*/msrcpsr_cxsf,#ARM7_UND_MOD|ARM7_I_BITbIRQPREOVERLTORGIRQNESTMODE;/*/;/*4.嵌套數加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環境拷貝到ISR的堆棧(SP),;其中LR無法拷貝,需要在本模式獲取;/*/ldmdbr3!,r0;拷貝PCstmfdsp!,r0ldmdbr3!,r0;壓棧真正LRstmfdsp!,lrldrr1,=56;準備要拷貝字節數,與硬件相關NESTSTACKSVCCOPYldmdbr3!,r0;反向popstmfdsp!,r0;pushsubsr1,r1,#4;遞減計數bneNESTSTACKSVCCOPY;/*/;因為SYS模式一旦運行就不會被切換掉,只能被中斷或退出;因此不存在3.3的對應步驟;同時已經是SYS模式下,也不存在3.4的對應步驟;/*/IRQPREOVER;/*/;5.調用IRQ處理函數,也就是HandleIRQ位置的函數指針,;實際上是os_isr.c文件中的voidIsrHandler(void)函數。;注意該函數中可能打開了中斷,因此才存在嵌套中斷的可能。;如果不需要嵌套中斷,只需要在該函數中,保持中斷屏蔽即可。;返回后中斷是屏蔽的,即該函數結尾時再次打開了中斷,;并且是在在中斷屏蔽后才退出設備保護,這樣處理;即能保持系統的嵌套中斷能力,又能防止同一設備的嵌套中斷;/*/movr0,r6;r6中中斷偏移blIsrHandlerldrr0,=SFR_VICVectAddrldrr1,=0strr1,r0;/*/;6中斷結束處理,IrqFinish,SYS模式的原有堆棧指針作為參數;6.1屏蔽中斷;6.2遞減中斷嵌套計數;6.3判斷是否最后一層,如果不是則函數返回進入76.4(最后一層)調中斷調度器,恢復SYS模式的原始堆棧指針,調度;到被中斷任務,不再返回。從這里可以看出,中斷結束時,沒有回來恢;復IRQ模式的堆棧,因此才有前面第1.6步的預先恢復IRQ模式的SP指針。;同時在這一步處理中還要恢復SYS模式的堆棧指針,道理相同。;如果IrqFinish和HandleIRQ中的函數指針;沒有定義為_irq,函數會破壞寄存器;/*/blIrqFinish;僅僅是嵌套數減1;/*/;7.恢復SYS模式的環境回到上一層被中斷的中斷;第一個位置應該存放的是被中斷模式的CPSR也就是irq的SPSR;/*/ldmfdsp!,r0msrspsr_cxsf,r0ldmfdsp!,r0-r12,lr,pcLTORG;/*/;/*開始*/;/*復位初始化完成后CSPR中的I/F是打開的*/;/*因此不應該在此過程中打開具體設備*/;/*/HandlerRSTmrsr0,cpsrbicr0,r0,#ARM7_TMOD_MASKorrr1,r0,#ARM7_SVC_MOD|ARM7_NOINTRmsrcpsr_cxsf,r1;屏蔽中斷控制器中各個中斷ldrr0,=SFR_VICIntEnClrldrr1,=0xFFFFFFFFstrr1,r0ldrr0,=SFR_VICSoftIntClearstrr1,r0ldrr0,=SFR_VICVectAddrldrr1,=0strr1,r0;*;*設置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;外設時鐘除數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;遞減計數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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數學 2024-2025學年人教版七年級數學下冊期末綜合檢測卷
- 2025年理財規劃師之二級理財規劃師高分通關題庫A4可打印版
- 2019-2025年BIM工程師之BIM工程師模擬考試試卷A卷含答案
- 環境經濟項目合同履行共享經濟重點基礎知識點歸納
- 環境災害應急人員調度重點基礎知識點歸納
- 礦山安全生產技術
- 營養護理與健康管理
- 中式快餐的美食藝術探索
- 神秘嫵媚的派對妝容
- 如何進行房地產項目的績效評估
- 湖南金紫宇新材料科技有限公司年產2萬噸光刻膠用新型感光精細化學品項目環評報告書
- 受案登記表-模板
- 清潔評標標書答辯評分表
- 產品創新設計與實踐完整版課件全套ppt教學教程電子教案講義最全(最新)
- 《我們走在大路上》歌詞
- NHK-2XP350S產品手冊
- 華東師范大版初中數學八年級下冊 綜合與實踐 圖形的等分 課件(共20張PPT)
- 試運行方案計劃-
- 變配電運行值班員(500kV及以上)技師-機考題庫(導出版)
- 法蘭規格尺寸表國標,美標
- 河南省學校結核病疫情處置技術方案(試行)
評論
0/150
提交評論