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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于Mpc823e的bootloader分析和實現(xiàn)

          基于Mpc823e的bootloader分析和實現(xiàn)

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

          0 引言

          在嵌入式系統(tǒng)中,當(dāng)cpu啟動起來后,首先會在預(yù)先設(shè)置的地址上執(zhí)行,用來加載和啟動系統(tǒng)。通過,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。與硬件緊密結(jié)合,不同處理芯片體系,不同主板設(shè)計,對應(yīng)不同的引導(dǎo)程序。本系統(tǒng)采用ppcboot作為引導(dǎo)程序。ppcboot的功能強大,而且代碼公開。一般來說,它可以分為兩部分:與硬件相關(guān)的代碼,與硬件無關(guān)的代碼。在設(shè)計時,可以先從其官方網(wǎng)站下載完整的代碼,然后根據(jù)自己系統(tǒng)的特點,對與硬件相關(guān)代碼部分進行修改,最后進行編譯,燒入 Flash。接下來,將對ppcboot的工作流程和具體的修改過程進行討論

          1 ppcboot工作流程

          作為ppc體系的引導(dǎo)程序ppcboot上電后,將完成初始化硬件設(shè)備,建立內(nèi)存映射, 啟動系統(tǒng)內(nèi)核三個任務(wù)。

          初始化硬件設(shè)備:

          系統(tǒng)上電復(fù)位后,CPU首先從Flash 的0x100處執(zhí)行第一條指令。該指令跳轉(zhuǎn)到具體地址后,開始執(zhí)行部分初始化和真正初始化前的準(zhǔn)備工作:屏蔽所有的中斷,設(shè)置CPU的速度和時鐘頻率,禁止cache、禁止地址轉(zhuǎn)換等等。

          在這個階段中,執(zhí)行空間始終在Flash,功能通常都用匯編語言來實現(xiàn)。之后,系統(tǒng)開始建立內(nèi)存映射。

          建立內(nèi)存映射

          (1)設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存庫控制寄存器等,使CPU能夠正常運行起來并執(zhí)行C語言程序,并且為下一步加載引導(dǎo)程序,準(zhǔn)備RAM空間。

          (2)引導(dǎo)程序重新定位執(zhí)行空間,ppcboot代碼從flash拷貝到內(nèi)存,開始在內(nèi)存中執(zhí)行。

          (3)再次初始化部分硬件設(shè)備,并檢測系統(tǒng)內(nèi)存映射,知道 CPU 預(yù)留的全部 RAM 地址空間中的哪些被真正映射到 RAM 地址單元,哪些是處于無狀態(tài)的。經(jīng)過這個階段后,系統(tǒng)建立了內(nèi)存映射圖(見圖1),并開始在內(nèi)存里執(zhí)行程序,能夠執(zhí)行C語言程序。之后,系統(tǒng)進入啟動操作系統(tǒng)內(nèi)核階段。

          啟動操作系統(tǒng)內(nèi)核

          (1)把內(nèi)核映像和根文件系統(tǒng)映像從Flash上讀到RAM中。

          (2) 為內(nèi)核設(shè)置啟動參數(shù)。以標(biāo)記列表的形式來傳遞。

          (3)解壓內(nèi)核,初始化串口,使解壓后內(nèi)核獲得CPU的控制權(quán),結(jié)束ppcboot的任務(wù)。

          2 基于MPC823e的ppcboot的具體編寫

          在上面提過,由于ppcboot的代碼硬件無關(guān)部分是通用的,不需要修改。而硬件相關(guān)的代碼部分,與硬件緊密相關(guān),所以需要針對自己具體的硬件進行修改,主要是cpu部分與主板部分的代碼。

          2.1 ppcboot中cpu部分的開發(fā)

          ppcboot的一個任務(wù)是初始化CPU內(nèi)部寄存器,包括:定義中斷向量表、數(shù)據(jù)和指令cache的設(shè)置、內(nèi)存管理單元MMU的設(shè)置、系統(tǒng)接口單元SIU設(shè)置、內(nèi)存控制器和UPM表的設(shè)置、時鐘和復(fù)位寄存器設(shè)置、外部總線接口設(shè)置、與編譯器相關(guān)的堆棧設(shè)置等。

          步驟1: 禁止 中斷 -> 禁止cache -> 禁止MMU

          啟動過程中無法處理中斷,所以必須關(guān)閉中斷;另外,因內(nèi)存管理、cache尚未設(shè)置,所以應(yīng)先全部禁止,待設(shè)置完畢再打開。

          步驟2: 初始化內(nèi)存 init_memc

          MPC823e提供了強大的內(nèi)存接口控制單元,包括一個通用內(nèi)存接口單元GPCM和兩個用戶可編程內(nèi)存接口單元UPMA/UPMB。還提供了8個片選信號線與8片獨立的內(nèi)存接口。

          編寫ppcboot時,需要研究SDRAM芯片的時序圖,構(gòu)造出MPC823e特有的64個時序字,填入MPC823e內(nèi)部相應(yīng)的寄存器中。以后,每當(dāng)發(fā)出內(nèi)存訪問的指令時,硬件就能夠根據(jù)設(shè)置好的64個時序字,產(chǎn)生正確的讀寫時序。而且要針對具體的設(shè)計,編寫片選內(nèi)存的寄存器BRx和ORx來設(shè)置其屬性,包括定義內(nèi)存片基地址、地址掩碼、讀寫屬性、總線寬度(8位、16位、32位)、控制單元(使用GPCM或UPM)等。如本系統(tǒng)中,使用了CS0 控制16位的Flash存儲器、CS1控制32位的sdram,對CS1進行設(shè)置時應(yīng)設(shè)為基地址0x00000000,32位可讀寫,使用UPMA。

          步驟3:初始化系統(tǒng)接口單元init_SIU -> 初始化調(diào)試寄存器der -> 初始化時鐘 init_clk

          系統(tǒng)接口單元主要包含對MPC823e復(fù)用引腳的設(shè)置寄存器、調(diào)試寄存器(該寄存器可用來設(shè)置CPU在各種不同的意外情況下是否進入調(diào)試狀態(tài))。

          初始化時鐘主要是對CPU主頻的設(shè)置。MPC823e有一個倍頻率達(dá)數(shù)千倍的內(nèi)部倍頻器,本系統(tǒng)中,采用了5MHz的晶振,經(jīng)過10倍頻后穩(wěn)定運行在50MHz頻率上。


          上一頁 1 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); })();