ARM開發教程之ARM標準體系的嵌入式系統BSP的程序設計_第1頁
ARM開發教程之ARM標準體系的嵌入式系統BSP的程序設計_第2頁
ARM開發教程之ARM標準體系的嵌入式系統BSP的程序設計_第3頁
ARM開發教程之ARM標準體系的嵌入式系統BSP的程序設計_第4頁
ARM開發教程之ARM標準體系的嵌入式系統BSP的程序設計_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

ARM開發教程之ARM體系嵌入式系統BSP程序設計介紹:ARM企業在32位RISCCPU開發領域不停取得突破,其結構已經從V3發展到V6。BSP(BoardSupportPackage)板級支持包介于主板硬件和操作系統之間,其功效和PC機上BIOS相類似,關鍵完成硬件初始化并切換到對應操作系統。BSP是相對于操作系統而言,不一樣操作系統對應于不一樣定義形式BSP,比如VxWorksBSP和LinuxBSP相對于某一CPU來說,盡管實現功效一樣,可是寫法和接口定義是完全不一樣。另外,仔細研究所用芯片資料也十分關鍵,比如盡管ARM在內核上兼容,但每家芯片全部有自己特色。所以這就要求BSP程序員對硬件、軟件和操作系統全部要有一定了解。本文介紹基于ARM體系嵌入式應用系統初始化部分BSP程序設計。本文引用源碼全部是基于HMS320C7202芯片設計,并已成功運行。1ARM開發教程之初始化過程盡管多種嵌入式應用系統結構及功效差異很大,但其系統初始化部分完成操作有很大一部分是相同。嵌入式系統開啟步驟圖1所表示。1.1設置入口指針開啟程序首先必需定義指針,而且整個應用程序只有一個入口指針。通常地,程序在編譯鏈接時將異常中止向量表鏈接在0地址處,而且作為整個程序入口點。入口點代碼以下:ENTRY(_start);開始1.2ARM開發教程之設置異常中止向量表ARM要求中止向量表必需放置在從0開始、連續8×4字節空間內。各異常中止向量地址和中止算是優先級如表1:中止向量地址異常中止類型異常中止模式優先級(6最低)0x0復位特權模式(SVC)10x4未定義中止未定義指令中止模式(Undef)60x8軟件中止(SWI)特權模式(SVC)60x0c指令預取中止中止模式50x10數據訪問中止中止模式20x14保留未使用未使用0x18外部中止請求(IRQ)外部中止(IRQ)模式40x1c快速中止請求(FIQ)快速中止(FIQ)模式3

表1各異常中止中止向量地址和中止處理優先級

