ARM嵌入式系統(tǒng)BSP的程序設(shè)計._第1頁
ARM嵌入式系統(tǒng)BSP的程序設(shè)計._第2頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、ARM 體系的嵌入式系統(tǒng) BSP 的程序設(shè)計 ARM 公司在 32 位 RISC 的 CPU 開發(fā)領(lǐng)域不斷取得突破, 其結(jié)構(gòu)已經(jīng)從 V3 發(fā) 展到 V6。 BSP( Board Support Package )板級支持包介于主板 硬件和操作系統(tǒng)之 間,其功能與 PC 機(jī)上的 BIOS 相類似,主要完成硬件初始化并切換到相應(yīng)的操作 系統(tǒng)。BSP 是相對于操作系統(tǒng)而言的,不同的操作系統(tǒng)對應(yīng)于不同定義形式的 BSP 例如 VxWorks 的 BSP 和 Linux 的 BSP 相對于某一 CPU 來說,盡管實現(xiàn)的功 能一樣,可是寫法和接口定義是完全不同的。 另外,仔細(xì)研究所用的芯片資料也 十分重要

2、,例如盡管ARM 在內(nèi)核上兼容,但每家芯片都有自己的特色。所以這就 要求 BSP 程序員對硬件、軟件和操作系統(tǒng)都要有一定的了解。 本文介紹基于 ARM 體系的嵌入式應(yīng)用系統(tǒng)初始化部分 BSP 的程序設(shè)計。 本文引用的源碼全部是基于 HMS320C720 芯片設(shè)計,并已成功運(yùn)行。 1 初始化過程 盡管各種嵌入式應(yīng)用系統(tǒng)的結(jié)構(gòu)及功能差別很大,但其系統(tǒng)初始化部分 完成的操作有很大一部分是相似的。 嵌入式系統(tǒng)的啟動流程如圖 1 所示。 1.1 設(shè)置入口指針 啟動程序首先必須定義指針,而且整個應(yīng)用程序只有一個入口指針。一 般地,程序在編譯鏈接時將異常中斷向量表鏈接在 0 地址處,并且作為整個程序 入口點

