<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于Intel PXA272的Bootloader的設(shè)計與實現(xiàn)

          基于Intel PXA272的Bootloader的設(shè)計與實現(xiàn)

          作者: 時間:2007-06-05 來源:網(wǎng)絡(luò) 收藏

          摘要:在嵌入式系統(tǒng)中,在完成引導(dǎo)加載系統(tǒng)鏡像的同時,擴(kuò)展和增加了具體硬件模塊上的功能支持,以方便開發(fā)人員進(jìn)行開發(fā)和調(diào)試。這篇文章在嵌入式處理器的一個硬件平臺上,了一個支持從SD卡加載系統(tǒng)鏡像并啟動系統(tǒng)的bootloader,并對其加載性能進(jìn)行測試和分析。
          關(guān)鍵詞,嵌入式處理器,WinCE操作系統(tǒng),SD卡

          1前言

          PC機(jī)中的引導(dǎo)程序一般由BIOS和位于MBR的OS (例如LILO或者GRUB)一起組成。然而在嵌入式系統(tǒng)中通常沒有像BIOS那樣的固件程序(有的嵌入式CPU有),因此整個系統(tǒng)的加載啟動任務(wù)就完全由Bootloader來完成。但是隨著嵌入式系統(tǒng)的發(fā)展,Bootloader已經(jīng)逐漸在基本功能的基礎(chǔ)上進(jìn)行了擴(kuò)展,Bootloader可以更多地增加對具體系統(tǒng)的板級支持,即增加一些硬件模塊功能上的使用支持,以方便開發(fā)人員進(jìn)行開發(fā)和調(diào)試。編寫B(tài)ootLoader是開發(fā)WinCE系統(tǒng)第一步,也是關(guān)鍵的一步。只有得到一個穩(wěn)定工作的Loader程序,才能夠更進(jìn)一步開發(fā)WinCE的BSP,直至最后整個系統(tǒng)的成功。【1】

          2硬件平臺結(jié)構(gòu)

          我們的硬件平臺采用PXA 272 作為處理器,工作頻率為512M HZ,內(nèi)部集成了64 M bytes NOR Flash。 PXA27X處理器是公司推出的32位,Xscale架構(gòu)的高性能的嵌入式芯片?!?】硬件平臺結(jié)構(gòu)中主要還包括了如下的主要器件:128 M SDRAM、AC97 codec、 LCD 控制器、IrDa芯片、藍(lán)牙UART、USB控制器。另外還集成了3.5肌240320 QVGA的TFT-LCD 觸摸屏、PCMCIA、SD/MMC等外設(shè)接口,WLAN模塊。

          Intel的PXA 27X內(nèi)部支持SD Host的控制模塊,有SD Host控制寄存器和可以用于SD Host控制器的IO引腳,可用編程的方法對其功能進(jìn)行選擇;但對于SD卡的檢測,寫保護(hù)和插槽的電源使能

          等功能沒有專門的引腳。在本文中,對于卡檢測、電源引腳,通過GPIO擴(kuò)展來。和SD卡硬件相關(guān)的部分引腳定義如表1所示:【3】【4】

          表1 PXA 272部分GPIO引腳功能定義

          信號

          方向

          Intel 272功能引腳

          說明

          SD_nPWREN

          輸入

          SDPWEN/GPB2

          SD插槽電源使能信號線

          SD_DATA3

          輸入/輸出

          SDDATA0/GPF5

          4bit模式:DATA3

          SD_DATA2

          輸入/輸出

          SDDATA0/GPF4

          4bit模式:DATA2

          SD_DATA1

          輸入/輸出

          SDDATA0/GPE5

          4bit模式:DATA1

          SD_DATA0

          輸入/輸出

          SDDATA0/GPG2

          4bit模式:DATA0

          SD_CMD

          輸入/輸出

          SDCMD/GPG1

          SD命令線

          SD_CLK

          輸入

          SDCLK/GPF3

          SDIO/SD卡時鐘線

          SD_nCD

          輸出

          EINT23/GPF1

          SD卡檢測引腳

          SD_WP

          輸出

          GPC3

          SD卡寫保護(hù)引腳

          3Bootloader的和實現(xiàn)

          一個嵌入式WinCE系統(tǒng)從軟件的角度看通常可以分為兩部分:Bootloader 和 Wince嵌入式系統(tǒng)。從Bootloader和Wince嵌入式系統(tǒng)的關(guān)系看,Bootloader包含兩種不同的操作模式:“本地啟動”模式和“下載啟動”模式?!?】在本地啟動模式下Bootloader從Flash上將Wince操作系統(tǒng)加載到RAM中運行。在下載啟動模式下,目標(biāo)機(jī)上的Bootloader將通過串口或者網(wǎng)絡(luò)連接或者USB等從主機(jī)下載操作系統(tǒng)文件,也可以直接從SD/MMC卡、CF卡上加載操作系統(tǒng)鏡像文件。在下載啟動模式下,Bootloader通過串口給用戶提供簡單的命令行接口。

          3.1Bootloader的流程

          當(dāng)系統(tǒng)上電后,ARM CPU會從物理地址零處開始執(zhí)行第一條指令的執(zhí)行,通常會在該地址處放置一條跳轉(zhuǎn)指令。在我們的硬件平臺中物理地址零是64M Flash的物理起始地址。這里值得需要說明的是64M Flash 是固化在Intel PXA 272中的。所以我們的Bootloader燒入也必須從Flash的物理地址零開始。Bootloader二進(jìn)制文件的最前面的4個字節(jié)就是一條跳轉(zhuǎn)指令。

          圖1 Bootloader 流程圖

          接著系統(tǒng)會跳轉(zhuǎn)到一段用ARM匯編編寫的代碼中去執(zhí)行。其作用是完成系統(tǒng)啟動所必須的最小配置,例如配置cpu的工作頻率,配置GPIO,配置時鐘等。然后為我們處理器的工作模式設(shè)置棧指針。

          接著把Bootloader從Flash搬運到SDRAM中,配置MMU,創(chuàng)建頁表,使能MMU,然后把自己后半部重定位到SDRAM中去執(zhí)行。在后半部的執(zhí)行中會根據(jù)用戶做的動作(是否按住一個按鈕)來判斷是要本地啟動還是下載啟動。具體的流程圖如圖1所示。

          當(dāng)用戶選擇特定下載啟動方式后,就進(jìn)入具體的下載流程。首先需要對用戶選定的介質(zhì)的硬件進(jìn)行必要的初始化。之前做的一些硬件的初始化是不夠的,因為沒必要在前面進(jìn)行全面的硬件初始化,現(xiàn)在要具體使用了就需要進(jìn)行具體的配置。

          3.2軟件實現(xiàn)的關(guān)鍵

          Bootloader是依賴于硬件而實現(xiàn)的,特別是在嵌入式系統(tǒng)中。不同的體系結(jié)構(gòu)需求的Bootloader是不同的;除了體系結(jié)構(gòu),Bootloader還依賴于具體的嵌入式板級設(shè)備的配置。所以根據(jù)不同的板級配置需要修改相應(yīng)的Bootloader。【5】我們使用的bootloader是Microsoft提供的和Wince配套的Eboot。下面幾點是在我們的硬件平臺上修改Eboot的關(guān)鍵。

          3.2.1配置內(nèi)存映射表

          WinCE嵌入式系統(tǒng)通過定義OEMAddressTable來定義虛擬內(nèi)存到物理內(nèi)存的映射表.這個表在我們的實現(xiàn)中是bootloader和WinCE系統(tǒng)公用的?!?】當(dāng)然這不是強(qiáng)制性的.我們需要根據(jù)硬件平臺的不同定制自己的映射表。在我們的中,這個表把4GB的物理空間映射到512M的內(nèi)核虛擬空間。

          表中的每一項由虛擬地址,物理地址,和映射的M數(shù)組成。其格式如下所示

          OEMAddressTable

          DCD SDRAM_BASE_C_VIRTUAL, SDRAM_BASE_PHYSICAL, 64

          DCD SDRAM1_BASE_C_VIRTUAL, SDRAM1_BASE_PHYSICAL, 64

          DCD IM_STORAGE_BASE_C_VIRTUAL, IM_STORAGE_BASE_PHYSICAL, 1

          .....

          DCD 0x00000000, 0x00000000, 0

          第一項和第二項分別使64M的虛擬地址映射到64M物理地址,因為我們采用兩條64M的SDRAM。第二項使1M的內(nèi)部內(nèi)存的虛擬地址映射到物理地址,因為我們使用1M大小的內(nèi)部存儲。最后一項必須是零,因為建立頁表的時候程序通過它來判斷是否結(jié)束映射過程。在配置MMU的時候會使用這個表來完成虛擬地址到物理地址的映射的頁表的建立。

          3.2.2 為中斷模式設(shè)置分配堆棧

          我們知道ARM的堆棧是分模式的,在程序中要為每種要用到的模式分配堆棧。如果沒有為某種模式分配堆棧,那么在進(jìn)入這種模式之后系統(tǒng)不能繼續(xù)運行了。系統(tǒng)首先運行在SVC模式。在下載模式中,我們要通過USB ,網(wǎng)絡(luò),SD/MMC和CF接口等下載文件,而這些都要用到中斷。所以我們要為中斷模式分配堆棧,其代碼片段如下:

          ldr r2, =(Mode_IRQ :OR: NoIntsMask) ;中斷模式

          msr cpsr_c,r2

          ldr sp,=(EBOOT_IRQ_STACK_TOP+SDRAM_VIR_C_EBOOT_PARTITION) ;分配堆棧

          在為中斷模式分配堆棧之后,還要進(jìn)行堆棧切換,使程序重新回到SVC模式運行。

          3.2.3 通過SD卡加載系統(tǒng)鏡像的實現(xiàn)

          當(dāng)用戶選取SD卡作為下載系統(tǒng)鏡像的目標(biāo)后,bootloader就進(jìn)入對SD處理的流程。首先通過SD卡檢測引腳判斷是否有SD卡插在插槽。如果有就要對SD控制的硬件進(jìn)行初始化,例如SD插槽電源使能,設(shè)置時鐘,設(shè)置功能GPIO等。

          其中需要說明的是Intel PXA 272的時鐘管理比較復(fù)雜,它有兩個鎖相環(huán)路PLL:外圍設(shè)備鎖相環(huán)路,核心鎖相環(huán)路。其中外圍設(shè)備鎖相環(huán)路為外圍總線和USBC,I2S接口,SD接口等外圍設(shè)備提供時鐘。在時鐘控管理寄存器里,寄存器CKEN用來控制如USB,UART,SD等接口模塊的時鐘使能?!?】

          接著是對SD卡協(xié)議棧的軟件實現(xiàn).為了減少Bootloader中SD Host驅(qū)動的復(fù)雜性,能夠易于調(diào)試,實現(xiàn)了總線驅(qū)動模塊,客戶端驅(qū)動模塊和FAT16文件系統(tǒng)模塊。所以在我們的實現(xiàn)中對SD卡上的文件系統(tǒng)要有一定的限制,必須是格式化成FAT16的文件系統(tǒng)才能被我們的bootloader識別。當(dāng)然在具體的實現(xiàn)中我們還可以使用另外的文件系統(tǒng)格式。其協(xié)議棧結(jié)構(gòu)如圖2所示:

          圖2 SD卡協(xié)議棧結(jié)構(gòu)

          3.3實驗結(jié)果

          我們使用一個22.7M的WinCE鏡像,在Bootloader中分別用USB,SD卡,TFTP,本地四種方式使用進(jìn)行加載啟動測試,分別測試了50次。因為在Bootloader中SD Host的實現(xiàn)沒有使用DMA方式,為了進(jìn)行性能比較,我們又調(diào)用WinCE系統(tǒng)下使用DMA的SD Host驅(qū)動加載同樣大小的文件進(jìn)行了50次測試。表2是我們測試的結(jié)果。表中數(shù)據(jù)為平均值。
          表2 測試結(jié)果

          SD卡

          USB

          TFTP

          使用DMA的SD

          本地啟動

          加載時間(秒)

          51

          96

          53

          28

          3

          從表中數(shù)據(jù)可知,本地啟動是最快的,這是不容置疑的。其次是通過SD卡啟動。另外值得說明的是,通過USB和TFTP下載啟動在都需要的在通信的另一端軟件的支持和用戶的介入操作。而SD卡的數(shù)據(jù)通信傳輸完全由硬件實現(xiàn),這也是SD卡加載相對比較快的主要原因。而且使用TFTP下載還需要進(jìn)行相對復(fù)雜的配置。而在使用SD的加載中Bootloader會自動去搜尋系統(tǒng)鏡像,自動下載。這對用戶的使用來說是方便快捷的。

          另外從使用DMA的SD 驅(qū)動下載文件和Bootloader中的實現(xiàn)做比較,可以看出使用DMA后大大提高了使用SD下載的性能。當(dāng)然我們也可以在Bootloader中使用DMA方式來實現(xiàn)以提高性能。但這樣一來會大大增加Bootloader的復(fù)雜性。我們在Bootloader中實現(xiàn)使用SD做加載啟動的主要目的是方便開發(fā)和調(diào)試SD硬件模塊,而且實際使用中絕大部分會是本地啟動。我們的實現(xiàn)中目的已經(jīng)達(dá)到,所以可以不考慮這些。

          4 結(jié)束語

          Bootloader是操作系統(tǒng)和硬件的樞紐,相對于操作系統(tǒng)內(nèi)核來說它是一個硬件抽象層。嵌入式領(lǐng)域中操作系統(tǒng)的移植關(guān)鍵在于Bootloader的移植和操作系統(tǒng)內(nèi)核硬件相關(guān)部分移植。所設(shè)計并實現(xiàn)的Intel PXA 272嵌入式處理器的從SD卡加載并啟動WinCE系統(tǒng)的Bootloader能提高WinCE操作系統(tǒng)移植的穩(wěn)定性并加快WinCE操作系統(tǒng)移植的周期。

          本文作者創(chuàng)新點: 在基于Intel PXA 272 處理器的bootloader中實現(xiàn)了SD卡的協(xié)議棧,并實現(xiàn)了從SD卡加載并啟動WinCE嵌入式系統(tǒng)鏡像的功能.

          參考文獻(xiàn):
          【1】杜春雷.ARM體系結(jié)構(gòu)與編程.北京:清華大學(xué)出版社,2004-12
          【2】Intel PXA 27X Processor Family Developer's Manual[M]. Intel, 2004-04
          【3】Jörg Henkel, Xiaobo Sharon Hu, Shuvra S. Bhattacharyya. Taking on the Embedded System Design Challenge[J], IEEE Computer (4): 35-37 (2003)【4】SD-Memory Card Specifications /Part1 Physical Layer Specification Version 1.01[M]. SD Group, 2001
          【5】陳向群王雷 馬洪兵.Windows.CE.NET 系統(tǒng)分析及實驗教程.北京:機(jī)械工業(yè)出版社,2003
          【6】萬永波 張根寶 田澤 楊峰. 基于ARM的嵌入式系統(tǒng)Bootloader啟動流程分析.微計算機(jī)信息. 2005年第11-2期.第一頁



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();