中止向量地址異常中止類型異常中止模式優先級(6最低)0x0復位特權模式(SVC)10x4未定義中止未定義指令中止模式(Undef)60x8軟件中止(SWI)特權模式(SVC)60x0c指令預取中止中止模式50x10數據訪問中止中止模式20x14保留未使用未使用0x18外部中止請求(IRQ)外部中止(IRQ)模式40x1c快速中止請求(FIQ)快速中止(FIQ)模式3每當一個中止發生后,ARM處理器便強制把程序計數器(PC)指針置為向量表中對應中止類型地址值。因為每個中止向量僅占據放置1條ARM指令空間,所以通常放置1條跳轉指令或向程序計數器(PC)寄存器賦值數據訪問指令,使程序跳轉到對應異常中止處理程序實施。假如異常中止處理程序起始地址小于32MB,使用B跳轉指令;假如跳轉范圍大于32MB,使用LDR指令。另外,對于各未用中止,可使其指向一個只含返回指令啞函數,以預防錯誤中止引發系統混亂。1.3初始化存放系統初始化存放系統編程對象是系統存放器控制器,一個系統可能存在多個存放器類型接口,不一樣存放系統設計不盡相同。Flash和SRAM同屬于靜態存放器類型,能夠適用一個存放器端口;而DRAM因為有動態刷新和地址線復用等特征,通常配有專用存放器端口。其中,SDRAM必需在初始化階段進行設置,因為大部分程序代碼和數據全部要在SDRAM中運行。在HMS30C7202中,和SDRAM配置相關寄存器有4個:配置寄存器、刷新定時寄存器、寫緩沖寫回寄存器和等候驅動寄存器,需要依據實際系統設計對此分別加以正確配置。SDRAM初始化過程以下:加電→延遲10ms(各具體SDRAM器件延時時間可能不一樣)→設置配置寄存器參數→延時→寫刷新定時寄存器,設置刷新周期→延時→使能自動刷新→延時→設置模式寄存器(在SDRAM內部)。1.4ARM開發教程之存放器地址分布重映射(remap)和MMU系統一上電,程序將自動從0地址處開始實施。所以,必需確保在0地址處存在正確代碼,即要求0地址開始入是非易失性ROM或Flash等。不過因為ROM或Flash訪問速度相對較慢,每次中止響應發生后,全部要從讀取ROM或Flash上面向量表開始,影響了中止響應速度。通常程序實施后將SDRAM映射為地址0,并把系統程序加載到SDRAM中運行,其具體步驟能夠采取以下方案:(1)上電后,從0地址ROM開始往下實施;(2)依據映射前地址,對SDRAM進行必需代碼和數據拷貝;(3)拷貝完成后,進行重映射操作;(4)因為RAM在重映射前準備好了內容,使得PC指針能繼續在RAM里取得正確指令。在這種地址映射改變過程中,程序員需要仔細考慮是:程序實施步驟不能被這種改變所打斷,注意確保程序步驟在重映射前后承接關系。存放器地址分配是很靈活,能夠將I/O操作映射成內存操作,也能夠經過映射對一些不可訪問地址空間進行保護等。進行存放器初始化設計時,一定要依據應用程序具體要求來完成地址分配。對地址管理經過MMU即存放器管理單元實現。在ARM系統中,MMU經過頁式虛擬存放管理,將虛擬空間和物理空間分別分成一個個固定大小頁,并建立二者之間映射關系,從而實現虛擬地址到物理地址轉換。MMU還可完成存放器訪問權限控制和虛擬存放器空間緩沖特征設置。以下是實現MMU部分代碼:for=(i=1;i<0x1000;i++){pagetable[i]=(i<<20)|MMU_SECDESC;}//建立頁表,每頁大小為1MB,頁表偏移序號是物理地址高12位;for(addr=SDRAM_BASE;addr<(SDRAM_BASE+SDRAM_SIZE/2);addr+=SIZE_1M)pagetable[addr>>20]=addr|MMU_SECDESE|MMU_CACHEABLE|MMU_BUFFERABLE;//將SDRAM_BASE至(SDRAM_BASE+SDRAM_SIZE/2)空間設置為不可CACHE和不可BUFFERfor(addr=SDRAM_BASE+SDRAM_SIZE/2;addr<