3、。入口點代碼如下: ENTRY(_start);開始 1.2 設(shè)置異常中斷向量表 ARMg求中斷向量表必須放置在從 0 開始、連續(xù) 8X4字節(jié)的空間內(nèi)。各 異常中斷向量地址以及中斷的算是優(yōu)先級如表 1: 中斷向量地址 異常中斷類型 異常中斷模式 優(yōu)先級(6 最 低) 0 x0 復(fù)位 特權(quán)模式(SVC 1 0 x4 未定義中斷 未疋義指令中止模式 (Un def) 6 0 x8 軟件中斷(SW) 特權(quán)模式(SVC 6 0 x0c L 指令預(yù)取中止 中止模式 5 0 x10 數(shù)據(jù)訪問中止 L 中止模式 | 2 0 x14 保留 未使用 未使用 0 x18 外部中斷請求(IRQ) 外部中斷(IRQ)

4、模式 4 q 0 x1c 快速中斷請求(FIQ) 快速中斷(FIQ)模式 3 表 1 各異常中斷的中斷向量地址以及中斷的處理優(yōu) 先級 中斷向量地址 異常中斷類型 異常中斷模式 優(yōu)先級(6 最低) 0 x0 復(fù)位特權(quán)模式(SVC 1 0 x4 未定義中斷 未定義指令中止模式(Undef) 6 0 x8 軟件中斷(SW) 特權(quán)模式(SVC 6 0 x0c 指令預(yù)取中止 中止模式 5 0 x10 數(shù)據(jù)訪問中止 中止模式 2 0 x14 保留未使用未使用 0 x18 外部中斷請求(IRQ)外部中斷(IRQ)模式 4 0 x1c 快速中斷請求(FIQ)快速中斷(FIQ)模式 3 每當(dāng)一個中斷發(fā)生后,AR

5、Mi 理器便強(qiáng)制把程序計數(shù)器(PC 指針置為 向量表中對應(yīng)中斷類型的地址值。因為每個中斷向量僅占據(jù)放置 1 條 ARMt 令的 空間,所以通常放置 1 條跳轉(zhuǎn)指令或向程序計數(shù)器(PC 寄存器賦值的數(shù)據(jù)訪問 指令,使程序跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序執(zhí)行。 如果異常中斷處理程序起始 地址小于 32MB 使用 B 跳轉(zhuǎn)指令;如果跳轉(zhuǎn)范圍大于 32MB 使用 LDR 指令。 另外,對于各未用中斷,可使其指向一個只含返回指令的啞函數(shù), 以防 止錯誤中斷引起系統(tǒng)的混亂。 1.3 初始化存儲系統(tǒng) 初始化存儲系統(tǒng)的編程對象是系統(tǒng)的存儲器控制器,一個系統(tǒng)可能存在 多種存儲器類型的接口,不同的存儲系統(tǒng)的設(shè)計不盡相

6、同。 Flash 和 SRAM 同屬 于靜態(tài)存儲器類型,可以合用一個存儲器端口;而 DRAM 因為有動態(tài)刷新和地址 線復(fù)用等特性,通常配有專用的存儲器端口。其中, SDRA 必須在初始化階段進(jìn) 行設(shè)置,因為大部分的程序代碼和數(shù)據(jù)都要在 SDRA 中運(yùn)行。 在 HMS30C720 中,與 SDRAIM2 置有關(guān)的寄存器有 4 個:配置寄存器、 刷新定時寄存器、寫緩沖寫回寄存器和等待驅(qū)動寄存器,需要根據(jù)實際的系統(tǒng)設(shè) 計對此分別加以正確配置。 SDRAI 的初始化過程如下:加電一延遲 10ms(各具體 SDRA 器件延時時 間可能不同)f設(shè)置配置寄存器參數(shù)f延時f寫刷新定時寄存器, 設(shè)置刷新周期 f

7、延時f使能自動刷新f延時f設(shè)置模式寄存器(位于 SDRAM 內(nèi)部)。 1.4 存儲器地址分布重映射(remap)和 MMU 系統(tǒng)一上電,程序?qū)⒆詣訌?0 地址處開始執(zhí)行。因此,必須保證在 0 地址處存在正確的代碼,即要求 0 地址開始入是非易失性的 ROM 或 Flash 等。但 是因為 ROME Flash 的訪問速度相對較慢,每次中斷響應(yīng)發(fā)生后,都要從讀取 ROME Flash 上面的向量表開始,影響了中斷響應(yīng)速度。一般程序執(zhí)行后將 SDRAM 映射為地址 0,并把系統(tǒng)程序加載到 SDRA 中運(yùn)行,其具體步驟可以采用以下的 (1) 上電后,從 0 地址的 ROMT 始往下執(zhí)行; (2) 根

8、據(jù)映射前的地址,對 SDRAM!行必要的代碼和數(shù)據(jù)拷貝; (3) 拷貝完成后,進(jìn)行重映射操作; (4) 因為 RAM 在重映射前準(zhǔn)備好了內(nèi)容,使得 PC 指針能繼續(xù)在 RAM 里取得正確的指令。 在這種地址映射的變化過程中, 程序員需要仔細(xì)考慮的是: 程序的執(zhí)行 流程不能被這種變化所打斷,注意保證程序流程在重映射前后的承接關(guān)系。 存儲器的地址分配是很靈活的, 可以將 I/O 操作映射成內(nèi)存操作, 也可 以通過映射對某些不可訪問的地址空間進(jìn)行保護(hù)等。進(jìn)行存儲器初始化設(shè)計時, 一定要根據(jù)應(yīng)用程序的具體要求來完成地址分配。 對地址管理通過 MMU 卩存儲器 管理單元實現(xiàn)。 在 ARM 系統(tǒng)中,MM

9、通過頁式虛擬存儲管理,將虛擬空間和物理空間分 別分成一個個固定大小的頁, 并建立兩者之間的映射關(guān)系, 從而實現(xiàn)虛擬地址到 物理地址的轉(zhuǎn)換。MM 還可完成存儲器訪問權(quán)限的控制和虛擬存儲器空間緩沖特 性的設(shè)置。 以下是實現(xiàn) MMU 勺部分代碼: for=(i=1;i0 x1000;i+)pagetablei=(i20)|MMU_SECDESC; / 建立頁表,每頁大小為 1MB 頁表偏移序號是物理地址的高 12 位; for(addr=SDRAM_BASE;addr20=addr|MMU_SECDESE|MMU_CACHEABLE|MMU_BUFFER ABLE; / 將 SDRAM_BASE (

10、 SDRAM_BASE+SDRAM_S)空間的設(shè)置為不可 CACHE 口不可 BUFFER 勺 for (addr=SDRAM_BASE+SDRAM_SIZE/2;addr20=(addr+0 x1000000)|MMU_SECDESC|MMU_CACHEABLE |MMU_BUFFERABLE; /將這段空間的地址映射關(guān)系設(shè)置為 VA (虛擬地址)=PA(物理地址) +0 x1000000pagetable0=(0 x42f00000)|MMU_SECDESC|MMU_CACHEABLE|MMU_BUF FERABLE; /將 SDRAM5 虛擬地址 0 x42f00000 映射到 0 處

11、15 初始化各模式下的堆棧指針 因為 ARM 處理器有 7 種執(zhí)行狀態(tài),每一種狀態(tài)的堆棧指針寄存器(SP 都是獨(dú)立的(System 和 User 三項式使用相同 SP 寄存器)。因此,對程序中需 要用到的每一種模式都要給 SP 寄存器定義一個堆棧地址。 方法是改變狀態(tài)寄存器(CPSR 內(nèi)的狀態(tài)位,使處理器切換到不同的狀態(tài),然后 給 SP 賦值。這里列出的代碼定義了三種模式的 SP 指針,其中,l_Bit 表示 IRQ 的中斷禁止位;F_Bit 表示 FIQ 的中斷禁止位: ; Set up SVC stack to be 4K on top of zero-init data LDR r1,=

12、installStack ADdsp,r1,#2048 ;Set up IRQ and FIQ stacks MOV r0,#(Mode_IRQ32|I_Bit) MSRcpsr,r0 MOV r0,r0 ADdsp,r1,#2048*2 MOV r0,#(Mode_FIQ32|I_Bit |F_Bit) MSR cpsr,r0 MOV r0,r0 ADdsp,r1,#2048*3 一般堆棧的大小要根據(jù)需要而定,但是要盡可能給堆棧分配快速和高帶 寬的存儲器。堆棧性能的提高對系統(tǒng)性能的影響是非常明顯的。 1 6 初始化有特殊要求的端口、設(shè)備 有些關(guān)鍵的 I/O 部件必須在使能 IRQ 和 FIQ

13、 之前進(jìn)行初始化。因為如果 在使能 IRQ和 FIQ 之前沒有進(jìn)行初始化,可以產(chǎn)生假的異常中斷信號。程序中初 始化了 HMS30C720 的串口 1 用來調(diào)試程序與其它設(shè)備通信。串口 1 是一個通用 全雙工異步接收/發(fā)送器(UART,它支持 16C550 的大部分功能。UART 有接收 緩沖/發(fā)送保持寄存器、波特率除數(shù)鎖存器、中斷允許寄存器等 9 個寄存器。對 串口 1 的初始化主要是對各寄存器的設(shè)置,其實現(xiàn)代碼如下所示: _outb(ser_base+0 x30,1); _outw(0 x8002301c,0 xffff9f9f) ;GPIO PORT A Enable Register _

14、outw(0 x800230A4,0 x6060) ;GPIO PORT A MultiFunction elect-Register serial_outb(SERIAL_LCR,0 x80); serial_outb(SERIAL_LCR,0 x80); serial_outb(SERIAL_DLL,baud_datacur_baud); serial_outb(SERIAL_DLM,0 x0); serial_outb(SERIAL_LCR,0 x03); seial_outb(SERIAL_FCR,0 x01); serial_outb(SERIAL_IER,0 x00); seria

15、l_outb(SERIAL_MCR,0 x03); 1.7 切換處理器模式,開中斷 最后轉(zhuǎn)換到應(yīng)用程序運(yùn)行所需的最終模式, 一般是 User 模式。不要過早 切換到 User 模式進(jìn)行 User 模式的堆棧設(shè)備。因為進(jìn)入 User 模式后就不能再操 作 CPRS 回到別的模式了,可能會對接下去的程序執(zhí)行造成影響 這時才使能異常中斷,通過清除 CPRS 寄存器中的中斷禁止位實現(xiàn)。如果 過早地開中斷,在系統(tǒng)初始化之前就觸發(fā)了有效中斷,會導(dǎo)致系統(tǒng)的死機(jī)。 1 8 呼叫主應(yīng)用程序 當(dāng)所有的系統(tǒng)初始化工作完成后,就需要把程序流程轉(zhuǎn)入主應(yīng)用程序。 2 技術(shù)難點分析 2 1 多種語言的混合編程 ARM 有兩

16、種匯編指令集:16 位 THUM 指令集和 32 位 ARM 旨令集。使用 16 位的寄存器可以降低成本,而且 16 位 THUM 指令集整體執(zhí)行速度比 ARMB2 位指令集快,提高了代碼密度。 為了滿足 ARM子程序和Thumb子程序互相調(diào)用, 必須保證編寫的代碼遵循 ATPCS ATPCS 規(guī)定了子程序調(diào)用的基本規(guī)則。 ARM 系統(tǒng)結(jié)構(gòu)也支持 C C+以及匯編語言的混合編程。匯編語言和 C/C+ 語言的混合編程,在一個追求效率的程序中比較常見。 許多人認(rèn)為像 BSP 這樣底 層的程序應(yīng)該用純匯編語言編寫, 其實不然。用匯編語言編寫的程序可讀性不高, 而且不宜維護(hù),不便于向其它類型的 CPU

17、 移植,而這些方面卻是 C 語言程序的優(yōu) 勢。BSP 能否用純 C 語言去寫呢?也不行。因為某些操作是用 C 實現(xiàn)不了的。例 如操作特殊寄存器的指令、CP15 寄存器的指令、中斷使能及堆棧地址的設(shè)定等。 在匯編和 C/C+之間的函數(shù)調(diào)用時,也要遵循 ATPCS 勺定義,還要注意的是用 C 語言編寫嵌入式程序時,要避免使用不能被固化到 ROh 中的庫函數(shù)。 混合編程情況下的程序編譯及鏈接后的輸出代碼與沒有混合編程時是不 同的。 所以當(dāng)多個源文件如果使用了不同的設(shè)置進(jìn)行編譯, 相互之間的調(diào)用可能 產(chǎn)生兼容性問題, 對此一定要加以仔細(xì)考慮。 編譯時, 要告訴編譯器和鏈接器足 夠的信息,一方面,讓編譯器能夠使用正確的指令碼進(jìn)行編譯;另一方面,在不 同的狀態(tài)之間發(fā)生函數(shù)調(diào)用時,鏈接器將插入一段鏈接代碼( veneers )來實現(xiàn) 狀態(tài)轉(zhuǎn)換。 2 . 2 MMU 勺實現(xiàn)過程 頁表是實現(xiàn) MMU 勺重要手段。頁表存放在內(nèi)存中,從虛擬地址到物理地 址的變換過程其實就是查詢頁表的過程。大小為 1MB 的存儲塊通常被稱為段, 圖 2 說明了如何查表進(jìn)行段式尋址的全過程: 3

溫馨提示

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

最新文檔

評論

0/150

提交評論