(SDRAM_BASE+SDRAM_SIZE);addr+=SIZE_1M)pagetable[addr>>20]=(addr+0x1000000)|MMU_SECDESC|MMU_CACHEABLE|MMU_BUFFERABLE;//將這段空間地址映射關系設置為VA(虛擬地址)=PA(物理地址)+0x1000000pagetable[0]=(0x42f00000)|MMU_SECDESC|MMU_CACHEABLE|MMU_BUFFERABLE;//將SDRAM虛擬地址0x42f00000映射到0處1.5ARM開發教程之初始化各模式下堆棧指針因為ARM處理器有7種實施狀態,每一個狀態堆棧指針寄存器(SP)全部是獨立(System和User三項式使用相同SP寄存器)。所以,對程序中需要用到每一個模式全部要給SP寄存器定義一個堆棧地址。方法是改變狀態寄存器(CPSR)內狀態位,使處理器切換到不一樣狀態,然后給SP賦值。這里列出代碼定義了三種模式SP指針,其中,I_Bit表示IRQ中止嚴禁位;F_Bit表示FIQ中止嚴禁位:@;SetupSVCstacktobe4Kontopofzero-initdataLDRr1,=installStackADDsp,r1,#2048@;SetupIRQandFIQstacksMOVr0,#(Mode_IRQ32|I_Bit)MSRcpsr,r0MOVr0,r0ADDsp,r1,#2048*2MOVr0,#(Mode_FIQ32|I_Bit|F_Bit)MSRcpsr,r0MOVr0,r0ADDsp,r1,#2048*3通常堆棧大小要依據需要而定,不過要盡可能給堆棧分配快速和高帶寬存放器。堆棧性能提升對系統性能影響是很顯著。1.6ARM開發教程之初始化有特殊要求端口、設備有些關鍵I/O部件必需在使能IRQ和FIQ之前進行初始化。因為假如在使能IRQ和FIQ之前沒有進行初始化,能夠產生假異常中止信號。程序中初始化了HMS30C7202串口1用來調試程序和其它設備通信。串口1是一個通用全雙工異步接收/發送器(UART),它支持16C550大部分功效。UART有接收緩沖/發送保持寄存器、波特率除數鎖存器、中止許可寄存器等9個寄存器。對串口1初始化關鍵是對各寄存器設置,其實現代碼以下所表示:_outb(ser_base+0x30,1);_outw(0x8002301c,0xffff9f9f);GPIOPORTAEnableRegister_outw(0x800230A4,0x6060);GPIOPORTAMultiFunctionelect-Registerserial_outb(SERIAL_LCR,0x80);serial_outb(SERIAL_LCR,0x80);serial_outb(SERIAL_DLL,baud_data[cur_baud]);serial_outb(SERIAL_DLM,0x0);serial_outb(SERIAL_LCR,0x03);seial_outb(SERIAL_FCR,0x01);serial_outb(SERIAL_IER,0x00);serial_outb(SERIAL_MCR,0x03);1.7切換處理器模式,開中止最終轉換到應用程序運行所需最終模式,通常是User模式。不要過早切換到User模式進行User模式堆棧設備。因為進入User模式后就不能再操作CPRS回到別模式了,可能會對接下去程序實施造成影響。這時才使能異常中止,經過清除CPRS寄存器中中止嚴禁位實現。假如過早地開中止,在系統初始化之前就觸發了有效中止,會造成系統死機。1.8呼叫主應用程序當全部系統初始化工作完成后,就需要把程序步驟轉入主應用程序。2ARM開發教程之技術難點分析2.1多個語言混合編程ARM有兩種匯編指令集:16位THUMB指令集和32位ARM指令集。使用16位寄存器能夠降低成本,而且16位THUMB指令集整體實施速度比ARM32位指令集快,提升了代碼密度。為了滿足ARM子程序和Thumb子程序相互調用,必需確保編寫代碼遵照ATPCS。ATPCS要求了子程序調用基礎規則。ARM系統結構也支持C、C++和匯編語言混合編程。匯編語言和C/C++語言混合編程,在一個追求效率程序中比較常見。很多人認為像BSP這么底層程序應該用純匯編語言編寫,其實不然。用匯編語言編寫程序可讀性不高,而且不宜維護,不便于向其它類型CPU移植,而這些方面卻是C語言程序優勢。BSP能否用純C語言去寫呢?也不行。因為一些操作是用C實現不了。比如操作特殊寄存器指令、CP15寄存器指令、中止使能及堆棧地址設定等。在匯編和C/C++之間函數調用時,也要遵照ATPCS定義,還要注意是用C語言編寫嵌入式程序時,要避免使用不能被固化到ROM中庫函數。混合編程情況下程序編譯及鏈接后輸出代碼和沒有混合編程時是不一樣。所以當多個源文件假如使用了不一樣設置進行編譯,相互之間調用可能產生兼容性問題,對此一定要加以仔細考慮。編譯時,要告訴編譯器和鏈接器足夠信息,首先,讓編譯器能夠使用正確指令碼進行編譯;其次,在不一樣狀態之間發生函數調用時,鏈接器將插入一段鏈接代碼(veneers)來實現實狀況態轉換。2.2MMU實現過程頁表是實現MMU關鍵手段。頁表存放在內存中,從虛擬地址到物理地址變換過程其實就是查詢頁表過程。大小為1MB存放塊通常被稱為段,圖2說明了怎樣查表進行段式尋址全過程:32位虛擬地址可分為12位一級頁表序號和

溫馨提示

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

評論

0/150

提交評論